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

Linux 進程間通信 (IPC) 六大機制深度解析:管道、訊號量、訊號、訊息佇列、共享記憶體、Socket

編輯:Linux 教學

本文系統剖析 Linux 繼承自 Unix 的六大經典 IPC 機制,涵蓋原理、API、特性、適用場景與選型建議,為系統程式開發者提供決策參考。

一、管道 — 位元流的單向通道

無名管道

  • pipe(fd) 建立,fd[0] 讀、fd[1] 寫。
  • 半雙工、單向、僅限親緣進程 (fork 繼承 fd)。
  • 核心環形緩衝,讀寫遵循 FIFO,原子性保證 PIPE_BUF (通常 4KB/64KB)。

命名管道 (FIFO)

  • mkfifo(path, mode) 建立檔案系統節點。
  • 打破親緣限制,任意進程可開啟路徑通信。
  • 同為半雙工、有容量上限,寫端無讀端時收 SIGPIPE。

二、訊號量 — 同步互斥的原子計數器

  • 本質:受保護整數,僅支援 P (wait) / V (signal) 兩個原子操作。
  • POSIX: sem_init/sem_wait/sem_post/sem_destroy (執行緒/進程共享)。
  • System V: semget/semop/semctl (訊號量集,進程間共享)。
  • 常作**鎖**保護共享資源或**資源池**計數 (連線池、緩衝槽位)。

三、訊號 — 非同步事件通知

  • 核心向進程投遞預定義事件 (硬體異常、終端鍵盤、定時器、子進程變化、I/O 就緒…)。
  • 三種處置:預設動作 (終止/核心傾印/忽略/暫停/繼續)、忽略、捕捉 (sigaction handler)。
  • **不可靠**:標準訊號不排隊,多次發送可能合併;實時訊號 (SIGRTMIN+) 支援排隊與 sigval 負載。

四、訊息佇列 — 結構化訊息的鏈表

  • 核心維護佇列向量表,每佇列為訊息鏈表,訊息含 long mtype 供優先級/類型過濾。
  • System V: msgget/msgsnd/msgrcv/msgctl;POSIX: mq_open/mq_send/mq_receive/mq_notify (支援非同步通知)。
  • 解決管道「無格式、緩衝小」與訊號「資訊量少」痛點。

五、共享記憶體 — 零拷貝的極速通道

  • 將同一物理頁映射至多進程虛擬位址,**無資料拷貝**,延遲最低。
  • System V: shmget/shmat/shmdt/shmctl;POSIX: shm_open/mmap。
  • **核心不提供同步**,必須搭配訊號量/互斥鎖/RCU 保護並發存取。
  • 適用:大量高頻資料交換 (影像幀、訊號處理、資料庫緩衝池)。

六、Socket — 跨主機通用端點

  • 不限本機,支援跨網路 (TCP/UDP/Unix Domain/Netlink…)。
  • Unix Domain Socket (AF_UNIX) 本機通信更快 (無協議棧),支援傳遞檔案描述符 (SCM_RIGHTS)。
  • 標準 API: socket/bind/listen/accept/connect/send/recv,配合 epoll/io_uring 實現高並發。

七、選型決策速查表

場景首選機制備選/補充
父子進程簡單單向流無名管道
無親緣進程小資料塊命名管道 (FIFO)Unix Domain Socket
多進程/執行緒同步互斥訊號量 / mutex條件變數
非同步事件通知訊號eventfd + epoll
結構化訊息、優先級訊息佇列 (POSIX mq)ZeroMQ/nanomsg
大資料量高頻零拷貝共享記憶體 + 訊號量memfd + userfaultfd
跨主機服務/RPCTCP Socket (gRPC/HTTP)rdma/cm

結語

沒有萬能 IPC,只有適合場景的選擇。現代高效能系統傾向:本機用 Unix Domain Socket + 共享記憶體;跨節點用 TCP Socket + 協議框架;簡單協作用管道/FIFO;複雜同步用 POSIX 訊號量/互斥鎖/條件變數。深入理解各機制邊界與代價,方能架構穩健高效的並發系統。

Copyright © Windows教程網 All Rights Reserved