操作系統05死鎖

進程管理4--Deadlock and Starvation

Concurrency:

Deadlock and Starvation

內容提要

>產生死鎖與饑餓的原因

>解決死鎖的方法

>死鎖/同步的經典問題:哲學家進餐問題

?

Deadlock ?系統的一種隨機性錯誤

·Permanent blocking of a set of processes that either compete for system resources or?communicate with each other.

·No efficient solution

·Involve conflicting needs for resources by two or more processes.


E.g. Process P and Q compete two resources. Their general forms are:

Process PProcess Q
Get AGet B
......
Get BGet A
......
Release ARelease B
......
Release BRelease A
......


死鎖與進程的推進順序有關。

若修改P的代碼,則不會產生死鎖。

Process P

...

Get A

...

Release A

...

Get B

...

Release B

...

?

Reusable Resources 可重用資源

·Used by one process at a time and not depleted(耗盡) by that use.

·Processes obtain resources that they later release for reuse by other processes.

·processor ???main and secondary memory ???IO channels ???databases ???files ???semaphores

·Deadlock occurs if each process holds one resource and requests the other.


Example of Deadlock

Process P

?

Process Q

Step

Action

?

Step

Action

P0

Request(D)

?

Q0

Request(T)

P1

Lock(D)

?

Q1

Lock(T)

P2

Request(T)

?

Q2

Request(D)

P3

Lock(T)

?

Q3

Lock(D)

P4

Perform

function

?

Q4

Perform

function

P5

Unlock(D)

?

Q5

Unlock(T)

P6

Unlock(T)

?

Q6

Unlock(D)

?

Example of Two process competing for Reusable Resources.

?

Another Example of Deadlock

·Space is available for allocation of 200k bytes, and the following sequence of events occur.

P1

P2

... ...

... ...

Request 80k bytes

Request 70k bytes

... ...

... ...

Request 60k bytes

Request 80k bytes

... ...

... ...

·Deadlock occurs if both processes progress to their second request.

?

Consumable Resources 可消耗資源

·Created(produced) and destroyed(consumed) by a process.

·Interrupts, signals, messages and information in IO buffers.

?

Example of Deadlock

·Deadlock occurs if receive is blocking.

P1

P2

... ...

... ...

Receive(P2)

Receive(P1)

... ...

... ...

Send(P2, M1)

Send(P1, M2)

... ...

... ...

此類死鎖是由于設計失誤造成的,很難發現,且潛伏期長。

?

?

Condition for Deadlock

必要條件

·Mutual exclusion(互斥)

---Only one process may use a resource at a time.

·Hold-and-wait(保持并等待)

---A process may hold allocated resources while awaiting assignment of other resources.

·No preemptive(不剝奪)

---No resource can be forcibly removed from a process holding it.

?

??Circular Wait



充分條件

·Circular wait(環路等待)

---A closed chain of process exists, such that each process holds at least one resource needed by the next process in the chain.

?

條件Mutual exclusionHold-and-waitNo preemption是死鎖產生的必要條件;

條件Circular Wait是前3個條件產生的結果。

?

?

Deadlock Prevention 預防死鎖

預防死鎖是不可行的,只能盡量避免

·間接方法,禁止前3個條件之一的發生:(工程上不實用)

1、互斥:是某些系統資源的固有屬性,不能禁止;

2、禁止“保持等待”條件:

要求進程一次性地申請其所需的全部資源。若系統中沒有足夠的資源可分配給它,則進程阻塞。

3、禁止“不剝奪”條件:

(1)若一個進程占用了某些系統資源,又申請新的資源,則不能立即分配給它。必須讓它首先釋放出已占用資源,然后再重新申請;

(2)若一個進程申請的資源被另一個進程占有,OS可以剝奪低優先權進程的資源分配給高優先權進程(要求此類可剝奪資源的狀態易于保存和恢復,否則不能剝奪)

·直接方法,禁止條件4(環路等待)的發生

即禁止“環路等待”條件:可以將系統的所有資源按類型不同進行線性排隊,并賦予不同的序號。進程對某類資源的申請只能按照序號遞增的方式進行。

