內(nèi)核線程的作用主要有:
周期性的將dirty內(nèi)存頁同步到磁盤設備上。 比如 bpflush線程周期性的把dirty數(shù)據(jù)寫回磁盤內(nèi)存頁很少的情況下,把內(nèi)存page 交換到磁盤空間。 比如kswapd,系統(tǒng)會為每一個NUMA創(chuàng)建一個kswapd進程,但是在非NUMA系統(tǒng)上,則僅有一個kswapd管理延時動作實現(xiàn)文件系統(tǒng)的事物日志主要包括兩種類型的內(nèi)核線程:
線程按周期性間隔運行,檢測特定資源的使用,在用量超出或者低于預置的限制時采取行動在線程啟動后則一直等待,直到內(nèi)核線程請求執(zhí)行某一特定的操作。同時內(nèi)核線程是由內(nèi)核自己創(chuàng)建的線程,也叫做守護線程(deamon)。在終端上用命令”ps -Al”列出的所有進程中,名字以k開關(guān)以d結(jié)尾的往往都是內(nèi)核線程,比如kthreadd、kswapd。
既然是內(nèi)核線程是一個單獨的概念,那么與用戶線程之間一定存在某些區(qū)別,
內(nèi)核線程與用戶線程的相同點是:
都由do_fork()創(chuàng)建,每個線程都有獨立的task_struct和內(nèi)核棧;都參與調(diào)度,內(nèi)核線程也有優(yōu)先級,會被調(diào)度器平等地換入換出
不同之處在于:
內(nèi)核線程只工作在內(nèi)核態(tài)中;而用戶線程則既可以運行在內(nèi)核態(tài)(執(zhí)行系統(tǒng)調(diào)用時),也可以運行在用戶態(tài);內(nèi)核線程沒有用戶空間,所以對于一個內(nèi)核線程來說,它的0~3G的內(nèi)存空間是空白的,它的current->mm是空的,與內(nèi)核使用同一張頁表;而用戶線程則可以看到完整的0~4G內(nèi)存空間。在linux內(nèi)核啟動的最后階段,系統(tǒng)會創(chuàng)建兩個內(nèi)核線程,一個是init,一個是kthreadd。其中init線程的作用是運行文件系統(tǒng)上的一系列”init”腳本,并啟動shell進程,所以init線程稱得上是系統(tǒng)中所有用戶進程的祖先,它的pid是1。kthreadd線程是內(nèi)核的守護線程,在內(nèi)核正常工作時,它永遠不退出,是一個死循環(huán),它的pid是2。
通過上述不同之處的對比可以發(fā)現(xiàn),內(nèi)核線程沒有用戶內(nèi)存空間,與之相對的是用戶進程(注意,此處不是用戶線程,用戶線程內(nèi)存空間與用戶進程空間之間存在的一定差異,具體差異可以參考我之前的博文),用戶進程同時具備內(nèi)核空間與用戶空間,在進行系統(tǒng)調(diào)用時用戶進程會由用戶內(nèi)存空間陷入內(nèi)核內(nèi)存空間。之所以此處采用內(nèi)核線程與用戶進程(而非用戶線程)進行對比,是由于內(nèi)核線程(kernel thread)是“獨立運行在內(nèi)核空間的標準進程”(以上這句話摘自《linux內(nèi)核設計與實現(xiàn)》),因此從功能上看內(nèi)核線程一方面具有進程的概念特點——具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次執(zhí)行活動,是系統(tǒng)進行資源分配的單位,同時內(nèi)核線程又具有線程的概念特點——進程內(nèi)的一個可調(diào)度實體。
好了通過以上分析基本可以分清“內(nèi)核線程(kernel thread)”、“用戶進程”、“用戶線程”這幾個基本概念。這里要補充的一點是以上幾個概念全部是在邏輯層面上的,從實現(xiàn)的角度來看linux內(nèi)核本身并不支持線程這一概念,linux 將所有的線程都當作進程來實現(xiàn)。內(nèi)核并沒有準備特別的調(diào)度算法或是定義特別的數(shù)據(jù)結(jié)構(gòu)來表征線程。相反,線程僅僅被視為一個與其他進程(概念上應該是線程)共享某些資源的進程(概念上應該是線程)。每個線程都擁有唯一隸屬于自己的task_struct,所以在內(nèi)核中,它看起來就像是一個普通的進程(只是線程和其他一些進程共享某些資源,如地址空間)。關(guān)于這一點可以通過系統(tǒng)調(diào)用clone的實現(xiàn)來驗證,無論是fork、vfork、kthread_create最后都是要調(diào)用do_fork,而do_fork就是根據(jù)不同的函數(shù)參數(shù),對一個進程所需的資源進行分配。
在linux2.6之前,內(nèi)核并不支持線程的概念,僅通過輕量級進程(lightweight PRocess)模擬線程,一個用戶線程對應一個內(nèi)核線程(內(nèi)核輕量級進程),這種模型最大的特點是線程調(diào)度由內(nèi)核完成了,而其他線程操作(同步、取消)等都是核外的線程庫(LinuxThread)函數(shù)完成的。但這個問題還存在很多的問題。
在linux2.6之后,為了完全兼容posix標準,linux2.6首先對內(nèi)核進行了改進,引入了線程組的概念(仍然用輕量級進程表示線程),有了這個概念就可以將一組線程組織稱為一個進程,如此通過這個改變,linux內(nèi)核正式支持多線程特性。以上是邏輯上的改變,在實現(xiàn)上主要的改變就是在task_struct中加入tgid字段,這個字段就是用于表示線程組id的字段。在用戶線程庫方面,也使用NPTL代替LinuxThread。不同調(diào)度模型上仍然采用“1對1”模型
現(xiàn)在在支持多線程的操作系統(tǒng)中一般采用三種調(diào)度模型,分別是“一對一模型”、“多對一模型”、“多對多模型”。
1)“一對一模型”
一對一模型中,每個用戶線程都對應各自的內(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)性能有影響。但該模型的實用性還是高于多對一的線程模型。LinuxThread與NPTL都是采用這種模型。
在linux中通過LWP(lightweight process)作為線程概念的支持,輕量級線程(LWP)是一種由內(nèi)核支持的用戶線程。它是基于內(nèi)核線程的高級抽象,因此只有先支持內(nèi)核線程,才能有LWP。每一個進程有一個或多個Lwps,每個LWP由一個內(nèi)核線程支持。這種模型實際上就是恐龍書上所提到的一對一線程模型。在這種實現(xiàn)的操作系統(tǒng)中,LWP就是用戶線程。
由于每個LWP都與一個特定的內(nèi)核線程關(guān)聯(lián),因此每個LWP都是一個獨立的線程調(diào)度單元。即使有一個LWP在系統(tǒng)調(diào)用中阻塞,也不會影響整個進程的執(zhí)行。
輕量級進程具有局限性。首先,大多數(shù)LWP的操作,如建立、析構(gòu)以及同步,都需要進行系統(tǒng)調(diào)用。系統(tǒng)調(diào)用的代價相對較高:需要在user mode和kernel mode中切換。其次,每個LWP都需要有一個內(nèi)核線程支持,因此LWP要消耗內(nèi)核資源(內(nèi)核線程的棧空間)。因此一個系統(tǒng)不能支持大量的LWP。圖也是盜的。

