1. 為什麼要有線程 我們知道一個集成應用場景需要多個進程同時調度執行各自的功能,那麼多進程的本質就是產生多個執行流,每個執行流執行不同的代碼和功能,但是一個進程由PCB(task_struct)、進程地址空間、頁表、文件描述符表等資源組成,是一個資源集合,創建的開銷較大,那麼為了滿足用戶的多執行流 ...
1. 為什麼要有線程
我們知道一個集成應用場景需要多個進程同時調度執行各自的功能,那麼多進程的本質就是產生多個執行流,每個執行流執行不同的代碼和功能,但是一個進程由PCB(task_struct)、進程地址空間、頁表、文件描述符表等資源組成,是一個資源集合,創建的開銷較大,那麼為了滿足用戶的多執行流的需求的同時又降低開銷,線程就因此誕生,一個進程可以有多個線程,同一個進程的線程共用同一份資源(進程地址空間、頁表等)。
2. 線程是什麼
在一個程式里的一個執行路線就叫做線程(thread)。更準確的定義是:線程是“一個進程內部的控制序列”。
認識線程,我們需要重新定義進程,我們對進程的粗淺認知是進程 = PCB + 進程資源,但是我們一般認為一個進程只有一個PCB,是因為我們的程式一般都是單線程執行流,而多線程執行流就是有多個PCB指向同一份資源(進程地址空間、頁表等)。
2.1 線程的理解
線程是CPU調度的基本單位,如果一個進程有多個線程,那麼OS肯定要對其進行管理、運行、終止等操作,如何管理——先描述,再組織。
Linux的設計者認為,進程和線程都是執行流,具有極度的相似性,沒必要單獨設計數據結構,因為一旦設計新的數據結構,就必然要設計配套的介面,編程難度增大,代碼的維護也會更難,因此設計者想出直接採用PCB描述線程,復用以前描述進程的代碼,來模擬線程,因此每一個PCB就對應一個線程,我們以前認識的進程就是特殊的一種形式——單線程進程(只有一個PCB)。
2.2 線程和進程之間的關係
將記憶體資源形象的表示為國家,進程表示一個個家庭,而線程就比作一個家庭中的一個個成員,每個成員都在併發地執行各自的工作,共用同一份家庭資源(房子、汽車等等),都是在為這個家庭生活所努力。