-
本地過程調用
鎖定
- 中文名
- 本地過程調用
- 外文名
- Local Procedure Call
- 縮 寫
- LPC
- 領 域
- 計算機
本地過程調用簡介
本地過程調用(LPC,Local Procedure Call,通常也被稱為輕量過程調用或者本地進程間通信) 是一種由Windows NT內核提供的內部進程間通信方式。通過這一方式,同一計算機上的進程可以進行輕量的通信。在Windows Vista中,ALPC(Advanced Local Procedure Call,高級本地進程通信)替代了LPC。ALPC提供了一個高速可度量的通信機制,這樣便於實現需要在用户模式下高速通信的用户模式驅動程序框架(UMDF,User-Mode Driver Framework)。
[1]
本地過程調用實現
LPC由內核的“端口”對象實現,這樣可以確保安全(由訪問控制表規定持有特定的安全標識符才可以訪問)並可以驗證鏈接另一端進程的身份。程序也可以對每一個信息設定安全標識符,並測試對應信息的變化,以實現每一條消息的安全性。
服務端和客户端之間典型的連接由下列過程表示:
- 服務端進程建立命名服務器連接端口對象,並等待客户端連接;
- 客户端通過向這一端口發送消息來建立連接;
- 如果服務端同意建立連接,便會建立兩個無名端口:
- 客户端連接端口:客户線程由此向服務端發送數據;
- 服務端連接端口:服務端由此向客户端發送數據;每個客户端都分配一個獨立的接口;
- 服務端持有一個服務連接端口的句柄,同時客户端也持有一個客户連接端口的句柄,這樣進程間通信的通道就建立了。
本地過程調用支持以下三種交換信息的方式:
- 針對較短信息(小於256字節):系統內核在進程間直接複製消息,從發送方的地址空間拷貝消息至系統地址空間,之後再將消息拷貝至接收方的地址空間。
- 針對較長消息(大於256字節):這需要在發送方和接收方之間建立一個共享內存區域。發送方首先將消息存放在共享內存中,再向接收方發送一個通知(可以通過如上發送短消息的方式實現),之後再由接收方從共享內存中讀取這一消息。
- 當消息的數據量過大,難以放入共享內存時,服務端可以直接讀取和寫入客户端的地址空間。
高級本地過程調用(ALPC)擁有比以往的本地過程調用(LPC)更優的性能。因為LPC只能通過同步請求/應答機制通信,而ALPC還可以使用IOCP實現通信。這樣,ALPC就可以在消息數量和進程數量間保持一定平衡,保證了端口的高速通信。此外,ALPC還允許信息的批量傳輸,減少了進程在用户模式和內核模式之間的切換次數。
[2]
本地過程調用典型應用
本地過程調用在Windows NT及其衍生系統中得到了廣泛應用。在Win32子系統中,LPC應用於客户端和子系統服務器之間的通信(CSRSS)。在Windows NT 3.51版本中引入了快速LPC以提高調用速度。然而由於NT4.0中將部分關鍵服務端移入內核模式(win32k.sys)以提高系統效能,這一方法已基本被摒棄。
正如前文提到的,當消息在同一計算機內傳輸時,Microsoft RPC將調用LPC進行通信。許多僅在同一計算機內進行通信的服務採用LPC作為唯一的通信方式。遠程對象連接與嵌入和分佈式組件對象模型的實現也在很多地方使用了LPC作為本地通信的方式。
[2]