此篇博客主要記錄行程同步與死鎖的相關知識
一、基礎知識:
1. 臨界資源: 一次僅允許一個行程使用的資源, 訪問臨界資源的那段代碼稱為臨界區
2. 同步 : 又稱直接制約關系,兩行程需要合作但是依然需要協調先后次序,舉例,A通過單緩沖向B提供資料
3. 互斥: 又稱間接制約關系,舉例, A 和B同時進行列印
二、行程互斥的軟體實作方法:
有四個基本演算法:單標志法,雙標志先檢查, 雙標志后檢查, Peterson演算法



最優秀的實作臨界區互斥的軟體實作方法,Peterson演算法

三、行程互斥的硬體實作方法
一般來說有三種基本實作方法: 中斷屏蔽方法, TestAndSet (TS 指令 / TSL 指令),Swap指令(XCHG指令)

四、信號量機制
用戶行程可以使用操作系統提供的一對原語來對信號量進行操作,從而很方便的實現了行程互斥、行程同步
信號量其實是一個變數(可以是整數,也可以是更復雜的記錄型變數),可以用一個信號量來表示系統中某種資源的數量,比如:系統中只有一臺列印機,就可以設定一個初值為1 的信號量,
原語是一種特殊的程式段,其執行只能一氣呵成,不可被中斷,原語是由關中斷 / 開中斷指令實作的,軟體解決方案的主要問題是由 “進入區的各種操作無法一氣呵成” , 因此如如果能把進入區、推出區的操作都用“ 原語 ”實作, 使這些操作能一氣呵成就能避免問題,
一對原語:wait( S ) 原語 和 signal( S ) 原語,可以把原語理解為我們自己寫的函式,函式名分別為wait 和signal,括號里的信號量 S 其實就是函式呼叫時傳入的一個引數,
wait、signal 原語通常簡寫為 P 、V 操作,
-ol
四、信號量機制實作行程互斥和行程同步
P操作是對資源的申請,V操作時對資源的釋放,


五、管程的定義和基本特征
引入管程的目的就是要更方便的實作行程互斥和同步
1.需要在管程中定義共享資料
2. 需要在管程中定義訪問這些共享資料的入口,即封裝好的函式
3. 只有通過特定的入口才能共享資料
4. 管程有很多入口,但是每次只開放一個入口,并且只能讓一個行程或執行緒進入
5. 我們可以在管程中設定條件變數及等待/ 喚醒操作以解決同步問題,

六、死鎖
死鎖:各行程互相等待對方手里的資源,導致各個行程都堵塞,無法向前推進
饑餓:長期得不到想要的資源,導致某個行程無法向前推進
死回圈:程式員寫的bug
1. 預防死鎖
① 破壞互斥條件

② 破壞不剝奪條件

③ 破壞請求和保持條件

④ 破壞回圈等待條件

2. 避免死鎖


3. 檢測和解除
系統檢測演算法:用于檢測系統狀態,以確定系統中是否發生了死鎖
死鎖解除演算法:當認定系統中已經發生了死鎖,利用該演算法可將系統從死鎖狀態中解脫出來
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257980.html
標籤:其他
下一篇:Java 流程控制