2)“多對一模型”
多對一線程模型中,線程的創(chuàng)建、調(diào)度、同步的所有細節(jié)全部由進程的用戶空間線程庫來處理。用戶態(tài)線程的很多操作對內(nèi)核來說都是透明的,因為不需要內(nèi)核來接管,這意味不需要內(nèi)核態(tài)和用戶態(tài)頻繁切換。線程的創(chuàng)建、調(diào)度、同步處理速度非常快。當然線程的一些其他操作還是要經(jīng)過內(nèi)核,如IO讀寫。這樣導致了一個問題:當多線程并發(fā)執(zhí)行時,如果其中一個線程執(zhí)行IO操作時,內(nèi)核接管這個操作,如果IO阻塞,用戶態(tài)的其他線程都會被阻塞,因為這些線程都對應同一個內(nèi)核調(diào)度實體。在多處理器機器上,內(nèi)核不知道用戶態(tài)有這些線程,無法把它們調(diào)度到其他處理器,也無法通過優(yōu)先級來調(diào)度。這對線程的使用是沒有意義的!

3)“多對多模型”
用戶線程庫還是完全建立在用戶空間中,因此用戶線程的操作還是很廉價,因此可以建立任意多需要的用戶線程。操作系統(tǒng)提供了 LWP 作為用戶線程和內(nèi)核線程之間的橋梁。 LWP 還是和前面提到的一樣,具有內(nèi)核線程支持,是內(nèi)核的調(diào)度單元,并且用戶線程的系統(tǒng)調(diào)用要通過 LWP ,因此進程中某個用戶線程的阻塞不會影響整個進程的執(zhí)行。用戶線程庫將建立的用戶線程關(guān)聯(lián)到 LWP 上, LWP 與用戶線程的數(shù)量不一定一致。當內(nèi)核調(diào)度到某個 LWP 上時,此時與該 LWP 關(guān)聯(lián)的用戶線程就被執(zhí)行。

新聞熱點
疑難解答