程式和執行緒的區別(Linux)

許佳佳233發表於2017-10-16

程式和執行緒的區別是很常見的面試題,網上雖然隨意就可以百度到,但是大多都是直接從理論上進行解釋,很少有從作業系統的實現方面進行解釋,筆者此篇以linux系統為例,做一個程式和執行緒筆記。

一般概念

程式:
是作業系統分配和管理資源的最基本單位。
執行緒:
是程式中的單一順序流。

兩者設計初衷

程式:
提高了CPU的使用效率。
比如印表機列印東西的同時還可以打遊戲,因為打遊戲和印表機是兩個不同的併發程式。

執行緒:
執行緒之間資源共享,減少了IPC資源的消耗。

linux中的實現

在linux中,執行緒只是一種特殊的程式。執行緒和程式的唯一區別就是執行緒間資源共享,而程式間資源獨立。

程式執行緒建立程式碼比較

眾所周知,在linux中是通過fork()進行程式的建立的,而fork()本身是由clone()實現的。
fork()的實現為:

clone(SIGCHLD,0);

而執行緒建立的clone程式碼如下:

clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0);

clone引數的對應作用如下:
CLONE_VM:父子程式共享地址空間
CLONE_FS:父子程式共享檔案系統資訊
CLONE_FILES:父子程式共享開啟的檔案
CLONE_SIGHAND:父子程式共享訊號處理函式及被阻斷的訊號

可以看到,程式和執行緒建立的唯一區別就是執行緒共享了父子程式之間的各種資源,如此操作,那麼建立出的父程式和被建立出的子程式就是我們通常意義上所講的執行緒。

程式描述符上的表現

linux核心把程式的所有資訊以雙向連結串列的形式儲存在任務佇列中。其中的每一個節點便稱作程式描述符,每一個程式描述符包含一個程式的所有資訊。(比如PID,程式狀態等)

一般的程式
一個程式必然只對應著一個程式描述符。

同一個程式中的多個執行緒
這些執行緒所以對應的是同一個程式描述符。
通過同一個程式中多個執行緒指向同一個程式描述符,實現了執行緒間的資源共享。

相關文章