顯然,此方法是低效的,它將影響進程執行的速度,甚至阻礙資源的正常分配。

?

Deadlock Avoidance 避免死鎖 ???用于服務器中,PC機中無

·預防死鎖通過實施較強的限制條件實現,降低了系統性能。

·避免死鎖的關鍵在于為進程分配資源之前,首先通過計算,判斷此次分配是否會導致死鎖,只有不會導致死鎖的分配才可實行。

·A decision is made dynamically whether the current resource allocation request will, if granted, potentially lead to a deadlock.

·Requires knowledge of future process request.

?

Approaches to Deadlock Avoidance

·Do not start a process if its demands might lead to deadlock.

·Do not grant an incremental resource request to a process if this allocation might lead to deadlock.

?

Resource Allocation Denial

·Referred to as the banker’s algorithm.

·State of the system is the current allocation of resources to process.

·Safe state is where there is at least one sequence that does not result in deadlock.

·Unsafe state is a state that is not safe.

?

Safe State

·指系統能按某種順序,如<P1, P2, ..., Pn>來為每個進程分配其所需資源,直至最大需求,使每個進程都可以順序完成,則系統處于safe state

<P1, P2, ..., Pn>為安全序列。

?

Determination of a Safe State


???Claim Matrix

?

R1

R2

R3

P1

3

2

2

P2

6

1

3

P3

3

1

4

P4

4

2

2

??

?Allocation Matrix

?

R1

R2

R3

P1

1

0

0

P2

6

1

2

P3

2

1

1

P4

0

0

2

?

???Need Matrix

?

R1

R2

R3

P1

2

2

2

P2

0

0

1

P3

1

0

3

P4

4

2

0


?

Resource Vector

R1

R2

R3

9

3

6

?

Available Vector

R1

R2

R3

0

1

1

?


Determination of a Unsafe State


???Claim Matrix

?

R1

R2

R3

P1

3

2

2

P2

6

1

3

P3

3

1

4

P4

4

2

2

??

?Allocation Matrix

?

R1

R2

R3

P1

1

0

0

P2

5

1

1

P3

2

1

1

P4

0

0

2

?

???Need Matrix

?

R1

R2

R3

P1

2

2

2

P2

1

0

2

P3

1

0

3

P4

4

2

0


?

Resource Vector

R1

R2

R3

8

3

5

?

Available Vector

R1

R2

R3

0

1

1

?

?

Safe State V.S. Unsafe State

·并非所有不安全狀態都是死鎖狀態。

·當系統進入不安全狀態后,便可能進入死鎖狀態。

·只要系統處于安全狀態,則可避免死鎖狀態。

?

Sate State to Unsafe State

例,假設系統中有3個進程P1,P2,P3,共有12臺磁帶機。進程P1共需10臺,P2P3分別需要4臺和9臺。設T0時刻,進程P1P2P3已分別獲得5臺、2臺、2臺,尚有3臺未分配,即圖示:

進程

最大需求

已分配

可用

P1

10

5

3

P2

4

2

?

P3

9

2

?

?

·T0時刻是安全的,因為存在一個安全序列<P2,P1,P3>,即只要系統按此進程序列分配資源,每個進程都可順利完成。

·但是,如果不按照安全序列分配資源,則系統可能會由安全狀態進入不安全狀態。

例如,T0時刻以后,P3又申請1臺磁帶機。若系統將剩余3臺中的1臺分配給P3,則系統進入不安全狀態。

進程

最大需求

已分配

可用

P1

10

5

2

P2

4

2

?

P3

9

3

?

?

?

?

————————————————————————————————————————————————————————————————————————————?


銀行家算法

·該算法可用于銀行發放一筆貸款錢,預測該筆貸款是否會引起銀行資金周轉問題。

·這里,銀行的資金就類似于計算機系統的資源,貸款業務類似于計算機的資源分配。

銀行家算法能預測一筆貸款業務對銀行是否是安全的,也能預測一次資源分配對計算機系統是否是安全的。

·為實現銀行家算法,系統中必須設置若干數據結構。

?

數據結構

