在windows操作系統(tǒng)內(nèi)核中,首先要明白四個(gè)概念,apc(異步過程調(diào)用),dpc(延遲過程調(diào)用),irp(io請(qǐng)求包)以及基于優(yōu)先級(jí)的搶占式調(diào)度,下面分別解釋: 
1.apc。 異步過程調(diào)用類似于linux下的信號(hào),只不過信號(hào)處理函數(shù)的執(zhí)行需要兩步:設(shè)置和觸發(fā),而apc則只有一步,只需要將apc回調(diào)函數(shù)排入線程的apc對(duì) 列,它就總會(huì)被執(zhí)行的。apc對(duì)列對(duì)于每個(gè)線程有兩個(gè),一個(gè)是用戶空間的apc對(duì)列,一個(gè)是內(nèi)核空間的apc對(duì)列,apc函數(shù)運(yùn)行在apc優(yōu)先級(jí)上,它一 般高于用戶線程的優(yōu)先級(jí)。 
2.dpc。延遲過程調(diào)用一般用于中斷的后期處理。中斷可在任何進(jìn)程(線程)的上下文里面運(yùn)行,而且一般情況下中斷處理 函數(shù)要關(guān)閉相應(yīng)中斷,以防重入,為了使這種不確定的情況時(shí)間最小化,windows只會(huì)在中斷處理函數(shù)里面呆一小會(huì),然后排隊(duì)一個(gè)dpc,從而退出中斷,dpc在低于isr的優(yōu)先級(jí)運(yùn)行,因此它可被硬件中斷中斷。 
3.irp。這在windows里是一個(gè)異常重要的概念,它直接導(dǎo)致 windows的設(shè)計(jì)理念和類unix以及unix的設(shè)計(jì)理念的不同。一個(gè)irp封裝了一個(gè)io操作過程,它的內(nèi)部是一個(gè)棧結(jié)構(gòu),每個(gè)棧幀代表一個(gè)驅(qū)動(dòng)程 序模塊,其中封裝了此驅(qū)動(dòng)的回調(diào)函數(shù),irp就是一級(jí)一級(jí)往下層驅(qū)動(dòng)傳遞從而完成一個(gè)io操作。 
4.基于優(yōu)先級(jí)的搶占式調(diào)度。這個(gè)是 windows下的調(diào)度策略,它完全基于優(yōu)先級(jí)(還有時(shí)間片,但不影響什么,時(shí)間片對(duì)所有進(jìn)程的策略一樣),而不是其它。如果有更高優(yōu)先級(jí)線程就緒,那么它將馬上搶占當(dāng)前線程。就連中斷都有自己優(yōu)先級(jí),呵呵,當(dāng)然它是最高的...windows的響應(yīng)性依賴于動(dòng)態(tài)優(yōu)先級(jí)提升,但是這就牽扯到別的方面了,和這篇文章的主題不對(duì),因此不討論。 
明白了上面的概念以后,我們就可以繼續(xù)了。 
windows的io操作步驟如下: 
1.應(yīng)用程序調(diào)用ReadFile函數(shù) 
2.ntdll.dll將用戶請(qǐng)求陷入內(nèi)核空間繼續(xù)處理,由io管理器接管 
3.io管理器創(chuàng)建一個(gè)irp,然后根據(jù)用戶請(qǐng)求填充其字段,接著將其交給最上層驅(qū)動(dòng)程序 
4.驅(qū)動(dòng)程序一層一層將irp傳給硬件設(shè)備后一層層返回。注意,每往下傳遞一層都要注冊(cè)io完成回調(diào)。 
到這里,如果是異步調(diào)用,那么就可以返回用戶空間處理了,如果是同步的,則在io管理器那里被阻塞,io操作還沒有完,接著往下看: 
5.硬件操作完成,產(chǎn)生中斷,中斷排隊(duì)一個(gè)dpc后返回 
6.dpc運(yùn)行,調(diào)用驅(qū)動(dòng)的完成例程 
7.每層的完成例程相繼被調(diào)用,控制流一層層的返回給io管理器 
8.將ReadFileEx中的用戶apc排隊(duì)(異步情況下),這個(gè)apc將在不長(zhǎng)的時(shí)間內(nèi)被調(diào)用,因?yàn)樗膬?yōu)先級(jí)高于用戶線程。 
以 上就是windows的io流程,可見,irp的自洽性與獨(dú)立性使得一切成為可能,irp包含了足夠的信息足以使io操作脫離線程環(huán)境,這也是 windows內(nèi)核整體的設(shè)計(jì)理念----模塊化。windows的優(yōu)先級(jí)控制非常巧妙,有個(gè)概念叫“中斷請(qǐng)求級(jí)”,就是將cpu的運(yùn)行分成了不同的級(jí)別分別為:PASSIVE_LEVEL---DISPATCH_LEVEL---PROFILE_LEVEL,windows將任務(wù)在這幾個(gè)優(yōu)先級(jí)中分配, 使得操作變得簡(jiǎn)單,它基于一條原則:一旦某CPU執(zhí)行在高于PASSIVE_LEVEL的IRQL上時(shí),該CPU上的活動(dòng)僅能被擁有更高IRQL的活動(dòng)搶先。這條原則保證了很多操作可以安全進(jìn)行,比如io派遣例程運(yùn)行在PASSIVE_LEVEL上,而從irp對(duì)列拽一個(gè)irp以求處理的dpc運(yùn)行在DISPATCH_LEVEL,這樣就不會(huì)有任何派遣例程打擾一個(gè)irp的操作,從而省去了鎖的操作,在一個(gè)硬件中斷中,運(yùn)行在硬件中斷優(yōu)先級(jí)的cpu將一個(gè)dpc排入該cpu對(duì)列,中斷完畢后cpu降至DISPATCH_LEVEL優(yōu)先級(jí),dpc得以執(zhí)行...優(yōu)先級(jí)控制正是windows的一大特色。 
綜上我們明白了windows異步io的幾大要素:1.獨(dú)立自洽的irp結(jié)構(gòu);2.優(yōu)先級(jí)的控制。進(jìn)一步抽象到了windows的設(shè)計(jì)思想:模塊化。windows本身是微內(nèi)核系統(tǒng),而微內(nèi)核就是模塊化的。 
反觀linux的異步io,其實(shí)現(xiàn)就是在原來同步阻塞點(diǎn)直接返回,然后在以后重試,負(fù)責(zé)重試的在老內(nèi)核不支持異步io的情況下是一系列用戶線程,而在 2.6以后是工作隊(duì)列,而工作隊(duì)列本質(zhì)上是一個(gè)內(nèi)核線程,由此可見,linux中并沒有和windows對(duì)應(yīng)的dpc的概念,如果非要拉出來一個(gè)長(zhǎng)得像的,那就是softirq了,但是也就僅僅執(zhí)行點(diǎn)像,實(shí)際上softirq在大多數(shù)情況下是由softirqd內(nèi)核線程執(zhí)行的,為的就是不讓 softirq(dpc?)長(zhǎng)期占據(jù)處理器,試想一個(gè)多網(wǎng)卡的高負(fù)載的服務(wù)器,softirq幾乎占據(jù)了很大一塊cpu資源,于是乎,不管什么,不管你多 特殊,一律統(tǒng)一接收線程調(diào)度程序的調(diào)度,這就是公平。而在windows中卻顯得不那么公平,當(dāng)然也可以在windows驅(qū)動(dòng)里面自覺地建立內(nèi)核線程,但是那畢竟不是系統(tǒng)提供的功能啊! 
linux和unix一脈相承,簡(jiǎn)單,公平,統(tǒng)一可能就是它們的品質(zhì),一切都是文件,一切接受調(diào)度,接口統(tǒng)一;windows相比就顯得有些花花綠綠了, 但我還是很欣賞它的優(yōu)先級(jí)控制方案。傳統(tǒng)unix本質(zhì)上是同步的,因?yàn)樗?jiǎn)單,受控性很好,可預(yù)測(cè),所以它穩(wěn)定,如果在內(nèi)核一個(gè)函數(shù)阻塞了,進(jìn)程不能繼續(xù)了,unix的做法就是直接調(diào)度schedule,而windows的做法就是異步喚醒,然后調(diào)整優(yōu)先級(jí)之類的,因?yàn)樗举|(zhì)就是異步的。linux最近吸取了unix和windows的優(yōu)點(diǎn),所以直接調(diào)度和異步喚醒在內(nèi)核均可見到,不錯(cuò)不錯(cuò),但是有些亂,變化太快,我很擔(dān)心如果linux沒有一個(gè)根本是設(shè) 計(jì)理念,隨著它復(fù)雜性增加,代碼膨脹,它會(huì)不會(huì)失控?! 
內(nèi)核穩(wěn)定性和它們的設(shè)計(jì)理念有關(guān)嗎??jī)H說一點(diǎn),windows是基于優(yōu)先級(jí)的,dpc在DISPATCH_LEVEL 運(yùn)行,除了硬中斷用戶進(jìn)程無法將它搶占,那么如果它在內(nèi)核睡眠的話.....而linux一視同仁,內(nèi)核線程和用戶線程統(tǒng)一被調(diào)度,當(dāng)然就不會(huì)頻繁掛機(jī)了....這僅僅從線程化軟中斷角度講,實(shí)際上linux下的softirq也是不能睡眠的,因?yàn)槟悴荒鼙WC每個(gè)softirq都在內(nèi)核線程上下文執(zhí)行,不過這并不是問題,現(xiàn)在的新內(nèi)核都將中斷給線程化了,還有什么做不到呢?windows的中斷請(qǐng)求優(yōu)先級(jí)實(shí)際上是一種抽象,將實(shí)際執(zhí)行硬件或軟件和執(zhí)行本身分離,這是非常不錯(cuò)的,簡(jiǎn)簡(jiǎn)單單的一個(gè)優(yōu)先級(jí)提升或降低加上一個(gè)基本原則就可以代替linux的一大堆加鎖解鎖禁用搶占之操作。 
不管是linux還是windows,其本身都運(yùn)用了統(tǒng)一,簡(jiǎn)單的思想,只不過用的地方不同,linux提供的vfs,盡量線程化,windows的優(yōu)先級(jí)控制,對(duì)象化..... 
windows和linux不愧是兩大巨猛系統(tǒng)