Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Windows 綜合教學 >> 關於 Windows

Windows 進程間通訊 (IPC) 核心技術:記憶體映射檔 (File Mapping) 完整實作指南

編輯:關於 Windows

Windows 提供多種 IPC 機制(Socket、Pipe、Mailslot、RPC、COM),但共享記憶體 (Shared Memory) 是延遲最低、吞吐最高的核心方式。底層透過 File Mapping API 實現:將實體記憶體區域映射到多個進程的虛擬位址空間,實現零拷貝資料交換。

核心 API 流程

// 1. 建立/開啟檔案映射物件
HANDLE hMap = CreateFileMapping(
    INVALID_HANDLE_VALUE,  // 無實體檔案,使用分頁檔
    &sa,                   // SECURITY_ATTRIBUTES,bInheritHandle=TRUE 可讓子進程繼承
    PAGE_READWRITE,        // 頁面保護屬性
    0,                     // dwMaximumSizeHigh (64-bit 大小高 32 位)
    size,                  // dwMaximumSizeLow (最大 4GB)
    L"Global\\MySharedMem" // 命名物件,跨進程開啟
);

// 2. 映射視圖到進程虛擬位址
LPVOID pView = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

// 3. 讀寫資料(需自行同步,如 Mutex/Event)
// ...

// 4. 清理
UnmapViewOfFile(pView);
CloseHandle(hMap);

進階主題

1. 跨進程傳遞 Handle 的三種方式

  • 命名物件:CreateFileMapping 指定名稱,另一進程用 OpenFileMapping 開啟。簡單但需協調名稱衝突。
  • DuplicateHandle:父進程 DuplicateHandle 複製 Handle,透過命令列、環境變數、共用記憶體或 IPC 訊息傳遞給子進程。優雅且安全。
  • Handle 繼承:CreateFileMapping 時 SECURITY_ATTRIBUTES.bInheritHandle=TRUE,配合 CreateProcess(bInheritHandles=TRUE),核心自動複製 Handle 到子進程(Handle 值相同),無需額外傳遞。

2. 大檔案分段映射

MapViewOfFile 可指定 dwFileOffsetHigh/Low 與 dwNumberOfBytesToMap,將 >4GB 檔案分段映射到 32 位址空間(或 64 位進程 2GB 使用者空間限制)。

3. 父子進程同步範例

// 父進程
SECURITY_ATTRIBUTES sa = {sizeof(sa), NULL, TRUE};
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, 4096, NULL);
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
CreateProcess(L"Child.exe", L"Child.exe 1234", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
// Handle 1234 自動繼承到子進程,子進程直接用此值 MapViewOfFile

4. 重要注意事項

  • CreateProcess 的 lpCommandLine 必須指向可寫緩衝區(不可用字串常值),否則會崩潰。
  • STARTUPINFO 建議用 GetStartupInfo 取得預設值再修改,避免結構未初始化。
  • 子進程結束前必須 CloseHandle 釋放引用計數,否則核心物件洩漏。
  • 同步機制:共享記憶體本身不提供同步,必須搭配 Mutex、Event、Semaphore 或 Interlocked* 原子操作。

適用場景

  • 高頻率、大資料量進程間交換(影像幀、音訊緩衝、即時遙測)。
  • 單機多進程架構(如 Chrome 多進程、資料庫共用快取)。
  • 需避免序列化/反序列化開銷的高效能場景。
Copyright © Windows教程網 All Rights Reserved