进程间通信、死锁、信号量、PV原语
生活随笔
收集整理的這篇文章主要介紹了
进程间通信、死锁、信号量、PV原语
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 進程間通信(Inter-Process Communication, IPC)
- 順序程序與并發程序的特征
- 進程互斥、臨界資源、臨界區
- 同步的細分
- 進程間通信目的
- 進程間通信發展
- 進程間通信分類
- 進程間共享信息的三種方式
- 死鎖及死鎖產生條件
- 哲學家就餐問題
- 信號量(Semaphore)及PV原語
- 信號量
- 信號量值含義
- 信號量實現的數據結構
- P原語和V原語
- PV原語解決實際問題
進程間通信(Inter-Process Communication, IPC)
順序程序與并發程序的特征
- 順序程序:順序性;封閉性(運行環境的封閉性);確定性;可再現性;
- 并發程序:共享性;并發性;隨機性;
進程互斥、臨界資源、臨界區
⑴ 進程的互斥:由于各進程要求共享資源,而且有些資源需要互斥使用,因此各進程間競爭使用這些資源,進程的這種關系為進程的互斥; ⑵ 臨界資源:系統中某些資源一次只允許一個進程使用,稱這樣的資源為 臨界資源 或 互斥資源; ⑶ 臨界區:在進程中涉及到互斥資源的程序段叫 臨界區;同步的細分
⑴ 同步,協作。相互通知,兩個進程共同完成一個功能或業務; ⑵ 互斥,矛盾。兩個進程對一個共享資源的有序訪問,不可同時訪問同一個共享資源;多個進程排他性的使用同一個資源;且⑴(在不同進程間使用)⑵(在同一進程中使用)都可以使用信號量的PV操作來實現。進程間通信目的
⑴ 數據傳輸:一個進程需要將它的數據發送給另一個進程; ⑵ 資源共享:多個進程之間共享同樣的資源; ⑶ 通知事件:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程); ⑷ 進程控制:有些進程希望完全控制另一個進程的執行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,并能夠及時知道它的狀態改變。進程間通信發展
⑴ 管道:匿名管道,父子有血緣關系的進程間通信;命名管道,可以實現無血緣關系的進程間通信; ⑵ System V進程間通信; ⑶ POSIX進程間通信(Portable Operating System Interface,縮寫為POSIX);進程間通信分類
⑴ 文件:作為兩個通信進程的數據中轉,來實現進程間通信; ⑵ 文件鎖:如讀寫鎖; ⑶ 管道(pipe)和命名管道(FIFO); ⑷ 信號(signal):一個進程通過信號向另一個進程發送通知事件,可實現進程控制的目的; ⑸ 消息隊列:用于數據傳遞; ⑹ 共享內存:進程間共享數據; ⑺ 信號量(semaphore):實現進程間對數據的同步訪問和互斥訪問,可實現互斥量; ⑻ 互斥量: ⑼ 條件變量: ⑽ 讀寫鎖: ⑾ 套接字:域內通信,domain;其中⑸⑹⑺在 SystemV和 POSIX 當中具有相應的實現,而⑻⑼⑽ 是 POSIX 獨有, 若是 SystemV 想用則需使用已有的進行實現。進程間共享信息的三種方式
- 隨進程持續:一直存在直到打開的最后一個進程結束。(如pipe和FIFO);
- 隨內核持續:一直存在直到內核自舉(機器重啟)或顯式刪除。(如System V消息隊列、共享內存、信號量);
- 隨文件系統持續:一直存在直到顯式刪除,即使內核自舉還存在。(POSIX消息隊列、共享內存、信號量如果是使用映射文件來實現);
死鎖及死鎖產生條件
死鎖是指多個進程之間相互等待對方的資源,而在得到對方資源之前又不釋放自己的資源,這樣,造成循環等待的一種現象。如果所有進程都在等待一個不可能發生的事,則進程就死鎖了。
死鎖產生的四個必要條件:
- 互斥條件:進程對資源進行排他性使用,即在一段時間內某資源僅為一個進程所占用;
- 請求和保持條件:當進程因請求資源而阻塞時,對已獲得的資源保持不放;
- 不可剝奪條件:進程已獲得的資源在未使用完之前,不能被剝奪,只能在使用完時由自己釋放;
- 環路等待條件:各個進程組成封閉的環形鏈,每個進程都等待下一個進程所占用的資源釋放;
防止死鎖的三個辦法:
- 資源一次性分配:破壞請求和保持條件,一個進程占有資源有且僅有在所有所需資源都可獲得的情況下才給予分配;
- 可剝奪資源:破壞不可剝奪條件,可剝奪一個進程已經占有的資源;
- 資源有序分配法:破壞循環/環路等待條件;
預防死鎖的幾種策略,會嚴重地損害系統性能。因此在避免死鎖時,要施加較弱的限制,從而獲得較滿意的系統性能。
由于在避免死鎖的策略中,允許進程動態地申請資源。因而,系統在進行資源分配之前預先計算資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程;否則,進程等待。其中最具有代表性的避免死鎖算法時銀行家算法。
哲學家就餐問題
五個哲學家圍在一個圓桌就餐,每個人都必須拿起兩把叉子才能就餐。每個哲學家的行為偽代碼如下:
while(1) {思考if(餓){拿左叉子拿右叉子用餐放下左叉子放下右叉子} }當五個哲學家同時拿起了其左邊的叉子,導致滿足了死鎖的四個條件,造成死鎖。解決死鎖思路:
- 服務生解法:服務生作為統一管理者,負責叉子的分配;
- 最多四個哲學家:抽屜原則,資源多于哲學家所需;
- 僅當一個哲學家兩邊筷子都可用時才允許拿叉子:一次性分配資源;
- 給所有哲學家編號,奇數號哲學家必須先拿左邊的叉子,偶數號的必須先拿右邊的:打破環路等待條件;
信號量(Semaphore)及PV原語
信號量和PV原語由Dijkstra提出,Dijkstra的貢獻:
- 程序設計:結構化程序設計之父,提出goto語句是有害的
- 操作系統:信號量,PV原語;
- 計算機網絡:單源最短路算法,進行路由表維護;
信號量
- 互斥:P、V在同一個進程中;
- 同步:P、V在不同進程中;
信號量值含義
- S > 0 S > 0 S>0: S S S表示可用資源個數;
- S = 0 S = 0 S=0:表示無可用資源,無等待進程;
- S < 0 S < 0 S<0: ∣ S ∣ |S| ∣S∣表示等待隊列中進程個數;
信號量實現的數據結構
struct semaphore {int value; //表示剩余資源個數pointer_PCB queue; //表示等待資源的隊列,指向PCB,表示有哪些進程在等待資源 }P原語和V原語
PV原語均是原子性的,不可被打斷,可禁用打斷即關閉中斷的方式來實現原子性。
/************************************************************************/ P(s) { s.value = s.value--;//若是s.value大于等于0,則說明資源可申請到,撇開if代碼//若是s.value小于0,則說明在申請資源時已無可用資源,//當前進程應加入等待隊列if(s.value < 0) {將該進程狀態置為等待狀態;將該進程的PCB插入相應的等待隊列s.queue末尾} } /************************************************************************/ V(s) {s.value = s.value++;//若是s.value大于0,則說明之前并沒有進程在等待資源,簡單將資源增加即可//若是s.value小于等于0,則說明所歸還資源是有進程在等待的,則喚醒等待隊列中//最先等待的進程,分配資源,并將其插入就緒隊列if(s.value <= 0) {喚醒相應等待隊列s.queue當中等待的一個進程;改變其狀態為就緒態;并將其插入就緒隊列;} } /************************************************************************/PV原語解決實際問題
- 解決司機與售票員問題,協助關系。同一個信號量存在于不同進程之間,解決同步問題。
- 解決民航售票問題,互斥關系。同一個信號量存在于一個進程當中,解決互斥問題。
- 解決汽車租賃問題,兩部敞篷車四個顧客租。
| 解決司機與售票員問題 | 解決民航售票問題 | 解決汽車租賃問題 |
總結
以上是生活随笔為你收集整理的进程间通信、死锁、信号量、PV原语的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 团队任务分工用哪一个团队管理工具分配工作
- 下一篇: 细说setTimeout/setImme