Java 程序間通訊的四種方式

2021-06-12 20:06:57 字數 2812 閱讀 5773

所謂程序通訊,就是不同程序之間進行一些"接觸",這種接觸有簡單,也有複雜。機制不同,複雜度也不一樣。通訊是乙個廣義上的意義,不僅僅指傳遞一些massege。

他們的使用方法是基本相同的,所以只要掌握了一種的使用方法,然後記住其他的使用方法就可以了。

1. 訊號

在我學習的內容中,主要接觸了訊號來實現同步的機制,據說訊號也可以用來做其它的事情,但是我還不知道做什麼。

訊號和訊號量是不同的,他們雖然都可用來實現同步和互斥,但前者是使用訊號處理器來進行的,後者是使用p,v操作來實現的。

使用訊號要先知道有哪些訊號,在linux下有31個需要記住的通用訊號,據說也是systemv中最常用的那些。這裡略。

#include

int sigaction(int signo, const struct sigaction *act, struct sigaction

*oact);

該函式用來為程序安裝訊號處理器,struct sigaction資料是用來儲存訊號處理器的相關資訊。

#include

int sigemptyset(sigset_t *set);

將訊號集合清空。

int sigfillset(sigset_t *set);

將訊號集合設定成包含所有的訊號。在對訊號進行操作以前一定要對訊號集進行初始化。

int sigaddset(sigset_t *set, int signo);

向訊號集中加入signo對應的新訊號。

int sigdelset(sigset_t *set, int signo);

從訊號集中刪除signo對應的乙個訊號。

int sigismember(const sigset_t *set, int signo);

判斷某個訊號是否在訊號集中。返回1則在,0則不在。

#include

int sigprocmask(int how,const sigset_t *set, sigset_t *oset);用來設定程序的訊號遮蔽碼。訊號遮蔽碼可以用來在某段時間內阻塞一些訊號集中的訊號,如果訊號不在訊號集中,就不必討論它,因為肯定不響應,是否能生成也不肯定,我沒有做過試驗。

1.2我所理解的使用訊號機制的方法:

使用訊號,主要做的事情就是訊號處理器的工作,這裡面是你想做的事情。就像中斷處理函式一樣。

在使用訊號以前,首先要初始化訊號集,只有在訊號集裡面的訊號才會被考慮。

有兩種方法可以初始化訊號集,一種是設定空訊號集,一種是將所有的訊號都加到訊號集中。如果你自己想要的訊號集不是這兩種,可以在初始化了以後通過新增和刪除訊號進行定製。

如果在程序執行的一段時間內不想對某些訊號進行響應,則可以使用sigprocmask對當前的訊號集中的一些訊號進行阻塞,稍後再執行。

用於程序間通訊(ipc)的四種不同技術

: 1. 訊息傳遞(管道,fifo,posix和system v訊息佇列

) 2. 同步(互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,posix和system v訊號燈

) 3. 共享記憶體區(匿名共享記憶體區,有名posix共享記憶體區,有名system v共享記憶體區

) 4. 過程呼叫(solaris門

,sun rpc)

訊息佇列和過程呼叫往往單獨使用,也就是說它們通常提供了自己的同步機制.相反,共享記憶體區通常需要由應用程式提供的某種同步形式才能 正常工作.解決某個特定問題應使用哪種ipc不存在簡單的判定,應該逐漸熟悉各種ipc形式提供的機制,然後根據特定應用的要求比較它們的特性

. 必 須考慮的四個前提

: 1. 聯網的還是非聯網的.ipc適用於單台主機上的程序或執行緒間的.如果應用程式有可能分布到多台主機上,那就要考慮使用套接字代替ipc,從而簡化以後向聯 網的應用程式轉移的工作

. 2. 可移植性

. 3. 效能,在具體的開發環境下執行測試程式,比較幾種ipc的效能差異

. 4. 實時排程.如果需要這一特性,而且所用的系統也支援posix實時排程選項,那就考慮使用posix的訊息傳遞和同步函式

. 各種 ipc之間的一些主要差異

: 1. 管道和fifo是位元組流,沒有訊息邊界.posix訊息和system v訊息則有從傳送者向接受者維護的記錄邊界(eg:tcp是沒有記錄邊界的位元組流,udp則提供具有記錄邊界的訊息

). 2. 當有乙個訊息放置到乙個空佇列中時,posix訊息佇列可向乙個程序傳送乙個訊號,或者啟動乙個新的執行緒.system v則不提供類似的通知形式

. 3. 管道和fifo的資料位元組是先進先出的.posix訊息和system v訊息具有由傳送者賦予的優先順序.從乙個posix訊息佇列讀出時,首先返回的總是優先順序最高的訊息.從乙個system v訊息佇列讀出時,讀出者可以要求想要的任意優先順序的訊息

. 4. 在眾多的訊息傳遞技術—管道,fifo,posix訊息佇列和system v訊息佇列—中,可從乙個訊號處理程式中呼叫的函式只有read和write(適用於管道和

fifo).

比較不同形式的訊息傳遞時,我 們感興趣的有兩種測量尺度

: 1. 頻寬(bandwidth):資料通過ipc通道轉移的速度.為測量該值,我們從乙個程序向另乙個程序傳送大量資料(幾百萬位元組).我們還給不同大小的 i/o操作(例如管道和fifo的write和read操作)測量該值,期待發現頻寬隨每個i/o操作的資料量的增長而增長的規律

. 2. 延遲(latency):乙個小的ipc訊息從乙個程序到令乙個程序再返回來所花的時間.我們測量的是只有乙個1個位元組的訊息從乙個程序到令乙個程序再回 來的時間(往返時間

) 在現實世界中,頻寬告訴我們大塊資料通過乙個ipc通道傳送出去需花多長時間,然而ipc也用於傳遞小的控制信 息,系統處理這些小訊息所需的時間就由延遲提供.這兩個數都很重要.

四種程序間通訊方式簡介與比較

createpipe m hread,m hwrite,sa,0 建立匿名管道 createprocess child debug child.exe null,null,null,true,0,null,null,sui,pi 通過startupinfo結構體sui將父程序匿名管道讀寫控制代碼傳遞...

java 程序 程序間通訊的方式

程序間通訊的方式有哪些,各有什麼優缺點 1 管道 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序之間使用。程序的親緣關係通常是指父子程序關係。2 有名管道 fifo 有名管道也是半雙工的通訊方式,但是允許在沒有親緣關係的程序之間使用,管道是先進先出的通訊方式。3 訊號量 ...

Mysql的四種通訊方式

老方式,先練一下審美 tcp ip套接字連線方式是mysql在任何平台都提供的一種連線方式,也是網路中使用最多的一種方式。那麼他們是怎麼連線上的嘞?假設我有兩台伺服器分別部署mysql資料庫客戶端 192.168.0.1 和mysql資料庫例項 192.168.0.2 兩者需要進行通訊,需要建立tc...