【Note】《深入理解Linux內核》 第十九章:深入理解 Linux 進程通信機制

《深入理解Linux內核》 第十九章:深入理解 Linux 進程通信機制(Process Communication)

關鍵詞:IPC、信號、管道、FIFO、消息隊列、信號量、共享內存、套接字、內核對象、同步機制


一、進程通信概述

1.1 為什么需要進程通信

在 Linux 系統中,進程是資源隔離的基本單位,彼此間通常無法直接訪問彼此的地址空間。因此需要一套機制,使得多個進程之間可以:

  • 交換數據
  • 同步行為
  • 發送通知
  • 共享資源

這些功能由 Linux IPC(Inter-Process Communication)子系統實現。

1.2 IPC 分類

類型描述
信號最基本的異步通知機制
管道/FIFO字節流通信機制,面向數據流
消息隊列面向結構化消息,先進先出
信號量同步與互斥,典型用于資源控制
共享內存多進程映射同一段內存,效率最高
套接字網絡與本地通信統一抽象,支持多協議

二、信號(Signal)

2.1 概述

信號是進程間最早被引入的通信機制,本質上是一個異步事件通知。

示例信號描述
SIGINT中斷(Ctrl+C)
SIGTERM終止進程請求
SIGKILL無條件終止進程(不可捕獲)
SIGCHLD子進程結束通知父進程

2.2 信號相關系統調用

  • kill(pid, sig):向指定進程或進程組發送信號;
  • signal(sig, handler):設置信號處理函數;
  • sigaction():更強大的信號控制;
  • sigprocmask():阻塞/允許某些信號;
  • sigqueue():帶參數的信號發送。

2.3 內核實現

  • 每個進程結構 task_struct 中包含 sigpendingsignal 字段;
  • 信號通過 do_signal() 派發;
  • 某些信號是不可忽略/不可屏蔽的(如 SIGKILL);
  • Linux 通過實時信號(SIGRTMIN ~ SIGRTMAX)支持有序隊列與附加參數。

三、管道與 FIFO

3.1 管道(pipe)

管道是最基本的 IPC 數據流機制,數據在兩個進程間以 FIFO 形式流動。

int pipe(int pipefd[2]); // pipefd[0]=read, pipefd[1]=write

特點:

  • 半雙工(單向通信);
  • 父子進程間常見用途;
  • 基于內核中的 pipe_inode_info 結構實現;
  • 使用緩沖區環形隊列實現數據傳輸。

3.2 命名管道(FIFO)

可跨進程、不限于親緣關系:

mkfifo /tmp/myfifo

特點:

  • 是一種特殊文件;
  • 可在 shell 中使用 < /tmp/myfifo> /tmp/myfifo

3.3 內核實現

  • 管道是內核中一種特殊的字符設備;
  • 每個 pipe 被表示為一個 inode;
  • 內核用 struct pipe_inode_info 管理緩沖區、讀寫端等。

四、消息隊列(Message Queues)

4.1 概述

消息隊列允許進程以“消息”為單位進行通信,每條消息是結構化數據(類型 + 數據內容)。

int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

4.2 內核數據結構

struct msg_queue {struct list_head q_messages;...
};
  • 所有消息鏈入 q_messages
  • 支持按類型匹配接收;
  • 消息大小有限制(msgmax)。

4.3 特點

  • 支持異步發送、同步接收;
  • 按優先級接收;
  • 屬于 System V IPC 之一;
  • 支持權限與 quota 控制。

五、信號量(Semaphores)

5.1 概述

信號量提供一種同步機制,用于控制多個進程對共享資源的訪問,支持阻塞和非阻塞操作。

int semget(key_t key, int nsems, int semflg);
int semop(int semid, struct sembuf *sops, size_t nsops);
  • 每個信號量集合由 semid 索引;
  • semop() 支持加鎖/解鎖操作(P/V操作);
  • 使用計數表示資源狀態。

5.2 內核結構

struct sem_array {struct sem *sem_base;...
};
  • Linux 信號量集支持原子操作;
  • 支持 undo 機制,在進程終止時自動釋放資源;
  • 屬于 System V IPC 范疇,現代內核中逐漸被 futex 和 pthread 替代。

六、共享內存(Shared Memory)

6.1 概述

多個進程將一段物理內存映射到各自虛擬地址空間,實現高效通信。

int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);

特點:

  • 速度最快的 IPC;
  • 通常配合信號量/互斥鎖使用;
  • 屬于 System V IPC;

6.2 內核實現

  • 使用 shmid_kernel 描述共享段;
  • 實質上是內核為各進程映射同一段物理頁;
  • 頁表項被多個進程共享;
  • 寫時復制(COW)策略在此無效。

七、套接字通信(Socket)

7.1 套接字種類

類型描述
UNIX 域套接字僅限本機通信,文件系統路徑尋址
INET 套接字網絡通信,使用 IP 與端口
STREAM面向連接,類似 TCP
DGRAM無連接,類似 UDP

7.2 創建通信過程

