DPC和ISR的理解
首先來說中斷
計算機的中斷分為軟中斷和硬中斷,即IRQL
和DIRQL
,共32個級別,從0~31級別依次提升,0~2屬於軟中斷
一般執行緒執行於PASSIVE_LEVEL
級別,如果不想在執行時切換到其他執行緒,可以將中端級別提升致DISPATCH_LEVEL
,但執行緒在這個中端級別下執行無法使用分頁記憶體,因為無法觸發分頁中斷。可能有些記憶體地址訪問不了,藍屏。
當硬體的中斷訊號發給CPU
之後,CPU會把IRQL
級別提升致DIRQL
,作業系統開始執行ISR
(中斷服務例程)。流程大概是這個樣子
但是如果ISR
的程式碼過於複雜,我理解的是首先會影響系統的正常執行,PASSIVE_LEVEL
級別的程式碼根本不會執行。其次影響其他硬體中斷的響應。所以這時引入了DPC
執行例程。ISR
會把一些不重要的程式碼,放入DPC
佇列,當執行程式從DIRQL
降到DISPATCH_LEVEL
時,會自動執行DPC
佇列裡面的程式碼。
ISR:Interrupt Service Routines
(中斷服務例程
必須馬上做的事情,比如硬體中斷,響應滑鼠點選
DPC:Deferred Procedure Call Details
(延遲過程呼叫
可以推遲做的事情,比如大資料拷貝,U盤拷貝電影。
APC: Asynchronous Procedure Calls
(非同步過程呼叫
An asynchronous procedure call (APC) is a function that executes asynchronously in the context of a particular thread. When an APC is queued to a thread, the system issues a software interrupt. The next time the thread is scheduled, it will run the APC function. An APC generated by the system is called a kernel-mode APC. An APC generated by an application is called a user-mode APC. A thread must be in an alertable state to run a user-mode APC.
Windows中斷請求級別
IRQL | Interrupts Masked Off | Driver Routines |
---|---|---|
PASSIVE_LEVEL | None | PASSIVE_LEVEL |
APC_LEVEL | APC_LEVEL interrupts | APC_LEVEL |
DISPATCH_LEVEL | DISPATCH_LEVEL ,APC_LEVEL interrupts | DISPATCH_LEVEL |
DIRQL | All interrupts at IRQL<= DIRQL | DIRQL |
相關文章
- Windows驅動中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpaceWindows
- 【Java面試】什麼是 ISR,為什麼需要引入 ISRJava面試
- oneAPI DPC++學習資料和實驗平臺APIC++
- DPC++中的現代C++語言特性C++
- NSProxy的理解和使用
- Exception和Error的理解ExceptionError
- promise的理解和使用Promise
- Future和CompletableFuture的理解
- @bean和@component的理解Bean
- SPU和SKU的理解
- 驅動開發:核心使用IO/DPC定時器定時器
- redis api的使用和理解RedisAPI
- 對AIDL和Binder的理解AI
- 對session和cookie的理解SessionCookie
- Flink Time和Watermark的理解
- python 程式的使用和理解Python
- Promise && async/await的理解和用法PromiseAI
- 關於rpc的整理和理解RPC
- 狀態模式的理解和示例模式
- Java NIO的理解和應用Java
- SpringBoot之ApplicationContextInitializer的理解和使用Spring BootAPPContext
- 深入理解和運用Pandas的GroupBy機制——理解篇
- javascript中的prototype和__proto__的理解JavaScript
- 對javascript中的call()和apply()的理解JavaScriptAPP
- 介面和抽象理解抽象
- 如何理解 python UnicodeEncodeError 和 UnicodeDecodeError :python 的 string 和 unicodePythonUnicodeError
- 對MVP、Flux和RxAndroid框架的理解和選擇MVPUXAndroid框架
- 如何理解Spring中的IOC和AOPSpring
- 如何理解JavaScript的原型和原型鏈?JavaScript原型
- 我對部落格的理解和看法
- apply的理解和陣列降維APP陣列
- Python中__init__的用法和理解Python
- ES6 Promise的使用和理解Promise
- git:rebase(變基)的使用和理解Git
- 深入理解equals和==的區別
- 教你理解let和var的區別
- 正向代理和反向代理的形象理解
- Sqlserver鎖升級的理解和例子SQLServer