在學習操做系統的過程當中,"進程"、"線程"概念其實很模糊。不一樣的上下文中,該名稱指代的概念極可能是不一樣的,概念的不清晰爲學習和溝通帶來障礙,因此,在最開始咱們先對齊概念。html
不少書籍、文章裏會這樣來定義進程和線程:linux
其實這樣的描述依然是不夠具體的。segmentfault
一個執行中的程序,實際上是由一組資源和(一個或者多個)執行實體組成的,每一個執行實體須要本身執行過程當中所必須的獨有資源,全部的執行實體共享可共享資源。
這裏的執行實體,就是線程;這裏的執行實體和共享資源,就是進程。多線程
(用戶)虛擬地址空間函數
信號相關佈局
上述的全部資源中,加粗標記的爲每一個線程中獨有的資源,未加粗的爲全部線程共享的資源。學習
關於虛擬地址空間,這裏有張圖比較方便咱們理解。這張圖的詳細解釋spa
不少文章中會提到如下幾個東西:操作系統
計數器和寄存器.net
寄存器
這其中,進程關係在 Linux 中實際上是使用獨立的結構體進行存儲的,經過內核提供的方法來獲取,本質上不該該算是某種資源。其主體是內核 task_struct,後續咱們會展開詳細描述。
而計數器和寄存器是體系結構相關的硬件實現,處於執行中的執行實體(線程)會使用這些硬件,因此也不能算是某種資源。
該段落拓展閱讀:
Linux 只有一個結構體來描述進程/線程—— task_struct,該文件位於 /linux/include/linux/sched.h
。
這一結構體中有字段指向/描述相關資源和相互之間的關係,於是,該結構體更應該認爲是一個「線程結構體」,而「線程結構體」上的這些對於相關資源和相互之間關係的描述,則構成了「進程」。
後面的筆記中會有對 task_struct 結構體的詳細分析。