DPC究竟是什么


DPC究竟是什么

DPC是“Deferred Procedure Call”的縮寫,意為推遲了的過程(函數)調用。這是因為,邏輯上應該放在中斷服務程序中完成的操作並非都是那么緊迫,其中有一部分可能相對而言不那么緊迫,而又比較費時間,實際上可以放在開中斷的條件下執行。如果把這些操作都放在中斷服務程序中,就會使關閉中斷的時間太長而引起中斷請求的丟失,因為整個中斷服務程序通常都是在關中斷的條件下執行的。為此,把中斷服務程序中不那么緊迫卻比較費時,而又不必在關中斷條件下執行的操作分割出來,放在另一個函數中,在開中斷的條件下加以執行,就可以縮短關中斷的時間。這樣的函數就是DPC函數。一般而言,中斷服務前期的操作是比較緊迫的,並且是必須關中斷的,此時可以很快地對外部設備進行操作。此后,剩下的那部分操作便可以稍后在開中斷的條件下執行。所以有人曾經把這部分操作稱為中斷服務的“后半(Bottom Half)”,也有人把這兩半分別稱為“硬中斷”和“軟中斷”。之所以要把中斷服務分成前后兩半,是因為一次中斷服務的后半不如另一次中斷的前半那么緊迫。

為此,內核中要有個DPC請求隊列,中斷服務程序執行完它的“前半”之后就把一個DPC請求掛入這個隊列,要求內核調用相應的DPC函數,然后(形式上)就從中斷返回了。接着,如果沒有別的中斷請求,內核就會掃描這個DPC請求隊列,依次在開中斷的條件下執行這些DPC函數,直至又發生中斷或執行完隊列中的所有DPC函數。至於當前線程所要執行的程序,則只有在DPC請求隊列為空的時候才會繼續得到執行。顯然,這里所體現的是“急事急辦”的原則,中斷是最急的,DPC函數其次,最后才是當前線程。Windows內核的IRQL(即運行級別)就反映了這些活動的輕重緩急,DPC函數是在DISPATCH_LEVEL級別上執行的。

與DPC函數的執行有關的另一個問題是堆棧的使用。我們知道,中斷服務程序所使用的堆棧就是當前線程的系統空間堆棧。中斷服務程序一般都是比較輕小的,占用一下當前線程的堆棧不至於會有問題;但是DPC函數就不同了,DPC函數有可能是比較大的,如果仍舊占用當前線程的堆棧,在最壞的情況下有可能造成堆棧溢出,所以最好是為DPC函數的執行另外配備一個堆棧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM