1. 程式人生 > >如何向面試官講述程序間通訊

如何向面試官講述程序間通訊

首先不著急一上去就說通訊方式,我們可以說一說為什麼會有程序間通訊???
因為有時候想要在兩個程序之間實現資料傳輸、資源共享、通知事件(例如程序終止時會通知父程序)以及程序控制(debug程序可以控制其他程序的執行),但是我們知道程序組織的時候是一個結構體,程序與程序之間是相互獨立的,有獨立的虛擬地址空間,所以程序間通訊是很難的,所以核心給我們提供一份公共資源讓兩程序都能訪問就可以實現通訊了,由此就引出了我們的幾大程序間通訊的方式:管道、訊息佇列、共享記憶體、訊號量。接下來就是分別描述這幾個方式。

管道:Linux下一切皆檔案這我們必須牢記,所以管道就是一份檔案,程序A能看到程序B也能夠看到,同時程序A往管道中寫資料程序B就可以從另一端讀資料了。管道又分為匿名管道和命名管道,匿名管道用pipe()建立,只能用於有親緣關係的程序間通訊,而命名管道則是用於任意程序。最後我們可以說一下
命名管道的特點:1、適用於任意程序2、面向位元組流3、半雙工通訊(當然想要實現全雙工通訊,只要兩個管道就可以了)4、生命週期隨程序5、內建同步與互斥機制。

訊息佇列:說白了訊息佇列就是一個連結串列,程序A可以向佇列中寫資料(寫滿則不能寫了,因為訊息佇列是固定的),佇列中有資料了程序B就可以開始讀資料了,讀完了資料就不能讀了(這也就能說明訊息佇列面向資料報)

訊息佇列的特點:1、適用於任意程序2、面向資料報3、全雙工通訊(只要程序有讀寫許可權就可以雙向通訊)4、生命週期隨核心5、內建同步與互斥機制。

共享記憶體:共享記憶體就是一塊記憶體,我們知道記憶體有隨機訪問的優勢,所以共享記憶體就成為了程序間通訊最快的方式。具體通訊原理就是這一塊實體記憶體在對映的時候會對映不同的虛擬地址空間,不同的虛擬地址空間就代表著不同的程序那麼就可以讓多個程序都看到這塊記憶體,然後進行讀寫操作。

共享記憶體的特點:1、適用於任意程序2、全雙工通訊3、生命週期隨核心

訊號量:訊號量準確的來說就沒有通訊,他可以理解為是一個計數器加上等待佇列,它主要側重了同步於互斥,因為有時候多個程序同時訪問臨界資源就會產生死鎖,那麼就需要訊號量記錄可申請的資源的數量,每申請一次訊號量減1,用完釋放就加1,等待佇列就是資源被申請完了(訊號量為0),在申請就會訊號量<0,那麼此時就會將程序加入等待佇列,一旦有資源釋放,就可以立馬申請到。

訊號量的特點就是同步於互斥!!!
其實我個人覺得訊號也應該屬於程序間通訊的一種方式,為什麼呢?因為程序控制也是程序間通訊的目的之一,那一個程序給另外一個程序傳送個9號訊號就可以殺死這個程序。

此處防止有坑:面試官可能會問:那全域性變數程序也都能看得到,是不是也能實現通訊呢?這就得說到我們的虛擬地址向實體地址映射了,全域性變數在對映的時候,實體地址布不同,那麼怎麼能保證兩個程序看到的是同一塊空間,那就無法通訊了。