通常來將進程之間的通訊根據內容能夠劃分爲兩種,一種是傳輸控制信息,另外一種是傳輸大量的數據。通常控制信息只有一個或幾個字節,用來達到進程控制操做的高速執行(好比利用信號量實現進程同步);大量數據的傳輸通常用於進程之間信息的交換(CS架構中,客戶端和服務器之間大量數據的交互)[4]。php
Linux中進程間通訊(IPC)是從Unix中衍生過來的,最初的Unix具有管道、FIFO、信號,後來通過貝爾實驗室和BSD(加州大學伯克利分校的伯克利軟件發佈中心)的拓展造成了如今的進程通訊基礎。html
貝爾實驗室對早期的Unix進程通訊方式進行了拓展,造成了「System V IPC」, 通訊侷限於單個計算機內;BSD打破了該限制,造成了基於套接字的進程間通訊機制。而Linux將二者間的特點都繼承了下來,同時它還兼容POSIX IPC標準(目前POSIX標準更加通用一些)。node
管道是Unix對操做系統的貢獻之一,它是一個環形緩衝區,容許兩個進程之間以生產者/消費者的模式進行通信,是一個先進先出的隊列[2]。linux
管道是一種半雙工的通訊方式(消息只能單向傳輸)。數據傳輸方式似於流式傳輸,不提供隨機訪問,進程之間要約定一套數據協議來解析傳輸的數據[5]。數據由操做系統緩衝,直到接收方從中讀取[1],它能夠像文件描述符同樣去經過select,poll和epoll函數去監聽。docker
管道在創建過程當中須要雙方進行協同操做(有些API中打開管道過程當中會阻塞,直到雙方都執行了打開操做),不能獨立於進程而存在。緩存
管道分爲匿名管道和命名管道(Named Pipe):匿名管道只有親緣關係的進程(父進程與子進程之間,或子進程與子進程之間)能夠共享;沒有親緣關係的進程之間只能經過命名管道通訊。服務器
FIFO(first-in first-out special file, named pipe)在Linux中屬於一種命名管道。經過綁定文件系統中指定文件來代替標準的輸入輸出[1],容許多個進程訪問。網絡
Unix中對管道自動採起互斥保護措施,每次只有一個進程能訪問管道[2]。架構
信號是用於向一個進程通知某種事件的發生。除了進程間通訊外還能夠發送給進程自己。由於沒法利用信號傳輸數據,因此信號主要用於進程管理上。併發
Unix中內核平等的對待全部的信號,對於同時發生的信號,一次只給進程一個信號,而沒有特定的順序。進程間能夠互相發送信號,內核在內部也可能發送信號[2]。
咱們常用的 Ctrl+C 就是發送一個退出的信號給某一進程。
消息隊列的功能相似於信箱,它也能夠在沒有親緣關係的進程之間去使用,在雙方沒有直接鏈接的狀況下進行通訊[1]。消息隊列是直接面對消息的,消息的發送者指定發送的消息的類型和大小,消息的接收者指定消息接收的方式(先進先出的規則或指定的消息類型)。
克服了信號承載信息量少和管道只能承載無格式字節流的缺點,能夠實現進程之間多對一的通訊(C/S模式)。即便是接收者沒有打開消息隊列,發送者仍然能夠打開隊列發送消息而不阻塞,不須要額外的同步操做,能夠避免管道中的打開和讀寫阻塞問題。
消息隊列中存儲的消息數量是有上限的,同時每一條消息的大小也是有上限的。
多個進程將同一個共享的內存段映射到本身的進程資源中,向同一段內存中讀寫數據來進行數據交互,是進程之間通訊速度最快的一種方式,常常與其餘通訊機制(信號量)混合使用來達到進程間通訊的目的[5]。
Pipe和FIFO以及消息隊列在交互信息的時候都須要經過內核拷貝的方式--將數據從發送方拷貝到內核緩存,再從內核緩存中拷貝到接收方[6],一次通訊要COPY兩次。而共享內存則不須要經過內核拷貝,因此速度上要比Pipe、FIFO和消息隊列快一些。
共享內存一般會在實時性要求比較高的業務狀況下使用,好比金融系統中,但涉及到分佈式的服務,常常須要跨主機的狀況共享內存不太適合。
經常使用於跨主機的進程通訊,由BSD最先提供,後來被linux所吸取。它有經過網絡端口跨主機通訊的TCP/IP socket(面向流數據)和UDP socket(面向消息),也有UNIX domain socket這種只能在本地使用的類型。
Unix domain socket 相似於TCP/IP互聯網套接字,但全部通訊都在內核中進行,使用文件系統做爲其地址空間。進程作爲inode來使用一個Unix domain socket,而且多個進程能夠與同一個套接字進行通訊(docker服務監聽本地請求就是經過Unix domain socket)[1]。
進程之間可使用socket進行雙向通訊。
用於不一樣進程之間,或者同一進程中不一樣線程之間同步的通訊機制。採用PV原語來實現。
[1] https://en.wikipedia.org/w/index.php?title=Inter-process_communication&oldid=833805357
[2] 《操做系統與精髓》 6.7 Unix的併發機制
[3] https://www.ibm.com/developerworks/cn/linux/l-ipc/index.html
[4] 《計算機操做系統教程》 清華版 第3版 張堯學 3.7 進程間通訊
[5] https://www.ibm.com/developerworks/cn/aix/library/au-spunix_sharedmemory/