前言
- linux內(nèi)核不存在整真正意義上的線程。linux將所有的執(zhí)行實(shí)體都稱之為任務(wù)(task),每一個(gè)任務(wù)在干年上都類似于一個(gè)單線程的進(jìn)程,具有內(nèi)存空間、執(zhí)行實(shí)體、文件資源等。但是,linux下不同任務(wù)之間可以選擇公用內(nèi)存空間,因而在實(shí)際意義上,共享同一個(gè)內(nèi)存空間的多個(gè)任務(wù)構(gòu)成了一個(gè)進(jìn)程,而這些任務(wù)就成為這個(gè)任務(wù)里面的線程。
內(nèi)核線程
- 內(nèi)核線程又稱為守護(hù)進(jìn)程,內(nèi)核線程的調(diào)度由內(nèi)核負(fù)責(zé),一個(gè)內(nèi)核線程處于阻塞狀態(tài)時(shí)不影響其他的內(nèi)核線程,因?yàn)槠涫钦{(diào)度的基本單位。這與用戶線程是不一樣的;
- 這些線程可以在全系統(tǒng)內(nèi)進(jìn)行資源的競(jìng)爭(zhēng);
- 內(nèi)核空間內(nèi)為每一個(gè)內(nèi)核支持線程設(shè)置了一個(gè)線程控制塊(TCB),內(nèi)核根據(jù)該控制塊,感知線程的存在,并進(jìn)行控制。在一定程度上類似于進(jìn)程,只是創(chuàng)建、調(diào)度的開(kāi)銷要比進(jìn)程小。有的統(tǒng)計(jì)是1:10。
- 內(nèi)核線程切換由內(nèi)核控制,當(dāng)線程進(jìn)行切換的時(shí)候,由用戶態(tài)轉(zhuǎn)化為內(nèi)核態(tài)。切換完畢要從內(nèi)核態(tài)返回用戶態(tài),即存在用戶態(tài)和內(nèi)核態(tài)之間的轉(zhuǎn)換,比如多核cpu,還有win線程的實(shí)現(xiàn)。
優(yōu)點(diǎn)
在多處理器系統(tǒng)中,內(nèi)核能夠同時(shí)調(diào)度同一進(jìn)程中多個(gè)線程并行執(zhí)行到多個(gè)處理器中;如果進(jìn)程中的一個(gè)線程被阻塞,內(nèi)核可以調(diào)度同一個(gè)進(jìn)程中的另一個(gè)線程;內(nèi)核支持線程具有很小的數(shù)據(jù)結(jié)構(gòu)和堆棧,線程的切換比較快,切換開(kāi)銷??;內(nèi)核本身也可以使用多線程的方式來(lái)實(shí)現(xiàn)。
缺點(diǎn)
即使CPU在同一個(gè)進(jìn)程的多個(gè)線程之間切換,也需要陷入內(nèi)核,因此其速度和效率不如用戶級(jí)線程。
用戶線程
- 用戶線程在用戶空間中實(shí)現(xiàn),內(nèi)核并沒(méi)有直接對(duì)用戶線程進(jìn)程調(diào)度,內(nèi)核的調(diào)度對(duì)象和傳統(tǒng)進(jìn)程一樣,還是進(jìn)程(用戶進(jìn)程)本身,內(nèi)核并不能看到用戶線程,內(nèi)核并不知道用戶線程的存在。
- 不需要內(nèi)核支持而在用戶程序中實(shí)現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,應(yīng)用進(jìn)程利用線程庫(kù)提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來(lái)控制用戶線程。
- 內(nèi)核資源的分配仍然是按照進(jìn)程(用戶進(jìn)程)進(jìn)行分配的;各個(gè)用戶線程只能在進(jìn)程內(nèi)進(jìn)行資源競(jìng)爭(zhēng)。
- 用戶級(jí)線程內(nèi)核的切換由用戶態(tài)程序自己控制內(nèi)核切換(通過(guò)系統(tǒng)調(diào)用來(lái)獲得內(nèi)核提供的服務(wù)),不需要內(nèi)核干涉,少了進(jìn)出內(nèi)核態(tài)的消耗,但不能很好的利用多核Cpu。目前Linux pthread大體是這么做的。
- 每個(gè)用戶線程并不具有自身的線程上下文。因此,就線程的同時(shí)執(zhí)行而言,任意給定時(shí)刻每個(gè)進(jìn)程只能夠有一個(gè)線程在運(yùn)行,而且只有一個(gè)處理器內(nèi)核會(huì)被分配給該進(jìn)程。
優(yōu)點(diǎn)
線程的切換無(wú)需陷入內(nèi)核,故切換開(kāi)銷小,速度非???;
缺點(diǎn)
系統(tǒng)調(diào)用的阻塞問(wèn)題:對(duì)應(yīng)用程序來(lái)講,同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,一個(gè)線程的阻塞將導(dǎo)致整個(gè)進(jìn)程中所有線程的阻塞;由于這里的處理器時(shí)間片分配是以進(jìn)程為基本單位,所以每個(gè)線程執(zhí)行的時(shí)間相對(duì)減少。
用戶級(jí)線程和內(nèi)核級(jí)線程的區(qū)別:
- 內(nèi)核支持:用戶級(jí)線程可在一個(gè)不支持線程的OS中實(shí)現(xiàn);內(nèi)核支持線程則需要得到OS內(nèi)核的支持。亦即內(nèi)核支持線程是OS內(nèi)核可感知的,而用戶級(jí)線程是OS內(nèi)核不可感知的。
- 處理器分配:在多處理機(jī)環(huán)境下,對(duì)用戶級(jí)線程而言主,內(nèi)核一次只為一個(gè)進(jìn)程分配一個(gè)處理器,進(jìn)程無(wú)法享用多處理機(jī)帶來(lái)的好處;在設(shè)置有內(nèi)核支持線程時(shí),內(nèi)核可調(diào)度一個(gè)應(yīng)用中的多個(gè)線程同時(shí)在多個(gè)處理器上并行運(yùn)行,提高程序的執(zhí)行速度和效率。
- 調(diào)度和線程執(zhí)行時(shí)間:設(shè)置有內(nèi)核支持線程的系統(tǒng),其調(diào)度方式和算法與進(jìn)程的調(diào)度十分相似,只不過(guò)調(diào)度單位是線程;對(duì)只設(shè)置了用戶級(jí)線程的系統(tǒng),調(diào)度的單位仍為進(jìn)程。
- 用戶級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時(shí),只導(dǎo)致該線程被中斷。
- 在只有用戶級(jí)線程的系統(tǒng)內(nèi),CPU調(diào)度還是以進(jìn)程為單位,處于運(yùn)行狀態(tài)的進(jìn)程中的多個(gè)線程,由用戶程序控制線程的輪換運(yùn)行;在有內(nèi)核支持線程的系統(tǒng)內(nèi),CPU調(diào)度則以線程為單位,由OS的線程調(diào)度程序負(fù)責(zé)線程的調(diào)度。
內(nèi)核線程與用戶線程的聯(lián)系
一對(duì)一模型
- 特點(diǎn)
有了內(nèi)核線程,每個(gè)用戶線程被映射或綁定到一個(gè)內(nèi)核線程。用戶線程在其生命期內(nèi)都會(huì)綁定到該內(nèi)核線程。一旦用戶線程終止,兩個(gè)線程都將離開(kāi)系統(tǒng)。這被稱作"一對(duì)一"線程映射。(反過(guò)來(lái),一個(gè)內(nèi)核線程不一定就會(huì)對(duì)應(yīng)一個(gè)用戶線程)。一般一直使用API或者是系統(tǒng)調(diào)用創(chuàng)建的線程均為一對(duì)一線程。例如,linux使用clone創(chuàng)建的線程,以及win下使用CreateThread創(chuàng)建的線程。
- 弊端
內(nèi)核線程數(shù)量有限
許多操作系統(tǒng)內(nèi)核線程調(diào)用的時(shí)候,上下文切換的開(kāi)銷很大。
混合線程模型
混合線程實(shí)現(xiàn)是用戶線程和內(nèi)核線程的交叉,使得庫(kù)和操作系統(tǒng)都可以管理線程。用戶線程由運(yùn)行時(shí)庫(kù)調(diào)度器管理,內(nèi)核線程由操作系統(tǒng)調(diào)度器管理。在這種實(shí)現(xiàn)中,進(jìn)程有著自己的內(nèi)核線程池??蛇\(yùn)行的用戶線程由運(yùn)行時(shí)庫(kù)分派并標(biāo)記為準(zhǔn)備好執(zhí)行的可用線程。操作系統(tǒng)選擇用戶線程并將它映射到線程池中的可用內(nèi)核線程。多個(gè)用戶線程可以分配給相同的內(nèi)核線程。
-
多對(duì)一模型
- 特點(diǎn)
多對(duì)一的模型將多個(gè)用戶線程映射到一個(gè)內(nèi)核線程。
多對(duì)一模型線程的切換速度要快很多(線程之間的切換由用戶代碼來(lái)執(zhí)行)
- 弊端
如果其中一個(gè)線程阻塞,那么所有線程將無(wú)法執(zhí)行。
-
多對(duì)多模型
- 特點(diǎn)
將上述兩種模型的特點(diǎn)進(jìn)行綜合,即將多個(gè)用戶線程映射到少數(shù)但不只一個(gè)內(nèi)核線程中去。
多對(duì)多模型對(duì)用戶線程的數(shù)量沒(méi)有什么限制,在多處理器系統(tǒng)上也會(huì)有一定的性能提升,不過(guò)提升的幅度比不上一對(duì)一模型。