历史上线程的3种实现模型
一.概述 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
這里以Linux為例。Linux歷史上,最開始使用的線程是LinuxThreads,但LinuxThreads有些方面受限于內(nèi)核的特性,從而違背了SUSV3 Pthreads標準。即它要根據(jù)內(nèi)核的特性來實現(xiàn)線程,有些地方?jīng)]有遵循統(tǒng)一的標準。后來IBM開發(fā)了NGPT(Next Generation POSIX Threads),性能明顯優(yōu)于LinuxThreads,人們曾把它當作LinuxThreads的繼任者。但最后,又有一個項目NPTL(Native POSIX Threads Library)出來后,性能更優(yōu)于NGPT。2002年NGPT項目停止開發(fā),我們現(xiàn)在用的Linux線程就是NPTL。
線程的實現(xiàn)曾有3種模型:
1.多對一(M:1)的用戶級線程模型
2.一對一(1:1)的內(nèi)核級線程模型
3.多對多(M:N)的兩級線程模型
上面的x對y(x:y)即x個用戶線程對應(yīng)y個內(nèi)核調(diào)度實體(Kernel Scheduling Entity,這個是內(nèi)核分配CPU的對象單位)。
LinuxThreads和NPTL都是采用一對一的線程模型,NGPT采用的是多對多的線程模型!!!
二.多對一用戶線級程模型 ? ? ? ? ? ? ? ? ? ? ?
多對一線程模型中,線程的創(chuàng)建、調(diào)度、同步的所有細節(jié)全部由進程的用戶空間線程庫來處理。用戶態(tài)線程的很多操作對內(nèi)核來說都是透明的,因為不需要內(nèi)核來接管,這意味不需要內(nèi)核態(tài)和用戶態(tài)頻繁切換。線程的創(chuàng)建、調(diào)度、同步處理速度非???/span>。當然線程的一些其他操作還是要經(jīng)過內(nèi)核,如IO讀寫。這樣導(dǎo)致了一個問題:當多線程并發(fā)執(zhí)行時,如果其中一個線程執(zhí)行IO操作時,內(nèi)核接管這個操作,如果IO阻塞,用戶態(tài)的其他線程都會被阻塞,因為這些線程都對應(yīng)同一個內(nèi)核調(diào)度實體。在多處理器機器上,內(nèi)核不知道用戶態(tài)有這些線程,無法把它們調(diào)度到其他處理器,也無法通過優(yōu)先級來調(diào)度。這對線程的使用是沒有意義的!
三.一對一內(nèi)核極線程模型 ? ? ? ? ? ? ? ? ? ? ?
一對一模型中,每個用戶線程都對應(yīng)各自的內(nèi)核調(diào)度實體。內(nèi)核會對每個線程進行調(diào)度,可以調(diào)度到其他處理器上面。當然由內(nèi)核來調(diào)度的結(jié)果就是:線程的每次操作會在用戶態(tài)和內(nèi)核態(tài)切換。另外,內(nèi)核為每個線程都映射調(diào)度實體,如果系統(tǒng)出現(xiàn)大量線程,會對系統(tǒng)性能有影響。但該模型的實用性還是高于多對一的線程模型。
四.多對多兩極線程模型 ? ? ? ? ? ? ? ? ? ? ? ? ?
多對多模型中,結(jié)合了1:1和M:1的優(yōu)點,避免了它們的缺點。每個線程可以擁有多個調(diào)度實體,也可以多個線程對應(yīng)一個調(diào)度實體。聽起來好像非常完美,但線程的調(diào)度需要由內(nèi)核態(tài)和用戶態(tài)一起來實現(xiàn)。可想而知,多個對象操作一個東西時,肯定要一些其他的同步機制。用戶態(tài)和內(nèi)核態(tài)的分工合作導(dǎo)致實現(xiàn)該模型非常復(fù)雜。NPTL曾經(jīng)也想使用該模型,但它太復(fù)雜,要對內(nèi)核進行大范圍改動,所以還是采用了一對一的模型!!!
總結(jié)
以上是生活随笔為你收集整理的历史上线程的3种实现模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux多线程同步的几种方式
- 下一篇: 静态链接库、动态链接库和动态加载库