程序間通訊介紹

2021-08-20 08:04:24 字數 3091 閱讀 3849

1.順序程式特徵

順序性封閉性(指執行環境的封閉性)

確定性可再現性

2.併發程式特徵

共享性併發性

隨機性3.程序互斥

由於各程序要求共享資源,而且有些資源需要互斥使用,因此各程序間競爭使用這些資源,程序的這種關係為程序的互斥

系統中某些資源一次只允許乙個程序使用,稱這樣的資源為臨界資源或互斥資源

在程序中涉及到互斥資源的程式段叫臨界區

4.程序同步

程序同步指的是多個程序需要相互配合共同完成一項任務

1.資料傳輸:乙個程序需要將它的資料傳送給另乙個程序

2.資源共享:多個程序之間共享同樣的資源

3.通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它(它們)發生了某種事件(如程序終止時要通知父程序)

4.程序控制:有些程序希望完全控制另乙個程序的執行,此時控制程序希望能夠攔截另乙個程序的所有陷入和異常,並能夠及時知道它的狀態改變

1.管道

2.system v程序間通訊

3.posix程序間通訊

檔案、檔案鎖

管道(pipe)和有名管道(fifo)

訊號、訊息佇列、共享記憶體、訊號量、互斥量、條件變數、讀寫鎖、套接字

system v ipc & posix ipc

system v ipc

system v訊息佇列、system v共享記憶體、system v訊號量

posix ipc

訊息佇列、共享記憶體、訊號量、互斥量、條件變數、讀寫鎖

1.隨程序持續:一直存在直到開啟的最後乙個程序結束。(如pipe和fifo)

2.隨核心持續:一直存在直到核心自舉(機器重啟)或顯示刪除(如system v訊息佇列、共享記憶體、訊號量)

當訪問這些物件的程序都結束的時候,這些物件不會自動地刪除,需要顯示刪除或機器重啟。

3.隨檔案系統持續:一直存在直到顯示刪除,即使核心自舉還存在。(posix訊息佇列、共享記憶體、訊號量)

死鎖是指多個程序之間相互等待對方的資源,而在得到對方資源之前又不釋放自己的資源,這樣,造成迴圈等待的一種現象。如果所有程序在等待乙個不可能發生的事,則程序就死鎖了。

死鎖產生的必要條件

1.互斥條件

程序對資源進行排他性使用,即在一段時間內某資源僅為乙個程序所占用。

2.請求和保持條件

當程序因請求資源而阻塞時,對已獲得的資源保持不放。

3.不可剝奪條件

程序以獲得的資源在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

4.環路等待條件

各個資源組成封閉的環形鏈,每個程序都等待下乙個程序所占用的資源。

防止死鎖的辦法

1.資源一次性分配(破環請求和保持條件)

乙個程序要占有資源,不能占有一半的資源,要麼全給你,要麼不給你

2.可剝奪資源(破環不可剝奪條件)

當乙個程序請求資源的時候,可以破環其它程序所占有的資源

3.資源有序分配法(破環迴圈等待條件)

死鎖避免

預防死鎖的幾種策略,會嚴重地損害系統效能。因此在避免死鎖時,要施加較弱的限制,從而獲得較滿意的系統效能。

由於在避免死鎖的策略中,允許程序動態地申請資源。因而,系統在進行資源分配之前預先計算資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給程序;否則,程序等待。其中,最具代表性的避免死鎖演算法是銀行家演算法。

銀行家演算法

為保證資金的安全,銀行家規定:

(1) 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;

(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;

(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款;

(4) 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金。

作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問 **的臨界區域。臨界區域是指執行資料更新的**需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪問它, 也就是說訊號量是用來調協程序對共享資源的訪問的。

由於訊號量只能進行兩種操作等待和傳送訊號,即p(sv)和v(sv),他們的行為是這樣的:

p(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該程序的執行

v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起,就給它加1.

舉個例子,就是 兩個程序共享訊號量sv,一旦其中乙個程序執行了p(sv)操作,它將得到訊號量,並可以進入臨界區,使sv減1。而第二個程序將被阻止進入臨界區,因為 當它試圖執行p(sv)時,sv為0,它會被掛起以等待第乙個程序離開臨界區域並執行v(sv)釋放訊號量,這時第二個程序就可以恢復執行。

1.訊號量

互斥:p、v在同乙個程序中

同步:p、v在不同程序中

2.訊號量的含義

s>0:s表示可用資源的個數

s=0:表示無可用資源,無等待程序

s<0:|s|表示等待佇列中程序個數

3.結構

struct semaphone

p原語

p(s)

}

v(s)

}

用pv原語解決司機與售票員問題

程序間通訊方式介紹 管道

1.程序間通訊的方式 1 管道 一種兩個程序間進行單向通訊的機制,半雙工的通訊方式。資料只能單方向流動,而且只能在具有親緣關係 父子程序 兄弟程序 的程序間使用。從通訊的雙方資訊互動的方式分三種基本模式 單工通訊 單向通訊 只有乙個方向的通訊而沒有反方向的互動 資訊流是單方向的 傳送端和接收端的身份...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間通訊

實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...