3.4.1共享內存
在相互通信的進程之間設有一個公共內存區,一組進程向該公內存中寫,另一組進程從化共內存中讀,通過這種方式實現兩組進程間的信息交換。
這種通信模式需要解決兩個問題:第一個問題是怎樣提供共享內存;第二個是公共內存的互斥關系則是程序開發人員的責任。
3.4.2消息機制
消息機制是用於進程間通信的高級通信原語之一。進程在動身過程中,台能需要與其他的進程進行進程
交換,於是進程通過某種手段發出自己的消息或接收其他進程發來的消息。這種方式類似於人們通過郵局收發信件來實現交換信息的目的。至於通過什么手段收發消息,就像人們選擇平信還是航空信一樣,是一種具體的消息傳遞機制。
1、 消息緩沖通信
消息緩沖通信技術是由Hansen首先提出的,其基本思想是:根據”生產者-消費者”原理,利用內存中公用消息緩沖區實現進程之間的信息交換.
內存中開辟了若干消息緩沖區,用以存放消息.每當一個進程向另一個進程發送消息時,便申請一個消息緩沖區,並把已准備好的消息送到緩沖區,然后把該消息緩 沖區插入到接收進程的消息隊列中,最后通知接收進程.接收進程收到發送里程發來的通知后,從本進程的消息隊列中摘下一消息緩沖區,取出所需的信息,然后把 消息緩沖區不定期給系統.系統負責管理公用消息緩沖區以及消息的傳遞.
一個進程可以給若干個進程發送消息,反之,一個進程可以接收不同進程發來的消息.顯然,進程中關於消息隊列的操作是臨界區.當發送進程正往接收進程的消息隊列中添加一條消息時,接收進程不能同時從該消息隊列中到出消息:反之也一樣.
消息緩沖區通信機制包含以下列內容:
(1) 消息緩沖區,這是一個由以下幾項組成的數據結構:
1、 消息長度
2、 消息正文
3、 發送者
4、 消息隊列指針
(2)消息隊列首指針m-q,一般保存在PCB中。
(1) 互斥信號量m-mutex,初值為1,用於互斥訪問消息隊列,在PCB中設置。
(2) 同步信號量m-syn,初值為0,用於消息計數,在PCB中設置。
(3) 發送消息原語send
(4) 接收消息原語receive(a)
圖
2、信箱通信
為了實現進程間的通信,可以設立一個通信機構——信箱,以發送信件以及接收回答信件為進程間通信的基本方式。
當一個進程希望與另一進程通信時,就創建一個鏈接兩個進程的信箱,發送進程把信件投入信箱,而接收進程可以在任何時刻取走信件。
一個信箱的結構可以由“信箱說明”和“信箱體”兩部分組成。
在信箱說明中,一般有如下的數據結構:
可存信件數是在設立信箱時預先確定的,表明信箱的容量大小,
已有信件數指出信箱中已有的信件的數量
通過可存信件數和已有信件數就能判別信箱是否滿和信箱中是否有信件。
可存信件的指針指示當前可存入一封信的位置。該指針的初始值為指向可存的第一封信的位置。
當存入一封信后,則應該修改已有信件數和可存信件的指針。相應的,若信箱中有信,則每次從中取出一封信,也應該修改已有信件數和可存信件的指針。
為了實現信箱通信,必須提供相應的原語,如創建信箱原語、撤消信箱原語、發送信件原語和接收信件原語等。
采用信箱通信的最大好處是,發送方和接收方不必直接建聯系,沒有處理時間上的限制。發送方可以在任何時間發信,接收方也可以在任何時間收信。
由於發送方和接收方都是獨立工作的,如果發得快而收得慢,則信箱會溢出。相反,如果發得慢而收得快,則信箱會變空。因此,為避免信件丟失和錯誤的送出信件,一般而言通信應有如下的規則:
(1)若發送信件時信箱已滿,則發送進程應被置等信箱狀態,直到信箱有空時才被釋放。
(2)若取信件時信箱中無信,則接收進程應被子置成等信件狀態,直到有信件時才被釋放。
3、 管道通信
管道通信首先出現在UNIX操作系統中。作為UNIX的一大特色,管道通信立即引起了人們的興趣。由於管道通信的有效性,一些系統繼UNIX之后相繼引入了管道技術,管道通信是一種重要的通信方式。
所謂管道,就是連接在兩個進程之間的一個打開的共享文件,專用於進程之間進行數據通信。發送進程可以源源不斷地從管道一端寫入數據流,每次寫入的長度是可 變的;接收進程在需要時可以從管道的另一端讀出數據,讀出單位長度也是可變的。顯然,管道通信的基礎是文件系統。
在對管道文件進行讀寫操作過程中,發送進程和接收進程要實施正確的同步和互斥,以確保通信的正確性。管道通信機制中的同步與互斥都由操作系統自動進行,對用戶是透明的。
管道通信具有傳送數據量大的優點,但通信速度較慢.
還有就是socket通信
一些不是很”常見“的進程通信方式:
Internet通信 它讓應用程序從Internet地址上載或下載文件
RPC:遠程過程調用,很少使用,因其與UNIX的RPC不兼容.
串行/並行通信(Serial/Parallel Communication)
它允許應用程序通過串行或並行端口與其他的應用程序通信
COM/DCOM通過COM系統的代理存根方式進行進程間數據交換,但只能夠表現在對接口函數的調用時傳送數據,通過DCOM可以在不同主機間傳送數據.