Windows 本地過程呼叫
Windows 中的訊息傳遞機制稱為本地過程呼叫 (LPC) 機制。LPC 用於同一臺機器上兩個程序之間的通訊。它類似於廣泛使用的標準遠端過程呼叫 (RPC) 機制,但它針對 Windows 進行了最佳化,並且是 Windows 特有的。Windows 使用埠物件來建立和維護兩個程序之間的連線,就像 Mach 一樣。Windows 使用兩種型別的埠:連線埠和通訊埠。
通訊工作原理如下:
伺服器程序釋出對所有程序可見的連線埠物件。
當客戶端需要子系統的服務時,它會開啟伺服器連線埠物件的控制代碼,並向該埠傳送連線請求。然後伺服器建立一個通道並向客戶端返回一個控制代碼。
該通道包含一對私有的通訊埠:一個用於客戶端到伺服器的訊息,另一個用於伺服器到客戶端的訊息。通訊通道還支援回撥機制,允許客戶端和伺服器在通常預期回覆時接受請求。
建立 LPC 通道時,會選擇三種訊息傳遞技術之一:
對於小型訊息(最多 256 位元組),埠的訊息佇列用作中間儲存,並將訊息從一個程序複製到另一個程序。
對於大型訊息,必須透過節物件傳遞,節物件是與通道關聯的共享記憶體區域。
提供了一個 API,允許伺服器程序直接讀寫客戶端的地址空間,如果資料量太大而無法放入節物件中。
客戶端在設定通道時決定它是否需要傳送大型訊息。如果客戶端確定它確實要傳送大型訊息,它會請求建立一個節物件。同樣,如果伺服器確定回覆將很大,則它將建立一個節物件。現在要使用節物件,會發送一條小型訊息,其中包含關於節物件的指標和大小資訊。此方法比上面列出的第一種方法更復雜,但它避免了資料複製。需要注意的是,Windows 中的 LPC 機制不是 Windows API 的一部分,因此應用程式程式設計師看不到它。而使用 Windows API 的應用程式呼叫標準遠端過程呼叫。當在同一系統上的程序上呼叫 RPC 時,RPC 透過 LPC 間接處理。此外,許多核心服務使用 LPC 與客戶端程序進行通訊。下圖顯示了 Windows 中本地過程呼叫的結構。
圖:Windows 中的本地過程呼叫