線程概念 多線程模型


線程概念 多線程模型

Snipaste_2020-10-30_10-31-37

什么是線程,為什么要引入線程?

還沒引入進程之間,系統中各個程序只能串行執行。

Snipaste_2020-10-30_10-33-01

進程是程序性的一次執行,但是這寫功能顯然不可能是由一個程序順序處理就能實現的。

有的進程可能需要“同時”做很多事,而傳統的進程只能串行地執行一系列程序。為此,引入了“線程”,來增加並發度。

Snipaste_2020-10-30_10-34-50

傳統的進程是程序執行流的最小單位

引入線程后,線程成為了程序執行流的最小單位

線程是一個基本的CPU執行單元,也是程序執行流的最小單位

引入線程之后,不僅是進程之間可以並發,進程內的各線程之間也可以並發,從而進一步提升了系統的並發度,使得一個進程內也可以並發處理各種任務。

引入線程后,進程只作為除CPU之外的系統資源的分配單元。

Snipaste_2020-10-30_10-45-35 Snipaste_2020-10-30_10-48-08

線程的實現方式

用戶級線程

用戶級線程由應用程序通過線程庫實現。

所有的線程管理工作都由應用程序負責(包括線程切換)

用戶級線程中,線程切換可以在用戶態下即可完成,無需操作系統干預。

在用戶看來,是有多個線程。但是在操作系統內核看來,並意味不到線程的存在。(用戶級線程對用戶不透明,對操作系統透明)

Snipaste_2020-10-30_10-54-51

可以這樣理解,“用戶級線程”就是“從用戶的視角可以看到的線程”。

內核級線程

內核級線程的管理工作由操作系統內核完成。線程調度、切換等工作都由內核負責,因此內核級線程的切換必然需要在核心態下才能完成。

可以這樣理解,“內核級線程”就是“從操作系統內核視角能看到的線程”

Snipaste_2020-10-30_10-57-21

在同時支持用戶級線程和內核級線程的系統中,可采用二者組合的方式:將n個用戶級線程映射到m個內核級線程上(n>=m)

重點

​ 操作系統只“看得見”內核級線程,因此只有內核級線程才是處理機分配的單位。

Snipaste_2020-10-30_11-01-33

例如上邊這個模型,該進程由兩個內核級線程,三個用戶級線程,在用戶看來,這個進程中有三個線程。但即使該進程在一個4核處理機的計算機上運行,也最多只能被分配到兩個核,最多只能有兩個線程並行執行。

多線程模型

在同時支持用戶級線程和內核級線程的系統中,由幾個用戶級線程映射到幾個內核級線程的問題引出了“多線程模型”問題。

多對一模型:多個用戶級線程映射到一個內核級線程。每個用戶進程只對應一個內核級線程。

Snipaste_2020-10-30_11-08-54

優點:用戶級線程的切換在用戶空間即可完成,不需要切換到核心態,線程管理的系統開銷小,效率高

缺點:當一個用戶級線程被阻塞后,整個進程都會被阻塞,並發度不高。多個線程不可再多核處理機並行運行。

一對一模型:一個用戶級線程映射到一個內核級線程。每個用戶進程有與用戶級線程同數量的內核級線程。

Snipaste_2020-10-30_11-11-43

優點:當一個線程被阻塞后,別的線程還可以繼續執行,並發能力強。多線程可在多核處理機上並行執行。

缺點:一個用戶進程會占用多個內核級線程,線程切換由操作系統內核完成,需要切換到核心態,因此線程管理的成本高,開銷大。

多對多模型:n用戶級線程映射到m個內核級線程(n>=m)。每個用戶進程對應m個內核級線程。

Snipaste_2020-10-30_11-12-09

優點:克服了多對一模型並發度不高的缺點,又克服了一對一模型中一個用戶進程占用太多內存核級線程,開銷太大的缺點。

Snipaste_2020-10-30_11-05-43


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM