「城裡的人想出去,城外的人想進來。」進程完全隔離利於穩定,但阻礙信息共享;線程完全共享利於通信,但缺乏隱私。共享內存與線程局部存儲(TLS)正是為打破這兩個極端而生的關鍵機制。
MMU 將進程虛擬地址映射到不同物理頁框,實現隔離。頁大小通常 4KB。物理內存不足時,內核將非熱頁換出到交換分區。TLB 緩存近期地址轉換加速訪問。缺頁中斷觸發頁面調入。
核心思想:將不同進程的虛擬頁映射到同一物理頁框。如圖所示,進程 A 和 B 的虛擬頁均映射到物理內存的黃色頁框,實現數據共享。


INT 3 指令shmget() / shm_open():創建/獲取共享內存對象shmat() / mmap():映射到進程地址空間shmdt() / munmap():解除映射shmctl():控制操作(刪除、鎖定等)同步機制(信號量、互斥鎖)通常配合使用,防止競態條件。
線程共享進程地址空間,全局/靜態變量天然共享。但錯誤碼(errno)、線程專用上下文、非線程安全庫的狀態等,必須線程私有。
__thread (GCC)、__declspec(thread) (MSVC) 關鍵字pthread_key_create、pthread_setspecific、pthread_getspecificerrno:各線程獨立錯誤碼| 特性 | 共享內存 | TLS |
|---|---|---|
| 作用範圍 | 進程間 | 線程內 |
| 數據共享 | 是,多進程可見 | 否,線程私有 |
| 同步需求 | 必須(信號量/鎖) | 無需(私有) |
| 生命周期 | 內核持久,進程退出釋放 | 線程結束自動銷毀 |
| 典型用途 | 大數據交換、進程間通信 | 線程上下文、錯誤碼隔離 |
共享內存與 TLS 是系統編程工具箱中的利器。前者連接孤島進程,後者保護線程隱私。掌握其原理與 API,能在高併發、高性能場景下遊刃有餘。記住:共享需同步,隔離才安全。