1、可利用資源向量Available

是一個具有m個元素的數組,其中的每一個元素代表一類可利用資源的數目,其初始值為系統中該類資源的最大可用數目,其值將隨著該類資源的分配與回收而動態改變。

Available[j]=k,表示系統中現有Rj類資源k個。

2、最大需求矩陣Max

是一個n*m的矩陣,定義了系統中n個進程中的每一個進程對m類資源的最大需求。

Max(i,j)=k,表示進程iRj類資源的最大需求數目為k個。

3、分配矩陣Allocation

是一個n*m的矩陣,定義了進程中每一類資源的數量。

Allocation(i,j)=k,表示進程i當前已分得Rj類資源的數目為k個。

4、需求矩陣Need:=Max-Allocation

Need(i,j)=k,表示進程i還需要Rj類資源k個,方能完成任務。

Need[i,j] = Max[i,j] - Allocation[i,j]

?

Requesti是進程Pi的請求向量。

Requesti[j] = k,表示進程Pi需要kRj類資源。當進程Pi放出資源請求后,系統按下述步驟進行檢查:

1、如果,Requesti <= Needi,則轉向步驟2;否則,出錯。

2、如果,Requesti <= Available,則轉向步驟3;否則,表示尚無足夠資源可供分配,進程Pi必須阻塞等待。

3、系統試探性的將Pi申請的資源分配給它,并修改下列數據結構中的值:

Available := Available - Requesti;

Allocation := Allocation + Requesti;

Needi := Needi - Requesti;

4、系統利用安全性算法,檢查此次資源分配后,系統是否處于安全狀態。若安全,才正式將資源分配給進程Pi,完成本次資源分配;否則,試探分配失效,讓進程Pi阻塞等待。

?

?

安全性算法

1、設置兩個工作向量

a)設置一個數組Finish[n]。當Finish[i] = True (0 <= i <= n, n為系統中的進程數)時,表示進程Pi獲得其所需的全部資源,而順利執行完成。

b)設置一個臨時向量work,表示系統可提供給進程繼續運行的資源的集合。安全性算法剛開始執行時,work := Available

2、從進程集合中找到一個滿足下列條件的進程

Finish[i] = false ?and ?Need <= Work; 若找到,執行步驟3,否則,執行步驟4

3、當進程Pi獲得資源后,將順利執行直至完成,并釋放其所擁有的全部資源,故應執行以下操作

Work := work + Allocationi ?and ?Finish[i] = True;轉向步驟2

4、如果所有進程的Finish[i] = True,則表示系統處于安全狀態,否則系統處于不安全狀態。


————————————————————————————————————————————————————————————————————————


舉例

T0時刻的資源分配情況

·假定系統中有四個進程P1,P2,P3,P4和三種類型的資源R1,R2,R3,每一種資源的數量分別為9,3,6

T0時刻的資源分配情況如下表所示:


???Claim Matrix

?

R1

R2

R3

P1

3

2

2

P2

6

1

3

P3

3

1

4

P4

4

2

2

??

?Allocation Matrix

?

R1

R2

R3

P1

1

0

0

P2

6

1

2

P3

2

1

1

P4

0

0

2

?

???Need Matrix

?

R1

R2

R3

P1

2

2

2

P2

0

0

1

P3

1

0

3

P4

4

2

0


?

Available Vector

R1

R2

R3

0

1

1

?

T0時刻的安全性

·從T0時刻的安全性分析可知,T0時刻存在著一個安全序列<P2,P1,P4,P3>,故,T0時刻系統是安全的。

·假設T0時刻,進程P1申請資源,其請求向量為Request1(0,0,1),系統按銀行家算法進行檢查:

Request1(0,0,1) <= Need1(2,2,2)

Request1(0,0,1)<=Available(0,1,1)

·故,系統試探性地為P1分配資源,并修改Available1Allocation1Need1向量。

?

Allocation Matrix

?

R1

R2

R3

P1

1

0

1

P2

6

1

2

P3

2

1

1

P4

0

0

2

?

??Need Matrix

?

R1

R2

R3

P1

2

2

1

