進程通信方式

進程通信方式

1、管道(BIO)

例舉一個我最常用的linux命令

ps -ef|grep java

其中 | 就是管道的意思,它的作用就是把前面的輸出 ps -ef(列出所有進程),作爲 grep java 的輸入。最終完成列出所有包含java字符的進程信息。由於這條豎線是沒有名字的,所以它被定義爲匿名管道。而且它只能單向傳遞,所以它也叫單向管道。
如果想創建一個命名管道可以通過 mkfifo命令創建,創建後可以使用輸入>對其輸入數據,之後用<輸出讀取數據。只有完成一個完整的輸入輸出才能完成一個完整的處理流程,完整的命令纔會執行結束
例如

mkfifo data
ps -ef > data
cat < data

只有當cat < data成功執行後 ps -ef纔會成功結束,資源纔會被釋放。
所以它的劣勢很明顯了,處於bio的階段,不完全執行完就會阻塞。因而有了升級方案消息隊列。

2、消息隊列(nio)

消息隊列就很好理解了進入到了nio的時代,a進程是生產者,生產的數據放到消息隊列(一般是阻塞隊列)中,這時a進程可以繼續做自己的事,b進程獲取a進程的信息時只需要從消息隊列中獲取。
在真實的生產環境中,a進程會發送龐大的數據,這時消息隊列的劣勢就體現出來了,發送消息和獲取消息就會耗費很多的資源和時間。所以就有了共享內存的出現。

3、共享內存

非要強行比喻一下的話共享內存可以說是epoll
系統加載一個進程的時候,分配給進程的內存並不是實際物理內存,而是通過分段分頁表映射的內存空間。那麼我們可以讓兩個進程各自拿出一塊虛擬地址空間來,然後映射到相同的物理內存中,這樣一來兩個進程雖然有着獨立的虛擬內存空間,但有一部分卻映射到了相同的物理內存,這就是共享內存了。
en一旦共享,我們就想到了臨界資源的競爭了。這也就是共享內存的弊端。

4、信號量

共享內存最大的問題就是多進程競爭內存的問題,就像類似於我們平時說的線程安全問題。信號量就時用來解決這個問題的。

信號量的本質就是一個計數器,用來實現進程之間的互斥與同步。例如信號量的初始值是 1,然後 a 進程來訪問內存1的時候,我們就把信號量的值設爲 0,然後進程b 也要來訪問內存1的時候,看到信號量的值爲 0 就知道已經有進程在訪問內存1了,這個時候進程 b 就會訪問不了內存1。所以說,信號量也是進程之間的一種通信方式

5、Socket

遠程的進程通信,比如我們最常用的ssh登錄命令,就是我們這裏的登錄請求和目標主機上的登錄處理進程進行的通信了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章