Linux歷史上線程的3種實現模型

一.概述                                                  多線程

這裏以Linux爲例。Linux歷史上,最開始使用的線程是LinuxThreads,但LinuxThreads有些方面受限於內核的特性,從而違背了SUSV3 Pthreads標準。即它要根據內核的特性來實現線程,有些地方沒有遵循統一的標準。後來IBM開發了NGPT(Next Generation POSIX Threads),性能明顯優於LinuxThreads,人們曾把它看成LinuxThreads的繼任者。但最後,又有一個項目NPTL(Native POSIX Threads Library)出來後,性能更優於NGPT。2002年NGPT項目中止開發,咱們如今用的Linux線程就是NPTL。併發

線程的實現曾有3種模型:性能

1.多對一(M:1)的用戶級線程模型spa

2.一對一(1:1)的內核級線程模型線程

3.多對多(M:N)的兩級線程模型對象

上面的x對y(x:y)即x個用戶線程對應y個內核調度實體(Kernel Scheduling Entity,這個是內核分配CPU的對象單位)。進程

LinuxThreads和NPTL都是採用一對一的線程模型,NGPT採用的是多對多的線程模型!!!開發

二.多對一用戶線級程模型                      同步

多對一線程模型中,線程的建立、調度、同步的全部細節所有由進程的用戶空間線程庫來處理。用戶態線程的不少操做對內核來講都是透明的,由於不須要內核來接管,這意味不須要內核態和用戶態頻繁切換。線程的建立、調度、同步處理速度很是快。固然線程的一些其餘操做仍是要通過內核,如IO讀寫。這樣致使了一個問題:當多線程併發執行時,若是其中一個線程執行IO操做時,內核接管這個操做,若是IO阻塞,用戶態的其餘線程都會被阻塞,由於這些線程都對應同一個內核調度實體。在多處理器機器上,內核不知道用戶態有這些線程,沒法把它們調度到其餘處理器,也沒法經過優先級來調度。這對線程的使用是沒有意義的!it

三.一對一內核極線程模型                      

一對一模型中,每一個用戶線程都對應各自的內核調度實體。內核會對每一個線程進行調度,能夠調度到其餘處理器上面。固然由內核來調度的結果就是:線程的每次操做會在用戶態和內核態切換。另外,內核爲每一個線程都映射調度實體,若是系統出現大量線程,會對系統性能有影響。但該模型的實用性仍是高於多對一的線程模型。

四.多對多兩極線程模型                          

多對多模型中,結合了1:1和M:1的優勢,避免了它們的缺點。每一個線程能夠擁有多個調度實體,也能夠多個線程對應一個調度實體。聽起來好像很是完美,但線程的調度須要由內核態和用戶態一塊兒來實現。可想而知,多個對象操做一個東西時,確定要一些其餘的同步機制。用戶態和內核態的分工合做致使實現該模型很是複雜。NPTL曾經也想使用該模型,但它太複雜,要對內核進行大範圍改動,因此仍是採用了一對一的模型!!!

相關文章
相關標籤/搜索