熬之滴水成石:最想深入了解的内容--windows内核机制(6)
58 進(jìn)程和線程(3)
說(shuō)完進(jìn)程再說(shuō)說(shuō)線程,線程相比于進(jìn)程其實(shí)有更多可說(shuō)的內(nèi)容。首先實(shí)現(xiàn)線程調(diào)用的數(shù)據(jù)結(jié)構(gòu)是個(gè)棧,該棧記錄了調(diào)用方法的信息這里面也包括了函數(shù)調(diào)用及返回的地址。線程肯定是屬于某個(gè)進(jìn)程,其控制流可以訪問(wèn)這個(gè)進(jìn)程的資源,對(duì)于線程而言內(nèi)存等數(shù)據(jù)都是共享的。一個(gè)進(jìn)程可以有多個(gè)線程的,所以線程之間的通信還是比較方便,因?yàn)榫€程是共享資源的,所以多線程通訊的機(jī)制比起IPC機(jī)制更為方便。在OS的環(huán)境中,我們可以把線程分成用戶線程和內(nèi)核線程。用戶線程的理解當(dāng)放在OS的整體環(huán)境中還是比較好理解,你認(rèn)為它就是OS提供的某個(gè)進(jìn)程機(jī)制下的線程就可以了,因?yàn)橛脩艟€程往往是受到了OS進(jìn)程下的控制的為用戶開(kāi)放的線程功能。用戶級(jí)線程的優(yōu)勢(shì)就是因?yàn)樗菫橛脩艏?jí)開(kāi)放的,所以它的切換效率高。相比于用戶級(jí)的線程,內(nèi)核級(jí)線程就顯得更為條條框框和規(guī)規(guī)矩矩了。由于OS對(duì)指令有完全的控制能力,所以內(nèi)核線程是應(yīng)用各種算法來(lái)處理分配處理器的時(shí)間。前一章,我們說(shuō)到線程有優(yōu)先級(jí)的概念,優(yōu)先級(jí)高的肯定可以先執(zhí)行,內(nèi)核線程的好處就是在于它根本就不需要考慮在什么時(shí)候把控制權(quán)交給其他線程,從不擔(dān)心自己的處理時(shí)間片是否長(zhǎng)了導(dǎo)致其它線程無(wú)法執(zhí)行的問(wèn)題。所以這一部分對(duì)于用戶是封閉的,內(nèi)核會(huì)很好處理好線程之間與處理器的資源分配問(wèn)題。還有一點(diǎn)須注意的是,線程是可以從內(nèi)核模式轉(zhuǎn)向用戶模式,用戶模式也可以轉(zhuǎn)向內(nèi)核模式的。但是這種模式的轉(zhuǎn)換是需要開(kāi)銷(xiāo)的,這部分開(kāi)銷(xiāo)也是可以完全接受的。
之前說(shuō)了進(jìn)程的調(diào)度算法,其實(shí)就是輪換,一個(gè)進(jìn)程運(yùn)行一段時(shí)間后歇菜換另一個(gè)進(jìn)程執(zhí)行。然而線程的調(diào)度算法又是怎樣了。在之前我們從課本上學(xué)過(guò)線程調(diào)度算法,從一個(gè)純理論的角度還是有一個(gè)大概的認(rèn)識(shí)。基本上可以分為三種,一種為時(shí)間片輪詢調(diào)度算法:這個(gè)算法很好理解。就是cpu的處理時(shí)間被分成許多塊,然后采取輪詢的方法分配給每個(gè)線程,當(dāng)線程獲取到時(shí)間片運(yùn)行后就按照自己的過(guò)程方法執(zhí)行下去,直到時(shí)間段完全用完,或者主動(dòng)放棄執(zhí)行。OS會(huì)在獲得時(shí)間片控制權(quán)后會(huì)控制下一個(gè)正在等待的線程。這種線程調(diào)度的機(jī)制是我們理解多線程并發(fā)最常見(jiàn)的思維方式,也是最為實(shí)用最為公平的調(diào)度處理資源的方式。隨著硬件越來(lái)越強(qiáng),線程調(diào)度和切換的開(kāi)銷(xiāo)也越來(lái)越小。另一種算法為優(yōu)先級(jí)調(diào)度,原理也比較簡(jiǎn)單就是賦予每個(gè)線程一個(gè)優(yōu)先級(jí)的編號(hào),高優(yōu)先級(jí)的總是優(yōu)先考慮被處理器執(zhí)行,在處理這個(gè)優(yōu)先級(jí)時(shí)OS會(huì)形成一個(gè)優(yōu)先級(jí)的對(duì)列表,用來(lái)存儲(chǔ)滿足條件的線程,當(dāng)一個(gè)線程用完了時(shí)間片或者主動(dòng)放棄處理器執(zhí)行權(quán)時(shí),系統(tǒng)會(huì)選擇優(yōu)先級(jí)高的線程作為下一個(gè)要運(yùn)行的線程。優(yōu)先級(jí)的調(diào)度方法實(shí)際上只是在輪詢的機(jī)制上加上了一個(gè)優(yōu)先級(jí)編號(hào)的。最后一種方法就是先到先服務(wù)的算法,這個(gè)算法用到了隊(duì)列的數(shù)據(jù)結(jié)構(gòu)先進(jìn)先出的思想。所有的線程組成了一個(gè)隊(duì)列,最先進(jìn)入隊(duì)列的線程最先獲得處理器的執(zhí)行,如果執(zhí)行完則放出隊(duì)列,如果沒(méi)有執(zhí)行完自己又選擇暫停則又被放回隊(duì)列等待執(zhí)行的。這種算法看似簡(jiǎn)單,但是對(duì)于線程執(zhí)行任務(wù)的時(shí)間長(zhǎng)短并未作限制。相比之前集中算法,它還是凸顯出一些硬傷。windows的調(diào)度算法是前面集中方法的組合。可以說(shuō)它是一個(gè)搶占式的,支持多處理器的調(diào)度算法。用鏈表的方式存儲(chǔ)每個(gè)處理器要處理的線程,不同優(yōu)先級(jí)的線程分別屬于不同的鏈表。當(dāng)一個(gè)線程滿足執(zhí)行條件時(shí),它首先被掛到當(dāng)前處理器的一個(gè)待分配的鏈表中,然后在適當(dāng)?shù)臅r(shí)候?qū)⑵浞诺侥硞€(gè)處理器對(duì)應(yīng)的優(yōu)先級(jí)的鏈表中。當(dāng)處理器在選擇線程執(zhí)行時(shí)就會(huì)根據(jù)線程的優(yōu)先級(jí)選擇線程。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (未完待續(xù).............)
轉(zhuǎn)載于:https://www.cnblogs.com/suncoolcat/p/3424166.html
總結(jié)
以上是生活随笔為你收集整理的熬之滴水成石:最想深入了解的内容--windows内核机制(6)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mongodb----集合而定多种查询方
- 下一篇: sharepoint 2007页面显示真