用戶級和內核級線程
用戶級線程:任何應用程序均可以經過使用線程庫設計成多線程程序。線程庫是用於用戶級線程管理的一個例程句,它包含用於建立和銷燬線程的代碼、在線程間傳遞消息和數據的代碼、調度線程執行的代碼以及保存和恢復線程上下文的代碼。該狀況下全部活動發生在用戶空間中,而且發生在一個進程中,而內核並不知道這些活動。內核繼續以進程爲單位進行調度。
用戶級線程優勢:全部線程管理數據結構都在一個進程的用戶地址空間中,線程切換不須要內核態特權,所以,進程不須要爲了線程管理切換到內核態。
1.用戶級線程執行一個系統調用時,不只這個線程會阻塞,進程中全部的線程都會阻塞:
2.一個多線程應用程序不能利用多處理技術。內核一次只把一個進程分配給一個處理器,所以一個進程中只有一個線程能夠執行
內核級線程:有關線程管理的全部工做都是由內核完成的。
內核級線程優勢:
1.內核能夠同時把同一個進程中的多個線程調度到多個處理器中
2.若是進程中一個線程被阻塞,內核能夠調度同一個進程中的另外一個線程。內核級線程方法的另外一個優勢是內核例程自身也可使用多線程算法
SMP(對稱多處理結構)
SMP中有多個處理器,每一個都有它本身的控制單元、算數邏輯單元和寄存器 數據結構
Attention:
用戶級線程:
同一進程中只能同時有一個線程在運行,若是有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生一樣的問題。
內核級線程:
內核支持線程執行系統調用指令時,只致使該線程被中斷多線程
如下是用戶級線程和內核級線程的區別:併發
(1)內核支持線程是OS內核可感知的,而用戶級線程是OS內核不可感知的。spa
(2)用戶級線程的建立、撤消和調度不須要OS內核的支持,是在語言(如Java)這一級處理的;而內核支持線程的建立、撤消和調度都需OS內核提供支持,並且與進程的建立、撤消和調度大致是相同的。操作系統
(3)用戶級線程執行系統調用指令時將致使其所屬進程被中斷,而內核支持線程執行系統調用指令時,只致使該線程被中斷。.net
(4)在只有用戶級線程的系統內,CPU調度仍是以進程爲單位,處於運行狀態的進程中的多個線程,由用戶程序控制線程的輪換運行;在有內核支持線程的系統內,CPU調度則以線程爲單位,由OS的線程調度程序負責線程的調度。線程
(5)用戶級線程的程序實體是運行在用戶態下的程序,而內核支持線程的程序實體則是能夠運行在任何狀態下的程序。設計
內核線程的優勢:指針
(1)當有多個處理機時,一個進程的多個線程能夠同時執行。
缺點:
(1)由內核進行調度。
用戶進程的優勢:
(1) 線程的調度不須要內核直接參與,控制簡單。
(2) 能夠在不支持線程的操做系統中實現。
(3) 建立和銷燬線程、線程切換代價等線程管理的代價比內核線程少得多。
(4) 容許每一個進程定製本身的調度算法,線程管理比較靈活。
(5) 線程可以利用的表空間和堆棧空間比內核級線程多。
(6) 同一進程中只能同時有一個線程在運行,若是有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。另外,頁面失效也會產生一樣的問題。
缺點:
(1)資源調度按照進程進行,多個處理機下,同一個進程中的線程只能在同一個處理機下分時複用
進程:包括一個存放進程映像(程序、數據、棧和進程控制塊中定義屬性的集合)的虛擬地址空間,一個進程老是擁有對資源的控制和全部權,包括內存、I/O通道、I/O設備和文件。
進程控制塊:標識符、狀態、優先級、程序計數器、內存指針、上下文數據…
多線程:操做系統中單個進程內支持多個併發執行路徑的能力。在多線程環境中,進程被定義成一個資源分配的單位和一個被保護的單位。在一個進程中,可能有一個或多個線程,每一個線程有:
一個簡單的進程模型包括:進程控制塊、用戶地址空間、用戶棧和內核棧(進程執行中管理調用/返回行爲)
多線程環境中,進程仍然只有一個與之關聯的進程控制塊和用戶地址空間。可是每一個線程都有獨立的棧,還有獨立的控制塊用於包含寄存器優先級和其它線程相關狀態信息。
參考:https://blog.csdn.net/wxywxywxy110/article/details/60780935