多線程
- 線程概念
- 線程控制
- 線程安全
- 線程基本應用
線程概念
功能:進行多任務處理
一個進程能夠完成任務的處理,通過pcb的描述,完成對程序的調度處理。
多任務處理:
- 多創建幾個進程,一個進程就有一個pcb,能夠串行化的完成一個任務;
- 在一個進程中多創建幾個pcb,因爲pcb是調度程序運行的描述,因此有多少個pcb就有多少個執行流程。
在進程中,我們說進程就是一個pcb,是程序動態運行的描述,通過pcb可以實現操作系統對程序運行的調度管理。現在學習的多線程,我們說線程是進程中的一條執行流,這個執行流在Linux下是通過pcb實現的,因此實際上Linux下的線程就是一個pcb,然而pcb是進程,並且Linux下的pcb共用一個虛擬地址空間,相較於傳統pcb更加輕量化,因此也被稱爲輕量級進程。
示例:
多進程
多線程
Linux下的進程其實是一個線程組,一個進程中可以有多個線程(多個pcb),編程是進程中的一條執行流。(進程(一個工廠),線程(工廠中幹活的工人),在Linux下幹活的就是pcb)。
進程:是一個程序動態的運行,其實就是一個程序運行的描述 - - - pcb。
線程:是進程中的一條執行流,執行一個程序中的某段代碼。
在Linux下pcb可以實現程序的調度運行,因此在實現線程的時候,使用了pcb來實現;創建線程會伴隨在內核中創建一個pcb來實現程序的調度,作爲進程中的一條執行流。進程就是多個線程的一個合集,並且這個進程中的所有pcb共用進程中的大部分資源(程序運行時,操作系統爲程序運行所分配的所有資源),因此這些pcb在Linux下又稱爲輕量級進程。
根據不同學習階段,對pcb有不同的理解
- 第一階段:pcb是進程,用於調度一個程序運行;
- 第二階段:pcb是線程,是輕量級進程(爲了跟印象中的傳統進程進行區分),因爲線程是運行中程序的一條執行流,Linux下通過pcb實現這個執行流,並且共用同一份運行資源。
進程是操作系統資源分配的基本單位;(操作系統會爲一個程序的的運行分配所需的所有資源)
線程是cpu調度的基本單位
線程之間的獨有與共享
- 獨有:標識符、寄存器、棧、信號屏蔽字、errno(系統調用完畢後會重置一個全局變量)、優先級。
- 共享:虛擬地址空間(代碼段/數據段)、文件描述符表、信號處理的回調函數、用戶ID/組ID/工作路徑。
多線程/多進程進行多任務處理的優缺點分析
多線程的優點:
- 線程間通信更加靈活方便;(除了進程間通信方式之外還有全局變量以及函數傳參 - - - 共有同一個虛擬地址空間,只要知道地址就能訪問同一塊空間);
- 線程的創建和銷燬成本更低(創建線程創建一個pcb,共用的數據只需要使用一個指針指向同一處就可以了);
- 同一個進程中的線程間調度成本更低(調度切換需要切換頁表);
多進程的優點:
- 多進程的健壯性,穩定性更高(異常以及一些系統調用(如:exit)直接針對整個進程生效);
共同的優點:
- IO密集型程序:多任務並行處理(多磁盤可以實現同時處理);
(IO密集型:程序中大量進行IO操作,對cpu要求並不高,因此執行流個數沒有太大要求); - CPU密集型程序:程序中進行大量的數據運算處理;cpu資源足夠,就可以同時處理,提高效率(通常執行流的個數是cpu核心數+1),創建線程很多的話,而cpu資源不夠多,會造成進程切換調度成本提高。