複製鏈接
請複製以下鏈接發送給好友

異步過程調用

鎖定
異步過程調用(asynchronous procedure call)是函數(過程)在特定線程中被異步執行。在Microsoft Windows操作系統中, APC是一種併發機制,用於異步IO或者定時器
中文名
異步過程調用
外文名
asynchronous procedure call
性    質
併發機制
領    域
計算機

目錄

異步過程調用分類

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,完成後再繼續線程的原來執行。 [1] 

異步過程調用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回調函數。 [2] 

異步過程調用併發控制

在計算機科學,特別是程序設計、操作系統多處理機數據庫等領域,併發控制(英語:Concurrency control)是確保及時糾正由併發操作導致的錯誤的一種機制。 [1] 

異步過程調用異步IO

異步IO是計算機操作系統對輸入輸出的一種處理方式:發起IO請求的線程不等IO操作完成,就繼續執行隨後的代碼,IO結果用其他方式通知發起IO請求的程序。與異步IO相對的是更為常見的“同步(阻塞)IO”:發起IO請求的線程不從正在調用的IO操作函數返回(即被阻塞),直至IO操作完成。 [1] 
參考資料
  • 1.    Article "Lazy Asynchronous I/O For Event-Driven Servers" by Willy Zwaenepoel, Khaled Elmeleegy, Anupam Chanda and Alan L. Cox
  • 2.    MSDN article: "Asynchronous Procedure Calls"