程序間通訊,指的是程序之間資訊交換,所交換的資訊量少則是乙個狀態或樹枝,多則成千上萬個位元組。
每個程序中訪問
臨界資源
的那段程式稱為
臨界區(
臨界資源
是一次僅允許乙個程序使用的共享資源)。
共分為4種
1、共享記憶體:共享記憶體就是對映一段能被其他程序所訪問的記憶體。這段記憶體由乙個程序建立,但多個程序可以訪問。共享記憶體是最快放的ipc方式,它是針對其他程序間通訊方式效率低鎖建立的。它往往與其他的通訊機制來配合使用。來實現程序間的同步通訊。
那麼,共享記憶體這種方式為什麼是最快的呢?這是因為共享記憶體的整個通訊過程對訊息的複製只有兩次。 1>.從資料**複製到共享記憶體 2>.從共享記憶體複製到資料目的地。而管道、訊息佇列等方式對訊息的複製需要四次,因為有緩衝區的存在,讀寫都要經過緩衝區。
2、管道:管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用,通常指父子程序關係。
有名管道:有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間通訊。
無名管道:它是半雙工的,即只能單向傳輸。 它是有程序關係限制的,只能在父子程序之間使用。
3、訊號量:訊號量是乙個技術器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒的同步手段。
訊號量只能進行兩種操作:等待p和傳送訊號v,他們的行為是這樣的:
p(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該程序的執行
v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起,就給它加1.
舉個例子,就是兩個程序共享訊號量sv,一旦其中乙個程序執行了p(sv)操作,它將得到訊號量,並可以進入臨界區,使sv減1。而第二個程序將被阻止進入臨界區,因為當它試圖執行p(sv)時,sv為0,它會被掛起以等待第乙個程序離開臨界區域並執行v(sv)釋放訊號量,這時第二個程序就可以恢復執行。
4、訊息佇列:訊息佇列是由訊息的鍊錶存放在核心並有訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊量少,管道只能承載無格式位元組流以及緩衝區太小受限。
5、套接字: 套接字也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程序通訊。
執行緒同步:即當有乙個執行緒在對記憶體進行操作時,其他執行緒都不可以對這個記憶體位址進行操作,直到該執行緒完成操作,其他執行緒才能對該記憶體位址進行操作。
執行緒同步的幾種方式:
1、互斥量(鎖):互斥量有兩種狀態--解鎖和加鎖。當乙個執行緒(或程序)需要訪問臨界區時,它呼叫互斥鎖。如果該互斥量當前是解鎖的(即臨界區可用),此呼叫成功,呼叫執行緒可以自由進入該臨界區。另一方面,如果該互斥量已經加鎖,呼叫執行緒被阻塞,直到在臨界區中的執行緒完成並呼叫互斥鎖。如果多個執行緒被阻塞在該互斥量上,將隨機選擇乙個執行緒並允許它獲得鎖。
2、訊號量:它允許同一時刻多個執行緒訪問同一資源,但是需要乙個計數器來控制可以使用某共享資源的執行緒數目。
semaphore類來進行訊號量操作。
如果兩個p/s操作順序顛倒,會產生死鎖。也就是說,使用訊號量原語時,訊號量操作的順序至關重要。那麼,有木有辦法改變這種情況,可不可將訊號量的這些組織工作交給乙個專門的構造來負責,解放廣大程式設計師?答案是管程。
管程(monitor)即監視器的意思,它監視的就是程序或執行緒的同步操作。具體來說,管程就是一組子程式、變數和資料結構的組合。言下之意,把需要同步的**用乙個管程的構造框起來,即將需要保護的**置於begin monitor和end monitor之間,即可獲得同步保護,也就是任何時候只能有乙個執行緒活躍在管程裡面。
同步操作的保證是由編譯器來執行的,編譯器在看到begin monitor和end monitor時就知道其中的**需要同步保護,在翻譯成低階**時就會將需要的作業系統原語加上,使得兩個執行緒不能同時活躍在同乙個管程內。提供了乙個monitor類,它可以幫我們實現互斥的效果。
在管程中使用兩種同步機制:鎖用來進行互斥,條件變數用來控制執行順序。從某種意義上來說,管程就是鎖+條件變數。
條件變數就是執行緒可以在上面等待的東西,而另外乙個執行緒則可以通過傳送訊號將在條件變數上的執行緒叫醒。因此,條件變數有點像訊號量,但又不是訊號量,因為不能對其進行up和down操作。
管程最大的問題就是對編譯器的依賴,因為我們需要將編譯器需要的同步原語加在管程的開始和結尾。此外,管程只能在單台計算機上發揮作用。
3、事件(訊號):通過通知操作的方式來保持多執行緒同步,還可以方便的實現多執行緒優先順序的比較操作。
互斥量跟訊號量的區別與聯絡:
1>.互斥量用於執行緒的互斥。 訊號量用於執行緒的同步。這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。
2>.互斥量值只能為0/1,訊號量值可以為非負整數。也就是說,乙個互斥量只能用於乙個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。
互斥:是指某一資源同時只允許乙個訪問者對其進行訪問。但互斥無法使訪問者按照某種規則進行訪問。
同步:執行緒之間的執行必須按照某種規定來執行,執行的次序依賴於要完成的特定的任務。
總結:同步是一種更為複雜的互斥,而互斥是一種特殊的同步。
作業系統 程序間通訊
程序間通訊涉及到3個問題 1.乙個程序如何把資訊傳遞給另乙個程序 2.確保兩個或多個程序之間不會在關鍵活動中出現交叉 3.程序間執行的順序對執行結果的影響。注意 確保程序對臨界區的 互斥 訪問。忙等待的互斥 1.遮蔽中斷 當乙個程序進入臨界區後立即遮蔽所有中斷,時鐘中斷也被遮蔽 這樣cpu就不會進行...
作業系統 程序間通訊
include include include include include include ifndef semun h 條件編譯,即若semun在標頭檔案中沒有被定義,就進行下面的編譯 define semun h union semun endif static int set semval...
作業系統 程序間通訊
程序間通訊方式總結 優缺點 linus下的程序通訊手段基本上是從unix平台上的程序通訊手段繼承而來的。1 無名管道通訊 半雙工通訊,只能在具有親緣關係的程序間使用 1 管道 2 高階管道通訊 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子 程序 3 有名管道通訊 半雙工通訊...