用户线程和内核线程之间的区别
轉(zhuǎn)載于http://col1.blog.163.com/blog/static/1909775192012719114033352/
1?.內(nèi)核級(jí)線程:切換由內(nèi)核控制,當(dāng)線程進(jìn)行切換的時(shí)候,由用戶態(tài)轉(zhuǎn)化為內(nèi)核態(tài)。切換完畢要從內(nèi)核態(tài)返回用戶態(tài);可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。
?2. 用戶級(jí)線程內(nèi)核的切換由用戶態(tài)程序自己控制內(nèi)核切換,不需要內(nèi)核干涉,少了進(jìn)出內(nèi)核態(tài)的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這么做的。
線程的實(shí)現(xiàn)可以分為兩類:用戶級(jí)線程(User-Level Thread)和內(nèi)核線線程(Kernel-Level Thread),后者又稱為內(nèi)核支持的線程或輕量級(jí)進(jìn)程。在多線程操作系統(tǒng)中,各個(gè)系統(tǒng)的實(shí)現(xiàn)方式并不相同,在有的系統(tǒng)中實(shí)現(xiàn)了用戶級(jí)線程,有的系統(tǒng)中實(shí)現(xiàn)了內(nèi)核級(jí)線程。
用戶線程指不需要內(nèi)核支持而在用戶程序中實(shí)現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,應(yīng)用進(jìn)程利用線程庫(kù)提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來控制用戶線程。不需要用戶態(tài)/核心態(tài)切換,速度快,操作系統(tǒng)內(nèi)核不知道多線程的存在,因此一個(gè)線程阻塞將使得整個(gè)進(jìn)程(包括它的所有線程)阻塞。由于這里的處理器時(shí)間片分配是以進(jìn)程為基本單位,所以每個(gè)線程執(zhí)行的時(shí)間相對(duì)減少。
內(nèi)核線程:由操作系統(tǒng)內(nèi)核創(chuàng)建和撤銷。內(nèi)核維護(hù)進(jìn)程及線程的上下文信息以及線程切換。一個(gè)內(nèi)核線程由于I/O操作而阻塞,不會(huì)影響其它線程的運(yùn)行。Windows NT和2000/XP支持內(nèi)核線程。
用戶線程運(yùn)行在一個(gè)中間系統(tǒng)上面。目前中間系統(tǒng)實(shí)現(xiàn)的方式有兩種,即運(yùn)行時(shí)系統(tǒng)(Runtime System)和內(nèi)核控制線程。“運(yùn)行時(shí)系統(tǒng)”實(shí)質(zhì)上是用于管理和控制線程的函數(shù)集合,包括創(chuàng)建、撤銷、線程的同步和通信的函數(shù)以及調(diào)度的函數(shù)。這些函數(shù)都駐留在用戶空間作為用戶線程和內(nèi)核之間的接口。用戶線程不能使用系統(tǒng)調(diào)用,而是當(dāng)線程需要系統(tǒng)資源時(shí),將請(qǐng)求傳送給運(yùn)行時(shí),由后者通過相應(yīng)的系統(tǒng)調(diào)用來獲取系統(tǒng)資源。內(nèi)核控制線程:系統(tǒng)在分給進(jìn)程幾個(gè)輕型進(jìn)程(LWP),LWP可以通過系統(tǒng)調(diào)用來獲得內(nèi)核提供的服務(wù),而進(jìn)程中的用戶線程可通過復(fù)用來關(guān)聯(lián)到LWP,從而得到內(nèi)核的服務(wù)。
以下是用戶級(jí)線程和內(nèi)核級(jí)線程的區(qū)別:
(1)內(nèi)核支持線程是OS內(nèi)核可感知的,而用戶級(jí)線程是OS內(nèi)核不可感知的。
(2)用戶級(jí)線程的創(chuàng)建、撤消和調(diào)度不需要OS內(nèi)核的支持,是在語言(如Java)這一級(jí)處理的;而內(nèi)核支持線程的創(chuàng)建、撤消和調(diào)度都需OS內(nèi)核提供支持,而且與進(jìn)程的創(chuàng)建、撤消和調(diào)度大體是相同的。
(3)用戶級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時(shí),只導(dǎo)致該線程被中斷。
(4)在只有用戶級(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)度。
(5)用戶級(jí)線程的程序?qū)嶓w是運(yùn)行在用戶態(tài)下的程序,而內(nèi)核支持線程的程序?qū)嶓w則是可以運(yùn)行在任何狀態(tài)下的程序。
內(nèi)核線程的優(yōu)點(diǎn):
(1)當(dāng)有多個(gè)處理機(jī)時(shí),一個(gè)進(jìn)程的多個(gè)線程可以同時(shí)執(zhí)行。
缺點(diǎn):
(1)由內(nèi)核進(jìn)行調(diào)度。
用戶進(jìn)程的優(yōu)點(diǎn):
(1) 線程的調(diào)度不需要內(nèi)核直接參與,控制簡(jiǎn)單。
(2) 可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)。
(3) 創(chuàng)建和銷毀線程、線程切換代價(jià)等線程管理的代價(jià)比內(nèi)核線程少得多。
(4) 允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活。這就是必須自己寫管理程序,與內(nèi)核線程的區(qū)別
(5) 線程能夠利用的表空間和堆棧空間比內(nèi)核級(jí)線程多。
(6) 同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會(huì)被掛起。另外,頁面失效也會(huì)產(chǎn)生同樣的問題。
缺點(diǎn):
(1)資源調(diào)度按照進(jìn)程進(jìn)行,多個(gè)處理機(jī)下,同一個(gè)進(jìn)程中的線程只能在同一個(gè)處理機(jī)下分時(shí)復(fù)用
總結(jié)
以上是生活随笔為你收集整理的用户线程和内核线程之间的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于SET和UNORDER_SET
- 下一篇: 关于多态