P2

0

0

1

P3

1

0

3

P4

4

2

0


?

Available Vector

R1

R2

R3

0

1

0

?

·利用安全性算法檢查此時系統是否安全:

>此時系統的可用資源向量為Available(0,1,0)。比較進程的需求向量Need,系統不能滿足任何進程的資源請求。系統進入不安全狀態。

>所以,P1請求的資源不能分配,只能讓P1阻塞等待。



·假設T0時刻,進程P4申請資源,其請求向量為Request4(1,2,0),系統按銀行家算法進行檢查:

Request4(1,2,0) <= Need1(4,2,0)

Request1(1,2,0) ?> Available(0,1,1)

·P4的請求向量超過系統的可用資源向量,故P4的請求不能滿足,進程P4阻塞等待。



Deadlock Avoidance

·Maximum resource requirement must be stated in advance 必須預先申明每個進程需要的資源總量。

·Process under consideration must be independent; no synchronization requirements

進程之間相互獨立,其執行順序取決于系統安全,而非進程間的同步要求。

·There must be a fixed number of resources to allocate 系統必須提供固定數量的資源供分配。

·No process may exit while holding resources 若進程占有資源,則不能讓其退出系統。

---Collection of programs, data, stack and attributes


——————————————————————————————————————————————————————————————————————

若系統不提供任何措施保證不進入死鎖狀態,則必須提供檢測和解除死鎖的手段。?


Deadlock Detection 檢測死鎖

·檢測死鎖不同于預防死鎖,不限制資源訪問方式和資源申請。

·OS周期性的執行死鎖檢測例程,檢測系統中是否出現“環路等待”。

?

Strategies once Deadlock Detected

·Abort all deadlock processes.

·Back up each deadlock process to some previously defined checkpoint , and restart all process.

? ? ---Original deadlock may occur.

·Successively abort deadlocked processes until deadlock no longer exists.

·Successively preempt resources until deadlock no longer exists.

?

Selection Criteria Deadlock Processes

·Least amount of processor time consumed so far.

·Least number of lines of output produced so far.

·Most estimated time remaining.

·Least total resources allocated so far.

·Lowest priority.

?

?

Dining Philosophers Problem

·描述

5個哲學家,它們的生活方式是交替地進行思考和進餐。哲學家們共用一張圓桌,分別坐在周圍的5把椅子上。

圓桌中間放有一大碗面條,每個哲學家分別有一個盤子和一支叉子。

如果哲學家想吃面條,則必須拿到靠其最近的左右兩支叉子。進餐完畢,放下叉子繼續思考。

?

·要求

設計一個合理的算法,使全部哲學家都能進餐(非同時),算法必須避免死鎖和饑餓,哲學家互斥共享叉子。


By Semaphores


Program dining philosophers:

Var fork:array[0...4] of semaphore(:=1)

i:integer

Procedure philosopher(i:integer)

?

Begin

? ? Repeat

? ? ? ? Think //哲學家正在思考

? ? ? ? Wait(fork[i]) //取其左邊的筷子

? ? ? ? Wait(fork[i+1]%5) //取其右邊的筷子

? ? ? ? Eat //吃面條

? ? ? ? Signal(fork[i+1]%5) //放回右邊的筷子

? ? ? ? Signal(fork[i]) //放回左邊的筷子

? ? Forever

End

?

Begin

? ? Par-begin

? ? ? ? Philosopher(0);

? ? ? ? Philosopher(1);

? ? ? ? ... ...

? ? ? ? Philosopher(n);

? ? Par-end

End

?

·可能產生死鎖

·可行的解決方案:只允許4個哲學家同時進餐廳就餐,則至少有一個哲學家可以拿到兩只叉子進餐,完畢,放下叉子,其他哲學家就可進餐。不會出現死鎖和饑餓。

?

Program dining philosophers:

Var fork:array[0...4] of semaphore(:=1)

Room:semaphore(:=4)

i:integer

?

Procedure philosopher(i:integer)

Begin

? ? Repeat

? ? ? ? Think //哲學家正在思考

