程式和執行緒的區別(Linux)
程式和執行緒的區別是很常見的面試題,網上雖然隨意就可以百度到,但是大多都是直接從理論上進行解釋,很少有從作業系統的實現方面進行解釋,筆者此篇以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,程式狀態等)
一般的程式
一個程式必然只對應著一個程式描述符。
同一個程式中的多個執行緒
這些執行緒所以對應的是同一個程式描述符。
通過同一個程式中多個執行緒指向同一個程式描述符,實現了執行緒間的資源共享。
相關文章
- Linux中執行緒和程式的區別Linux執行緒
- 執行緒和程式的區別執行緒
- 程式和執行緒的區別執行緒
- Linux執行緒與程式的區別Linux執行緒
- Linux程式與執行緒的區別Linux執行緒
- Linux中程式與程式、執行緒的區別!Linux執行緒
- 「Learning」區別執行緒和程式執行緒
- 程式和執行緒的區別與聯絡執行緒
- java架構-執行緒和程式的區別Java架構執行緒
- 轉載_Linux程式與執行緒的區別Linux執行緒
- 程式與執行緒的區別執行緒
- 【面試】執行緒程式區別面試執行緒
- 程式與執行緒區別執行緒
- php中的執行緒、程式和併發區別PHP執行緒
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- 多執行緒和多程式的區別(小結)執行緒
- Linux中程式與執行緒的概念以及區別Linux執行緒
- Java程式和執行緒關係及區別Java執行緒
- 如何查詢一個程式下面的執行緒數(程式和執行緒區別)執行緒
- 程式、執行緒和協程之間的區別和聯絡執行緒
- Linux中程式和執行緒的區別與聯絡,建議收藏!Linux執行緒
- 程式、執行緒、纖程之間的區別?執行緒
- Java 執行緒和作業系統的執行緒有啥區別?Java執行緒作業系統
- Java多執行緒--併發和並行的區別Java執行緒並行
- 執行緒與程式之間有什麼關係?Linux執行緒與程式有什麼區別?執行緒Linux
- 程式和執行緒有什麼區別?(Process and Threads)程式之間和執行緒之間是如何通訊的?執行緒thread
- 對程式、執行緒和協程的理解以及它們的區別執行緒
- 多執行緒-程式和執行緒的概述執行緒
- Java執行緒面試題(04) Java中程式與執行緒的真實區別Java執行緒面試題
- java執行緒系列---Runnable和Thread的區別Java執行緒thread
- 執行緒狀態&&Wait和sleep的區別?執行緒AI
- PHP的執行緒安全與非執行緒安全版本的區別PHP執行緒
- 程序、執行緒和協程之間的區別和聯絡執行緒
- 程序、執行緒、協程的區別執行緒
- Introduction to processes and threads(執行緒與程式的區別)thread執行緒
- JDK內建執行緒池的共同點和區別JDK執行緒
- 執行緒 並行 與 併發 的區別執行緒並行