死锁有关问题入门知识
死锁问题入门知识
今天我们一起来学习死锁,一起沐黎文伟老师的春风(我的操作系统老师叫做黎文伟),呵呵呵。
什么是死锁:
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的原因主要是:
因为系统资源不足。
进程运行推进的顺序不合适。
资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
死锁出现的必要条件:
互斥使用(资源独占)
一个资源每次只能给一个进程使用
不可强占(不可剥夺)
资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
请求和保持(部分分配,占有申请)
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)
循环等待
存在一个进程等待队列
{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-->