進程間的制約關系
一、進程同步
多個相互合作的進程在一些關鍵點上可能需要互相等待或互相交換消息。一個進程運行到某一點時,除非合作進程已經完成了某種操作或發來了消息,否則就必須暫時等待那些操作的完成或信息的到來,進程間的這種關系稱為同步。
暫停等待已取得同步的那一點,稱為同步點;需要等待的由其他進程完成的操作或發送的信息,稱為同步條件。
同步關系是一種直接制約關系。
同步關系有如下特點:(1)進程之間要在某些點上協調工作,到達的先后順序是有要求的。(2)進程之間互相了解對方的工作,任何一方單獨運行會出現差錯。(3)一方或雙方的運行會直接地依賴於對方所產生的信息或發出的消息。
二、進程互斥
當一個進程正在使用某獨占型資源時,其他希望使用該資源的進程必須等待,當該進程用完資源並釋放后,才允許其他進程去訪問此資源,進程之間的這種相互制約關系稱為互斥。
互斥關系時一種間接制約關系。
臨界資源: 一次僅允許一個進程使用的資源。(打印機、掃描儀、繪圖機)
臨界區: 進程中訪問臨界資源的程序段。
使用臨界資源的進程必須遵守一種約定: 進入臨界區之前必須先發出請求,准許后才能進入; 退出臨界區時必須聲明,以便讓其他進程進入。
對於臨界區的操作要遵循以下准則: 空閑讓進、忙則等待、有限等待、讓權等待。
信號量機制
一、信號量機制簡介
信號量由兩個成員構成:(1)非負初值的整型變量;(2)初始狀態為空的隊列。
在一個信號量S上,只能做規定的兩種操作:P操作 V操作。
P操作: 信號量S上的P操作記為 P(S)。 信號量S的值用 Vs 表示。
(1)Vs = Vs -1,即把當前信號量 S 的值減1.
(2)若 Vs >= 0,則調用進程繼續運行;若 Vs < 0 ,則調用進程由運行狀態變為阻塞狀態,到該信號量的等待隊列 Vq 上排隊等待。
V 操作:信號量 S 上的 V 操作記為 V(S)。
(1)Vs = Vs + 1,即把當前信號量 S 的值加1.
(2)若 Vs > 0,則調用進程繼續運行;若 Vs <= 0 ,則先從該信號量的等待隊列 Vq 上摘下一個等待進程,讓它從阻塞狀態變為就緒狀態,到就緒隊列里排隊,然后調用進程繼續運行。
二、進程制約關系的實現
用 P 、V操作實現同步
在共享變量處設置 P(S) V(S)。設置初值為 0 的信號量S。
用 P 、V操作實現互斥
把進入臨界區的操作置於 P(S) 和 V(S)之間。設置初值為 1 的信號量S。 即可實現進程互斥。
互斥訪問臨界資源: 如果進程 P1 已經進入了臨界區,那么進程 P2 就只能在臨界區的進入點處等待,不能進入,只有等到進程 P1 退出了臨界區,進程 P2 才能進入臨界區。
信號量 S 的物理含義:
(1)信號量 S 的初值,表示某類資源的數目。
(2)信號量 S > 0 時,表示系統中該類資源的可分配數目。
(3)信號量 S = 0 時,表示系統中該類資源全部被占用,但沒有進程在等待該類資源。
(4)信號量 S < 0 時,其絕對值表示等待該類資源的進程數目。
死鎖
一、死鎖的基本概念
死鎖:就是指若干進程由於相互等待已被對方占用的資源而無法繼續運行下去,陷於一種僵持狀態。
用資源分配圖表示系統資源的使用情況。 方框代表資源,圓圈代表進程。由資源到進程的有向邊表示把該資源分配給了這個進程。由進程到資源的有向邊表示該進程申請或等待這個資源。
死鎖產生的兩個原因:(1)競爭資源,系統資源有限,不能滿足所有進程的需求。(2)進程的推進順序不當。
死鎖產生的四個必要條件:(1)資源互斥條件;(2)資源不剝奪條件;(3)資源部分分配條件;(4)循環等待條件。
解決死鎖的方法:(1)預防死鎖;(2)避免死鎖;(系統中存在產生死鎖的條件)(3)檢測和解除死鎖。
二、死鎖的預防
(1)破壞“資源不剝奪條件”;一個已經占有某些資源的進程,再提出新的資源申請而不能立即得到滿足時,必須釋放它已經占有的所有資源,所以載重新申請。
(2)破壞“資源部分分配條件”;如果系統有足夠的資源,會一次性地將所需要的全部資源分配給該進程。只有一個資源需求不滿足時,系統將不分配給該進程任何資源。
(3)破壞“循環等待條件”;系統將所有的資源按照類型進行統一編號,所有進程申請資源時,必須嚴格按照資源序號由小到大的順序進行。只有先申請並分配到序號小的資源,才能申請和分配序號大的資源。
三、死鎖的避免
死鎖的避免:(銀行家算法)
在銀行家算法中,把系統分為安全狀態和不安全狀態。
安全狀態:指系統能夠按照某種順序為所有進程分配所需要的資源,直到滿足所有進程的最大需求,使每個進程都能運行完畢。否則系統處於不安全狀態。
不安全狀態有可能會導致死鎖,安全狀態絕對不會發生死鎖。
銀行家算法主要是避免系統進入不安全狀態。
在銀行家算法中,對進程有如下要求:必須預先知道自己對資源的最大需求量;當獲得所需全部資源后,能在有限的時間內運行完畢,並將所獲得的資源歸還給系統;各進程只能一次一個地申請所需要的資源。
四、死鎖的檢測與解除
利用簡化資源分配圖的方法來判斷系統是否處於死鎖狀態。
(1)既非阻塞又非孤立的進程(資源請求能夠得到滿足且有邊與其相連的進程)
在資源分配圖中,找出一個既非阻塞又非孤立的進程節點,消去與該節點相連的所有邊,使之成為孤立節點。
(2) 經過簡化后,如果所有節點都能成為孤立節點,那么該圖是可完全簡化的。就不會出現死鎖。
死鎖定理:系統處於死鎖狀態的充分必要條件是:當且僅當系統的資源分配圖是不可完全簡化的。
死鎖的解除:重新啟動、撤銷進程、剝奪資源、進程回退。
高級進程通信
進程通信是指 進程間的信息交換。
進程通信分類: (1)按通信量的大小, 低級通信 和 高級通信。 低級通信中,進程間只能傳遞狀態和整數值;高級通信中,用戶直接利用這些高級通信命令就能在進程間傳遞數據。
高級通信主要包括
a 共享存儲器:
b 消息傳遞: (消息緩沖通信 信箱通信(私有信箱,公用信箱,共享信箱))
c 管道通信: (有名管道 無名管道)
(2)按通信過程中是否有第三方作為中轉, 直接通信 和 間接通信。
(3)按通信的進程是否在同一台計算機上, 本地通信 和 遠程通信。
windows中的進程通信
一、windows server 2008的通信技術
(1)使用 VM_COPYDATA 消息實現進程通信
(2)使用文件映射實現進程通信
(3)通過共享內存實現進程通信
(4)使用匿名管道實現進程通信
(5)使用命名管道實現進程通信
(6)使用郵件槽實現進程通信
(7)使用 windows server 2008 的剪貼板實現進程通信
(8)使用動態數據交換 (DDE)實現進程通信
(9)使用對象鏈接庫(OLE)技術實現進程通信
(10)使用動態鏈接庫(DLL)實現進程通信
(11)使用遠程過程調用(RPC)實現進程通信
(12)使用 NetBios 函數實現進程通信
(13)使用套接字 sockets 實現進程通信
二、linux 中的進程通信
(1)使用信號量實現進程通信
(2)使用消息隊列實現進程通信
(3)使用共享內存實現進程通信
(4)使用內存映射實現進程通信
(5)使用管道和命名管道實現進程通信
(6)使用套接口實現進程通信