int socket(int domain, int type, int protocol);
int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen);
int connect(int sockfd, struct sockaddr *addr, socklen_t addrlen);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • socket 通信是最通用的進程通信方式;
  • 在內核中通過 sock 結構表示;
  • 數據緩沖使用 sk_buff 結構管理。

八、Linux IPC 統一接口

Linux 提供 /proc/sysvipc/ 系統接口與 ipcs 工具來統一查看 IPC 對象:

ipcs -m   # 共享內存
ipcs -q   # 消息隊列
ipcs -s   # 信號量

可以使用 ipcrm 刪除對象。


九、IPC 命名空間與隔離(Namespace)

9.1 IPC Namespace

每個 IPC 對象(shm、sem、msg)都可以在命名空間中隔離,容器技術(如 Docker)廣泛使用。

  • 創建 IPC namespace:unshare --ipc
  • 每個命名空間有獨立的 IPC 資源空間;
  • 安全、穩定、互不干擾。

十、內核源碼參考路徑

文件路徑作用描述
kernel/signal.c信號實現與分發
ipc/msg.c消息隊列實現
ipc/sem.c信號量實現
ipc/shm.c共享內存實現
fs/pipe.c管道與 FIFO 實現
net/unix/af_unix.cUNIX 域 socket 實現
include/linux/ipc_namespace.hIPC 命名空間
include/linux/shm.h共享內存頭文件

十一、小結

  • Linux 提供多種 IPC 機制,各有優缺點與適用場景;
  • 信號適合簡單事件通知;
  • 管道與 FIFO 適合流式數據傳輸;
  • 消息隊列支持結構化數據傳遞;
  • 信號量用于同步資源控制;
  • 共享內存效率最高,但需額外同步手段;
  • 套接字最通用,跨主機通信也適用;
  • IPC 命名空間提升系統隔離性與安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88105.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Mac 從 0 到 1 保姆級配置教程 19】- 英語學習篇-我的英語工作流分享(AI 輔助學習)

文章目錄前言聽力沉浸式翻譯閱讀Easydict配置自定義字典&#xff08;重點&#xff09;歐陸詞典沙拉查詞沉浸式翻譯寫作Eearthworm英文提問口語最后學習資料系列教程前言 本文介紹一下我日常如何學習和使用英語的工作流&#xff0c;包括一些常用好用的工具&#xff0c;好的工具…

從庫函數到API接口,深挖不同語言背后的“封裝”與“調用”思想

個人主頁-愛因斯晨 優秀文章推薦 文章目錄個人主頁-愛因斯晨優秀文章推薦引言一、三種調用機制概述C語言的庫函數Python 的導包機制Java 的 API 接口調用綜上&#xff1a;二、它們的相同點&#xff1a;封裝與調用三、不同之處**對比核心維度****細節串講**1. **C 語言&#xf…

基于NCNN框架在Android平臺實現YOLOv8目標檢測模型的高效部署與實踐

隨著移動設備計算能力的提升&#xff0c;越來越多的深度學習模型被部署到移動端&#xff0c;以實現實時、低延遲的應用場景。YOLO系列的在目標檢測任務中表現出色&#xff0c;具有精度高、速度快的優勢。本文將詳細介紹如何基于NCNN框架 &#xff0c;在Android平臺 上高效部署Y…

華為動態路由配置

問題描述&#xff1a;針對四個路由器在不同的網段場景中&#xff0c;對四個路由器進行動態路由配置。下面以如下場景為例&#xff0c;介紹詳細配置過程。配置過程&#xff1a; 1、每個路由器的接口配置IP地址 路由器AR1中每個接口配置IP地址。 sys # 進入系統視圖 interface g…

分布式事務解決方案(三)

在Java分布式系統領域&#xff0c;傳統強一致性方案&#xff08;如2PC、3PC&#xff09;在高并發、復雜業務場景下暴露出性能瓶頸和阻塞問題。而Saga模式與事件溯源&#xff08;Event Sourcing&#xff09;作為更具彈性和擴展性的解決方案&#xff0c;逐漸成為分布式事務處理和…

【時時三省】(C語言基礎)通過指針引用數組

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省數組元素的指針一個變量有地址&#xff0c;一個數組包含若干元素&#xff0c;每個數組元素都在內存中占用存儲單元&#xff0c;它們都有相應的地址。指針變量既然可以指向變量&#xff0c;當然…

【WEB】Polar靶場 21-25題 詳細筆記

二十一.php very nicephp又是你 ,但是經過這么多次折磨后我感覺我已經有一點抗性了老規矩&#xff0c;先看知識點PHP 序列化是將 PHP 變量&#xff08;如對象、數組&#xff09;轉換為字符串的過程&#xff0c;便于存儲或傳輸。反序列化則是將字符串還原為原始變量。這在緩存、…

【Guava】1.0.設計虛擬機的方向

