進程間通信方式比較

1,管道:根植於文件系統,管道一端讀,一端寫,只可以在父子進程間共享。父子進程有同一個文件標號(內核中file數組的下標),但是指向的file結構是不同的(file結構和具體的進程相關)。而file結構又指向一個dentry結構,這個dentry結構是同一個,dentry結構又指向一個inode結構(以上都是在內核中)。父進程發送消息,系統從用戶態轉到內核態,內核調用inode結構中的函數操作指針(具體的函數實現由虛擬文件系統下面的具體的文件系統實現),數據寫入inode結構的緩存。內核在找到子進程的task_struct結構,添加標誌告訴子進程有數據發送過來了,子進程由阻塞進度就緒。此時父進程進入就緒階段。內核根據調度算法找到一個進程執行。不久,子進程被選擇執行,同樣的流程找到inode結構,讀取緩存數據。這樣,一個完整的進程通信完成了。

2,命名管道:匿名管道是根據相同的文件fd找到對方,而命名管道是根據相同的文件名字。因此只要預定了文件名就可以通信,從找到file結構開始,過程都類似。都是根植於虛擬文件系統。不同於塊文件和字符文件,命名管道是一種特殊的文件系統FIFO隊列,因此不可以定位指針。

3,信號:信號時一種異步的通信方式。一個進程向另一個進程發送信號,系統從用戶態進入內核態,內核根據接收進程的id找到其task_struct,把發送的信號放入接收進程隊列。若干時刻過後,接收進程運行,運行一段時間後,接收進程需要用到內核服務,所以通過系統調用(異常或者中斷)進入內核態,內核首先找到進程的信號隊列,進入用戶態,處理信號處理程序。處理完之後,再次進入內核態,找到信號處理前的指令,一切恢復正常,就好像沒有信號處理一樣。信號處理程序和主程序就好像是兩個不同線程,共享進程的用戶空間,卻沒有方法同步。信號處理程序不可能中斷執行阻塞然後又轉到主程序執行。信號處理程序的優先級高,但是指向條件苛刻。

4,共享內存:共享內存其實是不同進程的同一個物理頁面,雖然虛擬內存地址不同。甲進程往共享內存寫數據,乙進程也可以訪問。共享內存可以不涉及內核操作,但是需要同步和通知控制。比如可以用信號來實現通知。

5,報文傳遞:不同於管道通信,每個進程都有一個報文隊列,而每個報文都是一個有結構的數據。相對來說,管道只是一個字符流。管道通信緩衝區滿之後,發送進程就會阻塞,報文不會。報文不是根植於文件系統。

6,信號量:很簡單的通信方式,再訪問一段內存的時候查看某一個信號是否可以訪問,訪問,關閉,保證同一時刻只有一個進程訪問這段內存。如此......

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