死锁有关问题入门知识

死锁问题入门知识

死锁问题入门知识

今天我们一起来学习死锁,一起沐黎文伟老师的春风(我的操作系统老师叫做黎文伟),呵呵呵。

什么是死锁:

是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

产生死锁的原因主要是:
因为系统资源不足。
进程运行推进的顺序不合适。
资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

死锁出现的必要条件:

互斥使用(资源独占) 
 一个资源每次只能给一个进程使用 
不可强占(不可剥夺) 
    资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 
请求和保持(部分分配,占有申请) 
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) 
循环等待 
存在一个进程等待队列 
    {P1 , P2 , … , Pn}, 
    其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路

资源分配图:

资源分配图用来精确描述系统资源分配场景(死锁)

资源分配图标识:

1、节点:进程节点P(每一个进程有一个节点),资源节点R(每一类有一个节点)

2、边:请求边(从进程节点指向资源节点),分配边()

 

画法:

Process


死锁有关问题入门知识
 

 

Resource Type with 4 instances


死锁有关问题入门知识
  

资源分配图的观察:

1、无环无死锁

2、有环可能死锁

a) 所有资源都是单资源实例

b) 多类资源,有一个资源有一个实例,其他资源有多个实例;环所涉及的资源只有一个实例

c) 无环一定无死锁

死锁实例:


死锁有关问题入门知识
  

活锁

如果有太多进程或操作在短时间内大量请求同一资源出现了活锁;

特点:

好像停滞了,但可以解开;

数据库例子:如果食物T1*了数据R,事务T2又请求*R,于是T2等待。T3也请求*R,当T1释放了R上的*之后系统首先批准了T3的请求,T2仍然在等待。然后T4又请求*R,当T3释放了R上的*之后系统又批准了T4的请求,……,T2有可能永远等待,这就是活锁的情形

网络的例子:中断活锁;

网卡速率变化导致数据包处理方式的变化

中断->轮询

三种处理死锁的方式:

1、死锁的预防和避免

预防:防止死锁出现;

避免:评估死锁是否会发生进行评估,如果有可能则不执行;

2、死锁的检查和恢复

3、鸵鸟策略:不管它,忽略

鸵鸟策略看似可笑,但是应用还是比较广泛的:

数学家观点(理论型,完美主义者):

希望世界完美无缺

有问题就必须处理,无论任何代价

工程师观点(实践):

能够工作就可以

有问题(死锁):频率、危害、处理代价进行比较

死锁频率<其他故障频率

处理代价>大于处理代价

死锁避免和预防方法:

1、消除互斥——非共享资源必须互斥访问,可共享资源无需互斥访问。

什么是共享?现代操作系统中,几乎所有的资源都是共享的,但这样的共享只是宏观意义上的,微观上,共享分为分时共享CPU、打印机,和同时共享如只读文件

2消除持有并等待——进程请求资源时不持有任何资源

执行前请求所有资源(不一定可行,因为一个进程执行前,不一定知道自己需要多少资源)

在请求资源前先释放所有资源

这个方式的缺点:有可能一个进程申请了资源但很久才用,有可能一个进程需要多个资源,不是所有资源都不是一次性能申请到的;

3、消除非抢占——请求的资源不可得时已持有的资源可被抢占(隐式释放)

这样的方式只能用于一些特殊情况:只能用于状态可以保存和恢复的资源

4、循环等待条件的消除

以上就是今天给大家补的知识~~希望以后继续跟大家共同进步~~~

<!--EndFragment-->