進程間通訊(Inter-process communication:IPC),是指進程之間的信息交換。html
以前總結的進程同步、互斥,如信號量機制中只需改變信號量中的狀態或整型值這樣的少許信息,這種其所交換的信息量少而被歸結爲低級通訊。大量數據的傳輸低級通訊在效率上沒法知足了,所以須要高級通訊。安全
下面概述了8中進程通訊方式:信號量;共享內存;消息傳遞;匿名管道;命名管道;信號;套接字;消息隊列。服務器
只是一個瞭解大概。具體內容之後再整理。網絡
在另外一篇已總結過來。http://www.javashuo.com/article/p-bgxrcchy-nx.html數據結構
進程間只需改變信號量中狀態或整型值,這種交換信息量少的被歸結爲低級通訊。異步
相互通訊的進程共享某些數據結構(公共數據結構或變量)或共享內存,進程之間可以經過這些空間進行通訊。socket
消息傳遞系統是當前應用最爲普遍的一種進程間的通訊機制。分佈式
在該機制中,進程間的數據交換是以格式化的消息(message)爲單位的;在計算機網絡中,又把 message 稱爲報文。工具
特別值得一提的是,在當今最爲流行的微內核操做系統中,微內核與服務器之間的通訊,無一例外地都採用了消息傳遞機制。又因爲它能很好地支持多處理機系統、分佈式系統和計算機網絡,所以它也成爲這些領域最主要的通訊工具。spa
特色:數據量大;隱藏了通訊細節;通訊過程對用戶透明(不可見);減化了通訊程序編制的複雜性
實現:
1.直接通訊方式
點對點通訊:發送進程利用 OS 所提供的發送命令,直接把消息發送給目標進程。
一般,系統提供下述兩條通訊命令(原語):
Send(Receiver,message); //發送一個消息給接收進程; Receive(Sender,message); //接收 Sender 發來的消息
在某些狀況下,接收進程可與多個發送進程通訊,所以,它不可能事先指定發送進程。對於這樣的應用,在接收進程接收消息的原語中,表示源進程的參數,也是完成通訊後的返回值,接收原語可表示爲:Receive (id,message);
2.間接通訊方式
以信箱爲媒介:間接通訊方式指進程之間的通訊須要經過做爲共享數據結構的實體。該實體用來暫存發送進程發送給目標進程的消息;接收進程則從該實體中取出對方發送給本身的消息。
一般把這種中間實體稱爲信箱。消息在信箱中能夠安全地保存,只容許覈準的目標用戶隨時讀取。所以,利用信箱通訊方式,既可實現實時通訊,又可實現非實時通訊。
系統爲信箱通訊提供了若干條原語,分別用於信箱的建立、撤消和消息的發送、接收等。
管道是一種使用消息傳遞進行進程間通訊的機制。管道是由它們的標準流連接在一塊兒的一組進程,所以每一個進程的輸出文本(stdout)做爲輸入(stdin)直接傳遞到下一個進程。
管道又分爲匿名管道和命名管道,以下介紹。主要區別是匿名管道只能用於又親緣關係的(父子或兄弟)進程,進程結束後即消失;而命名通道利用了文件系統,具備文件,不侷限於具備親緣關係的進程,處理完後 仍有信息保留。
匿名管道是可用於單向進程間通訊的單工 通訊通道。
一般,父程序會打開匿名管道,並建立一個繼承管道另外一端的新進程,或者建立幾個新進程並將它們安排在管道中。
特色:
單工:單向傳遞,若實現進程間雙向通訊,需定義兩個管道。
FIFO:先進先出
無名:因此不能任意訪問已有的管道
相關:只能用於父子進程或者兄弟進程之間(具備親緣關係的進程)
生命:匿名管道將由一個進程寫入的數據由操做系統緩衝,直到由下一個進程讀取爲止,而且當進程完成時,該單向通道將消失。
在Unix中,命名管道利用了系統的文件系統。它是使用mkfifo()顯式建立的mknod(),而且兩個單獨的進程能夠按名稱訪問管道。一個進程能夠以讀取器的身份打開它,另外一個進程以寫入器的形式打開。
特色:
單工:單向傳遞,若實現進程間雙向通訊,需定義兩個管道。
FIFO:先進先出
有名:命名管道有一個名字,命名管道的名字對應於一個磁盤索引節點
無關:有了這個文件名,任何進程有相應的權限均可以對它進行訪問。而不侷限於父子進程,固然前提是進程對命名管道有適當的訪問權。
生命:命名管道將消息傳遞到經過使其成爲文件而命名的管道或從該管道傳遞消息,並在處理完成後保留。當再也不被進程使用時,命名管道在內存中釋放,但磁盤節點仍存在。
信號是進程間通訊的一種受限形式,一般在Unix,類Unix以及其餘POSIX兼容操做系統中使用。它是一種異步通知,它發送到一個進程或同一進程中的特定線程,以便將發生的事件通知給它。
發送信號後,操做系統會中斷目標進程的正常執行流程以傳遞信號。能夠在任何非原子指令中中斷執行。若是該進程先前已註冊了信號處理程序(signal handler),則執行。不然,將執行默認信號處理程序。
嵌入式程序可能會發現對進程間通訊有用的信號,由於信號的計算和內存佔用量很小。
注:信號相似於中斷,區別在於中斷由處理器介導並由內核處理,而信號由內核介導(可能經過系統調用)並由進程處理。
Socket一般稱爲「套接字」,用於描述IP地址和端口,是一個通訊鏈的句柄(Handle)。
socket可用於通常的進程間通訊機制,也可用於不一樣機器之間的進程間通訊。
進程惟一標識:PID(Process Identification)
Localhost 本地地址,表明本機:127.0.0.1
消息隊列是消息的連接表 ,存放在內核中並由消息隊列標識符標識。能夠把消息看做一個記錄,具備特定的格式以及特定的優先級。
消息隊列提供 異步 通訊協議,這意味着消息的發送者和接收者不須要同時與消息隊列進行交互。存儲在隊列中的消息將被存儲,直到收件人檢索到它們爲止