【Guava】1.0.設計虛擬機的方向虛擬機是什么&#xff1f;棧式虛擬機棧式虛擬機的優缺點題外話虛擬機是什么&#xff1f; 虛擬機&#xff08;VirtualMachine, VM&#xff09;是一種計算機程序或系統&#xff0c;它通過軟件模擬物理計算機的硬件運行環境&#xff0c;使得多個操作…

[附源碼+數據庫+畢業論文]基于Spring+MyBatis+MySQL+Maven+jsp實現的高校實驗室資源綜合管理系統,推薦!

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本高校實驗室資源綜合管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大…

Spring Boot:影響事務回滾的幾種情況

一、Controller 捕獲異常導致事務失效 需求 我們有一個用戶注冊服務&#xff0c;注冊時需要&#xff1a; 創建用戶賬戶分配初始積分發送注冊通知 這三個操作需要在同一個事務中執行&#xff0c;任何一步失敗都要回滾。 錯誤示例&#xff1a;Controller 捕獲異常導致事務失效 Re…

如何避免分布式爬蟲被目標網站封禁?

在分布式爬蟲的大規模數據采集場景中&#xff0c;避免被目標網站封禁的核心邏輯是&#xff1a;通過技術手段模擬真實用戶行為&#xff0c;降低爬蟲行為的可識別性&#xff0c;同時建立動態適配機制應對網站反爬策略的升級。以下從請求偽裝、行為控制、資源管理、反爬對抗四個維…

Maven 打包排除特定依賴的完整指南(詳細方法 + 示例)

前言 在使用 Maven 構建 Java 項目時&#xff0c;我們常常需要對項目的打包過程進行精細化控制&#xff0c;尤其是希望排除某些特定的依賴庫。這可能是為了減小最終構建產物的體積、避免版本沖突&#xff0c;或者僅僅是為了滿足不同環境下的部署需求。 本文將詳細介紹如何在 Ma…

Terraform `for_each` 精講:優雅地自動化多域名證書驗證

大家好&#xff0c;在云原生和自動化運維的世界里&#xff0c;Terraform無疑是基礎設施即代碼&#xff08;IaC&#xff09;領域的王者。它強大的聲明式語法讓我們能夠輕松地描述和管理云資源。然而&#xff0c;即使是經驗豐富的工程師&#xff0c;在面對某些動態場景時也可能會…

C++標準庫中各種互斥鎖的用法 mutex

示例 僅供參考學習 #include <mutex> #include <shared_mutex> #include <thread> #include <chrono> #include <iostream> #include <vector>// // 1. std::mutex - 基本互斥鎖 // void basic_mutex_example() {std::mutex mtx;int cou…

Android Handler機制與底層原理詳解

Android 的 Handler 機制是跨線程通信和異步消息處理的核心框架&#xff0c;它構成了 Android 應用響應性和事件驅動模型的基礎&#xff08;如 UI 更新、后臺任務協調&#xff09;。其核心思想是 “消息隊列 循環處理”。 核心組件及其關系Handler (處理器): 角色: 消息的發送…

jQuery JSONP:實現跨域數據交互的利器

jQuery JSONP&#xff1a;實現跨域數據交互的利器 引言 隨著互聯網的發展&#xff0c;跨域數據交互的需求日益增加。在Web開發中&#xff0c;由于同源策略的限制&#xff0c;直接通過XMLHttpRequest請求跨域數據會遇到諸多問題。而JSONP&#xff08;JSON with Padding&#xff…

Redis集群和 zookeeper 實現分布式鎖的優勢和劣勢

在分布式系統中&#xff0c;實現分布式鎖是確保多個節點間互斥訪問共享資源的一種常見需求。Redis 集群 和 zookeeper 都可以用來實現這一功能&#xff0c;但它們有著各自不同的優勢和劣勢。 CAP 理論&#xff1a; 在設計一個分布式系統時&#xff0c;一致性&#xff08;Consis…

如何備份vivo手機中的聯系人?

隨著vivo移動設備在全球設立7個研發中心&#xff0c;vivo正在進入更多的國家。如今&#xff0c;越來越多的人開始使用vivo手機。以vivo X100為例&#xff0c;它配備了主攝像頭和多個輔助攝像頭&#xff0c;提供多樣化的拍攝選項&#xff0c;并搭載了最新的FunTouch OS&#xff…

python腳本編程:使用BeautifulSoup爬蟲庫獲取熱門單機游戲排行榜

BeautifulSoup是一個便捷的解析html頁面元素的python庫&#xff0c;此處用來寫一個簡單的爬蟲批量抓取國內游戲資訊網站的近期熱門單機游戲排行榜。 網頁來源如下所示代碼 from bs4 import BeautifulSoup import requests# get web page web_url "https://www.3dmgame.co…

C#配置全面詳解:從傳統方式到現代配置系統

C#配置全面詳解&#xff1a;從傳統方式到現代配置系統 在軟件開發中&#xff0c;配置是指應用程序運行時可調整的參數集合&#xff0c;如數據庫連接字符串、API 地址、日志級別等。將這些參數從代碼中分離出來&#xff0c;便于在不修改代碼的情況下調整應用行為。C# 提供了多種…