1. 線程
有的進程可能需要同時做很多事事格,而傳統(tǒng)的進程只能串行地執(zhí)行一系列程序终娃,為此引入了線程概念來增加并發(fā)度
傳統(tǒng)的進程是程序執(zhí)行流的最小單位恨憎,引入線程之后钥组,線程成為了程序執(zhí)行流的最小單位
可以把線程理解為輕量級線程郎逃,線程是一個基本的CPU執(zhí)行單元探赫,也是程序執(zhí)行流的最小單位搁嗓。引入線程之后棍矛,不僅是進程之間可以并發(fā),進程內(nèi)的各線程之間也可以并發(fā)潘拨,從而進一步提升了系統(tǒng)的并發(fā)度癣蟋,使得一個進程內(nèi)也可以并發(fā)處理各種任務。
引入線程之后雁社,進程只作為除了CPU之外的系統(tǒng)資源的分配單元。
1.1 引入線程機制后帶來的變化
1.2 線程的屬性
- 線程是處理機調(diào)度的單位
- 多CPU計算機種不脯,各個線程可以占用不同的CPU
- 每個線程都有一個線程ID是整、線程控制塊TCB
- 線程也有就緒、阻塞供炼、運行三種基本狀態(tài)
- 線程幾乎不擁有系統(tǒng)資源
- 同一個進程的不同線程間共享進程的資源
- 由于共享內(nèi)存地址空間弟翘,同一進程種的線程間的通信甚至無需系統(tǒng)干預
- 同一進程中的線程切換,不會引起進程切換
- 不同進程中的線程切換,會引起進程切換
- 切換同進程內(nèi)的線程要出,系統(tǒng)開銷很小
- 切換進程沼溜,系統(tǒng)開銷很大
2. 線程的實現(xiàn)方式
2.1 用戶級線程 —— User Level Thread, ULT
歷史背景:早期的OS只支持進程否淤,不支持線程助泽,當時的線程是由線程庫實現(xiàn)的
- 用戶級線程由應用程序通過線程庫實現(xiàn),所有的線程管理工作都由應用程序負責(包括線程切換)
- 用戶級線程中蚓曼,線程切換可以在用戶態(tài)下即可完成其弊,無需操作系統(tǒng)干預
- 在用戶看來,并意識不到線程的存在哑梳,用戶級線程就是從用戶視角能看到的線程
- 優(yōu)點:用戶級線程的切換在用戶空間即可完成路操,不需要切換到核心態(tài),線程管理的系統(tǒng)開銷小垫桂,效率高
- 缺點:當一個用戶級線程被阻塞后诬滩,整個進程都會被阻塞,并發(fā)度不高后控,多個線程不可在多核處理機上并發(fā)運行
2.2 內(nèi)核級線程 —— Kernel Level Thread, KLT
- 內(nèi)核級線程的管理工作由操作系統(tǒng)內(nèi)核完成
- 線程調(diào)度浩淘、切換等工作都由內(nèi)核負責吴攒,因此內(nèi)核級線程的切換必然需要在核心態(tài)下才能完成
- 操作系統(tǒng)會為每個內(nèi)核級線程建立相應的TCB洼怔,通過TCB對線程進行管理。內(nèi)核級線程就是從OS內(nèi)核角度能看到的線程
- 優(yōu)點:當一個線程被阻塞后极谊,別的線程可以繼續(xù)運行安岂,并發(fā)能力強嗜闻,多線程可以在多核處理機上并行執(zhí)行
- 缺點:一個用戶進程會占用多核內(nèi)核級線程桅锄,線程切換由操作系統(tǒng)內(nèi)核完成样眠,需要切換到核心態(tài)檐束,因此線程管理的成本高束倍,開銷大
小結:
用戶級線程是代碼邏輯的載體,內(nèi)核級線程是運行機會的載體甥桂,內(nèi)核級線程才是處理機分配的單位邮旷。一段代碼邏輯只有獲得了運行機會才能被CPU執(zhí)行
3. 多線程模型
3.1 一對一模型
一個用戶級線程映射到一個內(nèi)核級線程办陷,每個用戶進程有用戶級線程同數(shù)量的內(nèi)核級線程律歼。
- 優(yōu)點:當一個線程被阻塞后,別的線程還可以繼續(xù)執(zhí)行制圈,并發(fā)能力強离唐。多線程可以在多核CPU上并行執(zhí)行亥鬓。
- 缺點:一個用戶進程會占用多個內(nèi)核級線程,線程切換由OS內(nèi)核完成嵌戈,需要切換到核心態(tài)熟呛,因此線程管理的成本高庵朝,開銷大。
3.2 多對一模型
多個用戶級線程映射到一個內(nèi)核級線程椎瘟,且一個進程只被分配一個內(nèi)核級進程
- 優(yōu)點:用戶級線程切換在用戶空間即可完成肺蔚,不需要切換到核心態(tài)宣羊,線程管理的系統(tǒng)開銷小仇冯,效率高
- 缺點:當一個用戶級線程被阻塞后赞枕,整個進程都被阻塞,并發(fā)度不高炕婶,多個線程不可以在多核CPU上并行運行
重點:操作系統(tǒng)只看得見內(nèi)核級線程柠掂,因此只有內(nèi)核級線程才是CPU分配的單位
3.3 多對多模型
n個用戶級線程映射到 m 個內(nèi)核級線程(n >= m)依沮,每個用戶進程對應 m 個內(nèi)核 級線程危喉。 克服了多對一模型并發(fā)度不高的缺點(一個阻塞全體阻塞),又克服了一對一模型中一個用線程庫戶進程占用太多內(nèi)核級線程皇拣,開銷太大的缺點薄嫡。