? ? ? ? Wait(room) //5位哲學家被阻塞在room信號量隊列

? ? ? ? Wait(fork[i]) //取其左邊的筷子

? ? ? ? Wait(fork[i+1]%5) //取其右邊的筷子

? ? ? ? Eat //吃面條

? ? ? ? Signal(fork[i+1]%5) //放回右邊的筷子

? ? ? ? Signal(fork[i]) //放回左邊的筷子

? ? ? ? Signal(room) //喚醒阻塞在room信號隊列中的哲學家

? ? Forever

End

?

Begin

? ? Par-begin

? ? ? ? Philosopher(0);

? ? ? ? Philosopher(1);

? ? ? ? ... ...

? ? ? ? Philosopher(n);

? ? ? ? Par-end

? ? End

?

?

回顧

·進程概述

·進程調度

·進程并發控制

? ? >同步與互斥

? ? >死鎖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387222.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CNN tensorflow 人臉識別

數據材料這是一個小型的人臉數據庫&#xff0c;一共有40個人&#xff0c;每個人有10張照片作為樣本數據。這些圖片都是黑白照片&#xff0c;意味著這些圖片都只有灰度0-255&#xff0c;沒有rgb三通道。于是我們需要對這張大圖片切分成一個個的小臉。整張圖片大小是1190 942&am…

數據結構01緒論

第一章緒論 1.1 什么是數據結構 數據結構是一門研究非數值計算的程序設計問題中&#xff0c;計算機的操作對象以及他們之間的關系和操作的學科。 面向過程程序數據結構算法 數據結構是介于數學、計算機硬件、計算機軟件三者之間的一門核心課程。 數據結構是程序設計、編譯…

css3動畫、2D與3D效果

1.兼容性 css3針對同一樣式在不同瀏覽器的兼容 需要在樣式屬性前加上內核前綴&#xff1b; 谷歌&#xff08;chrome&#xff09; -webkit-transition: Opera&#xff08;歐鵬&#xff09; -o-transition: Firefox&#xff08;火狐&#xff09; -moz-transition Ie -ms-tr…

ES6學習筆記(六)數組的擴展

1.擴展運算符 1.1含義 擴展運算符&#xff08;spread&#xff09;是三個點&#xff08;...&#xff09;。它好比 rest 參數的逆運算&#xff0c;將一個數組轉為用逗號分隔的參數序列。 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...doc…

數據結構02線性表

第二章 線性表 C中STL順序表&#xff1a;vector http://blog.csdn.net/weixin_37289816/article/details/54710677鏈表&#xff1a;list http://blog.csdn.net/weixin_37289816/article/details/54773406在數據元素的非空有限集中&#xff1a; (1)存在唯一一個被稱作“第…

訓練一個神經網絡 能讓她認得我

寫個神經網絡&#xff0c;讓她認得我(?????)(Tensorflow,opencv,dlib,cnn,人臉識別) 這段時間正在學習tensorflow的卷積神經網絡部分&#xff0c;為了對卷積神經網絡能夠有一個更深的了解&#xff0c;自己動手實現一個例程是比較好的方式&#xff0c;所以就選了一個這樣比…

數據結構03棧和隊列

第三章棧和隊列 STL棧&#xff1a;stack http://blog.csdn.net/weixin_37289816/article/details/54773495隊列&#xff1a;queue http://blog.csdn.net/weixin_37289816/article/details/54773581priority_queue http://blog.csdn.net/weixin_37289816/article/details/5477…

Java動態編譯執行

在某些情況下&#xff0c;我們需要動態生成java代碼&#xff0c;通過動態編譯&#xff0c;然后執行代碼。JAVA API提供了相應的工具&#xff08;JavaCompiler&#xff09;來實現動態編譯。下面我們通過一個簡單的例子介紹&#xff0c;如何通過JavaCompiler實現java代碼動態編譯…

樹莓派pwm驅動好盈電調及伺服電機

本文講述如何通過樹莓派的硬件PWM控制好盈電調來驅動RC車子的前進后退&#xff0c;以及如何驅動伺服電機來控制車子轉向。 1. 好盈電調簡介 車子上的電調型號為&#xff1a;WP-10BLS-A-RTR&#xff0c;在好盈官網并沒有搜到對應手冊&#xff0c;但找到一份通用RC競速車的電調使…

