新聞中心
問題
(1)線程有哪些類型?

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出海西免費(fèi)做網(wǎng)站回饋大家。
(2)線程模型有哪些?
(3)各語(yǔ)言是怎么實(shí)現(xiàn)自己的線程模型的?
簡(jiǎn)介
在Java中,我們平時(shí)所說的并發(fā)編程、多線程、共享資源等概念都是與線程相關(guān)的,這里所說的線程實(shí)際上應(yīng)該叫作“用戶線程”,而對(duì)應(yīng)到操作系統(tǒng),還有另外一種線程叫作“內(nèi)核線程”。
用戶線程位于內(nèi)核之上,它的管理無需內(nèi)核支持;而內(nèi)核線程由操作系統(tǒng)來直接支持與管理。幾乎所有的現(xiàn)代操作系統(tǒng),包括 Windows、Linux、Mac OS X 和 Solaris,都支持內(nèi)核線程。
最終,用戶線程和內(nèi)核線程之間必然存在某種關(guān)系,本章我們一起來學(xué)習(xí)下建立這種關(guān)系常見的三種方法:多對(duì)一模型、一對(duì)一模型和多對(duì)多模型。
多對(duì)一模型
多對(duì)一線程模型,又叫作用戶級(jí)線程模型,即多個(gè)用戶線程對(duì)應(yīng)到同一個(gè)內(nèi)核線程上,線程的創(chuàng)建、調(diào)度、同步的所有細(xì)節(jié)全部由進(jìn)程的用戶空間線程庫(kù)來處理。
優(yōu)點(diǎn):
- 用戶線程的很多操作對(duì)內(nèi)核來說都是透明的,不需要用戶態(tài)和內(nèi)核態(tài)的頻繁切換,使線程的創(chuàng)建、調(diào)度、同步等非??欤?/li>
缺點(diǎn):
由于多個(gè)用戶線程對(duì)應(yīng)到同一個(gè)內(nèi)核線程,如果其中一個(gè)用戶線程阻塞,那么該其他用戶線程也無法執(zhí)行;
- 內(nèi)核并不知道用戶態(tài)有哪些線程,無法像內(nèi)核線程一樣實(shí)現(xiàn)較完整的調(diào)度、優(yōu)先級(jí)等;
許多語(yǔ)言實(shí)現(xiàn)的協(xié)程庫(kù)基本上都屬于這種方式,比如python的gevent。
一對(duì)一模型
一對(duì)一模型,又叫作內(nèi)核級(jí)線程模型,即一個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程,內(nèi)核負(fù)責(zé)每個(gè)線程的調(diào)度,可以調(diào)度到其他處理器上面。
優(yōu)點(diǎn):
- 實(shí)現(xiàn)簡(jiǎn)單,本文由公從號(hào)“彤哥讀源碼”原創(chuàng);
缺點(diǎn):
對(duì)用戶線程的大部分操作都會(huì)映射到內(nèi)核線程上,引起用戶態(tài)和內(nèi)核態(tài)的頻繁切換;
- 內(nèi)核為每個(gè)線程都映射調(diào)度實(shí)體,如果系統(tǒng)出現(xiàn)大量線程,會(huì)對(duì)系統(tǒng)性能有影響;
Java使用的就是一對(duì)一線程模型,所以在Java中啟一個(gè)線程要謹(jǐn)慎。
多對(duì)多模型
多對(duì)多模型,又叫作兩級(jí)線程模型,它是博采眾長(zhǎng)之后的產(chǎn)物,充分吸收前兩種線程模型的優(yōu)點(diǎn)且盡量規(guī)避它們的缺點(diǎn)。
在此模型下,用戶線程與內(nèi)核線程是多對(duì)多(m : n,通常m>=n)的映射模型。
首先,區(qū)別于多對(duì)一模型,多對(duì)多模型中的一個(gè)進(jìn)程可以與多個(gè)內(nèi)核線程關(guān)聯(lián),于是進(jìn)程內(nèi)的多個(gè)用戶線程可以綁定不同的內(nèi)核線程,這點(diǎn)和一對(duì)一模型相似;
其次,又區(qū)別于一對(duì)一模型,它的進(jìn)程里的所有用戶線程并不與內(nèi)核線程一一綁定,而是可以動(dòng)態(tài)綁定內(nèi)核線程, 當(dāng)某個(gè)內(nèi)核線程因?yàn)槠浣壎ǖ挠脩艟€程的阻塞操作被內(nèi)核調(diào)度讓出CPU時(shí),其關(guān)聯(lián)的進(jìn)程中其余用戶線程可以重新與其他內(nèi)核線程綁定運(yùn)行。
所以,多對(duì)多模型既不是多對(duì)一模型那種完全靠自己調(diào)度的也不是一對(duì)一模型完全靠操作系統(tǒng)調(diào)度的,而是中間態(tài)(自身調(diào)度與系統(tǒng)調(diào)度協(xié)同工作),因?yàn)檫@種模型的高度復(fù)雜性,操作系統(tǒng)內(nèi)核開發(fā)者一般不會(huì)使用,所以更多時(shí)候是作為第三方庫(kù)的形式出現(xiàn)。
優(yōu)點(diǎn):
兼具多對(duì)一模型的輕量;
由于對(duì)應(yīng)了多個(gè)內(nèi)核線程,則一個(gè)用戶線程阻塞時(shí),其他用戶線程仍然可以執(zhí)行;
- 由于對(duì)應(yīng)了多個(gè)內(nèi)核線程,則可以實(shí)現(xiàn)較完整的調(diào)度、優(yōu)先級(jí)等;
缺點(diǎn):
- 實(shí)現(xiàn)復(fù)雜,本文由公從號(hào)“彤哥讀源碼”原創(chuàng);
Go語(yǔ)言中的goroutine調(diào)度器就是采用的這種實(shí)現(xiàn)方案,在Go語(yǔ)言中一個(gè)進(jìn)程可以啟動(dòng)成千上萬個(gè)goroutine,這也是其出道以來就自帶“高并發(fā)”光環(huán)的重要原因。
后面講到Java中的ForkJoinPool的時(shí)候,我們會(huì)拿Go語(yǔ)言的PMG線程模型來對(duì)比講解。
總結(jié)
(1)線程分為用戶線程和內(nèi)核線程;
(2)線程模型有多對(duì)一模型、一對(duì)一模型、多對(duì)多模型;
(3)操作系統(tǒng)一般只實(shí)現(xiàn)到一對(duì)一模型;
(4)Java使用的是一對(duì)一線程模型,所以它的一個(gè)線程對(duì)應(yīng)于一個(gè)內(nèi)核線程,調(diào)度完全交給操作系統(tǒng)來處理;
(5)Go語(yǔ)言使用的是多對(duì)多線程模型,這也是其高并發(fā)的原因,它的線程模型與Java中的ForkJoinPool非常類似;
(6)python的gevent使用的是多對(duì)一線程模型;
彩蛋
你所學(xué)過的語(yǔ)言都是使用的什么線程模型呢?
網(wǎng)頁(yè)名稱:死磕java線程系列之線程模型
網(wǎng)站路徑:http://m.biofuelwatch.net/article/ispcoj.html


咨詢
建站咨詢
