操作系统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.mzph.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…

数据结构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…

树莓派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…

数据结构05数组和广义表

第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展&#xff1a;表中的数据元素本身也是一个数据结构。 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束&#xff0c;每个元素都有一个直接后继元素。 可以把二维数组看成是这样一个定长线性表&…

数据结构06树和二叉树

第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集。 任意一棵非空树中&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的结点&#xff1b; &#xff08;2&#xff09;当n>1时&#xff0c;其余结点可…

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;故…

下载Centos7 64位镜像

下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址&#xff1a;https://www.centos.org/&#xff0c;点击Get CentOS Now 2.点击Minimal ISO镜像 Minimal ISO镜像&#xff0c;与DVD ISO镜像的差别有很多&#xff0c;这里只说两点 1.Minimal ISO类似于Windows的纯净…

Scala01入门

第1章 可伸展的语言 Scala应用范围广&#xff0c;从编写脚本&#xff0c;到建立大型系统。 运行在标准Java平台上&#xff0c;与Java库无缝交互。 更能发挥力量的地方&#xff1a;建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…