異步過程調用

異步過程調用(asynchronous procedure call)是函式(過程)在特定執行緒中被異步執行。在Microsoft Windows作業系統中, APC是一種並發機制,用於異步IO或者定時器。

分類

Windows NT作業系統中有3種APC:

•核心模式特殊APC:相應的APC函式為核心函式。在IRQL=APC_LEVEL級上有可調度的活動時,執行此類APC。會搶先所有的用戶模態以及IRQL = PASSIVE_LEVEL的核心模態下的代碼的執行。

•核心模式常規APC:在所有的核心模式特殊APC執行完畢後,核心模式常規APC在IRQL = PASSIVE_LEVEL下開始執行。會搶先所有的用戶模式代碼的執行。用於檔案系統。

•用戶模式APC:是指相應的 APC 函式位於用戶空間、在用戶空間執行。執行緒處於alertable wait狀態該APC才可以被調度執行。用戶模式下調用系統API如SleepEx,SignalObjectAndWait,WaitForSingleObjectEx,WaitForMultipleObjectsEx,MsgWaitForMultipleObjectEx等,可以使執行緒進入alertable狀態。這些API函式最終都是調用了核心中的KeWaitForSingleObject,KeWaitForMultipleObjects,KeWaitForMutexObject,KeDelayExecutionThread,KeTestAlertThread等函式。執行緒在alertable wait狀態所有核心模式API執行完畢,返回用戶模式時,核心轉去執行APC,完成後再繼續執行緒的原來執行。

API

•APC對象:為struct KAPC類型。每個APC對象必須要包含一個KernelRoutine函式指針,當這個APC被作業系統的APC dispatcher執行時,該例程首先被執行。用戶模式APCs必須包含一個NormalRoutine函式指針,所指的函式在用戶記憶體區域。核心模式常規APC也必須包含一個NormalRoutine,但運行在核心模式(即_KAPC.ApcMode==KernelMode)。核心模式特殊APC的NormalRoutine為空。任意類型的APC都可以定義一個RundownRoutine,所指函式在核心記憶體區域,當系統需要釋放APC佇列的內容時(例如執行緒退出時)被調用。

•每個執行緒有兩個APC佇列,分為用戶APC佇列和核心APC佇列。

•QueueUserAPC: 應用程式把APC放入一個執行緒的用戶模式APC佇列中;

•KeInitializeApc 處理異步IO的設備驅動程式用這個函式來初始化APC對象(為struct KAPC類型)。如果函式參數NormalRoutine為NULL,那么生成的是核心模式特殊APC對象;如果參數NormalRoutine為NULL且參數ApcMode的值是KernelMode,那么生成的是核心模式常規APC對象;否則生成用戶模式APC對象。

•KeInsertQueueApc 把完成初始化的APC對象存放到目標執行緒的APC佇列中

•KiInsertQueueApc 實際完成插入到佇列中的操作

•KiDeliverApc 即作業系統APC派發器子程式。投遞一個掛起的(pending)APC到目標執行緒。KiDeliverApc每處理完一個User APC就把UserApcPending清零,所以User APCs在返回用戶空間時還是只能投遞一次

•KiInitializeUserApc:在從核心態返回到用戶態以執行用戶模式APC時,修改環境以準備好由KeUserApcDispatcher調用User APC回調函式。

並發控制

在計算機科學,特別是程式設計、作業系統、多處理機和資料庫等領域, 並發控制(英語:Concurrency control)是確保及時糾正由並發操作導致的錯誤的一種機制。

異步IO

異步IO是計算機作業系統對輸入輸出的一種處理方式:發起IO請求的執行緒不等IO操作完成,就繼續執行隨後的代碼,IO結果用其他方式通知發起IO請求的程式。與異步IO相對的是更為常見的“同步(阻塞)IO”:發起IO請求的執行緒不從正在調用的IO操作函式返回(即被阻塞),直至IO操作完成。

相關詞條

相關搜尋

熱門詞條

聯絡我們