總結:進程和線程的區別


首先呢,進程是系統進行資源分配和調度的一個獨立單位,線程呢就是進程內部的一條執行序列是CPU調度和分派的基本單位,線程的執行呢必須依賴於進程,一個進程內部至少有一條線程,main主函數的執行序列爲主線程 ,我們可以通過線程庫創建線程。


其次呢,進程有四個要素:
其一,必須有一段程序供其執行
其二,有專用的系統堆棧空間
其三,在內核中有一個task_struct結構體,也就是進程控制塊,用來記錄進程所佔的各項資源
其四,除了專用的系統堆棧空間外,進程還擁有專有的用戶空間,每啓動一個進程,系統就會爲它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段。

如果具備前三條缺少第四條,那麼就是一個線程,也就是線程沒有自己專有的用戶空間,一個進程中的全部線程是共享進程中的全局數據,堆區數據,以及進程PCB中的資源,線程只有自己的進程棧和寄存器變量,因此,線程之間的通信更方便,而且CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多,對於一些要求同時執行,而且又要共享某些變量的併發操作,就應該使用線程。


但是多進程程序更健壯,多線程程序只要有一個線程奔潰,整個進程也就奔潰了,而一個進程奔潰並不會對另外一個進程造成影響,因爲進程有自己獨立的地址空間。

其實呢linux 系統中,進程和線程的區別也不是特別嚴格,因爲在linux系統中,許多進程在創建之初,都與其父進程共用一個存儲空間,所以嚴格上來說,還是一個線程,但是子進程可以建立自己的存儲空間,和父進程分離開來執行,成爲真正意義上的進程,而且線程也有pid,也有task_struct結構,

Linux系統運行時的


第一個進程是在開機初始化階段“創造”出來的,而此後的進程或線程都是由一個已經存在的進程像細胞分裂一樣通過do_fork()系統調用創造出來的。
Linux 系統對進程和線程的並不區分,線程只不過是一種特殊的進程。


說說進程裏面都有什麼信息?

進程裏面除了最基本的task_struct 結構體和 系統堆棧 之外,還有進程擁有的用戶空間,因此,就要有用於虛存管理的mm_struct結構,以及下屬的 vm_area_struct 結構,以及相應的頁面目錄 和 頁面表,這些信息都是記錄在task_struct中,也就是在PCB中。

進程不僅僅侷限於一段可執行的代碼,它還包含了許多其他資源,像打開的文件,信號、內核內部數據、處理器狀態、地址空間、以及一個或多個執行線程,以及存放全局變量的數據段等。程序本身不是進程,進程就是一個處於執行狀態的程序以及它所包含的資源的總稱。

進程的組織方式?
內核把進程存放在叫做任務隊列(task list)的雙向循環鏈表中。鏈表中的每一項都是一個task_struct(進程描述符)結構
task_struct 相對比較大,在32位機器上,大約有1.7 KB
進程描述符中包含的數據能完整的描述一個正在執行的程序。

未完:最近在找工作,準備把自己知道的一些東西總結在博客裏,接下來會有更詳細的總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章