數據結構04串

第四章 串 STL&#xff1a;string http://blog.csdn.net/weixin_37289816/article/details/54716009計算機上非數值處理的對象基本上是字符串數據。 在不同類型的應用中&#xff0c;字符串具有不同的特點&#xff0c;要有效的實現字符串的處理&#xff0c;必須選用合適的存儲…

CAS單點登錄原理解析

CAS單點登錄原理解析 SSO英文全稱Single Sign On&#xff0c;單點登錄。SSO是在多個應用系統中&#xff0c;用戶只需要登錄一次就可以訪問所有相互信任的應用系統。CAS是一種基于http協議的B/S應用系統單點登錄實現方案&#xff0c;認識CAS之前首先要熟悉http協議、Session與Co…

JDK1.6版添加了新的ScriptEngine類,允許用戶直接執行js代碼。

JDK1.6版添加了新的ScriptEngine類&#xff0c;允許用戶直接執行js代碼。在Java中直接調用js代碼 不能調用瀏覽器中定義的js函數&#xff0c;會拋出異常提示ReferenceError: “alert” is not defined。[java] view plaincopypackage com.sinaapp.manjushri; import javax.sc…

數據結構05數組和廣義表

第五章 數組 和 廣義表 數組和廣義表可以看成是線性表在下述含義上的擴展&#xff1a;表中的數據元素本身也是一個數據結構。 5.1 數組的定義 n維數組中每個元素都受著n個關系的約束&#xff0c;每個元素都有一個直接后繼元素。 可以把二維數組看成是這樣一個定長線性表&…

k8s的ingress使用

ingress 可以配置一個入口來提供k8s上service從外部來訪問的url、負載平衡流量、終止SSL和提供基于名稱的虛擬主機。 配置ingress的yaml&#xff1a; 要求域名解析無誤 要求service對應的pod正常 一、test1.domain.com --> service1:8080 apiVersion: extensions/v1beta1…

JDK1.8中如何用ScriptEngine動態執行JS

JDK1.8中如何用ScriptEngine動態執行JS jdk1.6開始就提供了動態腳本語言諸如JavaScript動態的支持。這無疑是一個很好的功能&#xff0c;畢竟Java的語法不是適合成為動態語言。而JDK通過執行JavaScript腳本可以彌補這一不足。這也符合“Java虛擬機不僅僅是Java一種語言的虛擬機…

數據結構06樹和二叉樹

第六章 樹和二叉樹 6.1 樹的定義和基本術語 樹 Tree 是n個結點的有限集。 任意一棵非空樹中&#xff1a; &#xff08;1&#xff09;有且僅有一個特定的稱為根&#xff08;root&#xff09;的結點&#xff1b; &#xff08;2&#xff09;當n>1時&#xff0c;其余結點可…

2019.03.20 mvt,Django分頁

MVT模式 MVT各部分的功能: M全拼為Model&#xff0c;與MVC中的M功能相同&#xff0c;負責和數據庫交互&#xff0c;進行數據處理。 V全拼為View&#xff0c;與MVC中的C功能相同&#xff0c;接收請求&#xff0c;進行業務處理&#xff0c;返回響應。 T全拼為Tem…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的輔助類來幫助我們進行并發編程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我們就來學習一下這三個輔助類的用法。以下是本文目錄大綱&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

數據結構07排序

第十章內部排序 10.1 概述 排序就是把一組數據按關鍵字的大小有規律地排列。經過排序的數據更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是穩定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不穩定的&#xff0c;如排序后Kj在前。 分類&#xff1a; 內…

數據結構08查找

第九章 查找 另一種在實際應用中大量使用的數據結構--查找表。 所謂查找&#xff0c;即為在一個含有眾多的數據元素的查找表中找出某個“特定的”數據元素。 查找表 search table 是由同一類型的數據元素構成的集合。集合中的數據元素之間存在著完全松散的關系&#xff0c;故…