操作系统七死锁
来源:互联网 发布:阿里云开通端口 编辑:程序博客网 时间:2024/05/19 23:13
1.系统模型
当一组进程中的每个进程都在等待一个事件,而这一事件只能由这一组进程的另一进程引起,那么这组进程就处于死锁状态。
2.死锁特征
2.1必要条件
下面4个条件同时满足,那么会引起死锁
互斥:一次只有一个进程使用
占用并等待:一个进程必须占用至少一个资源,并等待另一资源而改资源被其他进程占用
非抢占:资源不能被抢占,即资源只能在进程完成任务后释放
循环等待:有一组进程p0.....pn ,p0等待的资源被p1占用,p1等待的资源被p2占有,......,pn等待的资源被p0占有
这四个条件并不完全独立,以后会讨论单个条件满足时的情况
2.2资源分配图
死锁问题可用资源分配图描述:结点有两种,一种是活动进程,另一是资源类型;有向边是指一个进程已申请了资源类型的一个实例并正在等待或者表示资源类型的一个实例已经被分配给了一个进程。
根据资源分配图的定义,可以证明,如果分配图没有环,那么进程就没有死锁,若分配图有环,那么可能存在死锁。
如果每个资源类型刚好有一个实例,那么意味着已经出现死锁。这种情况下环是死锁存在的充分必要条件。
3.死锁处理方法
4.死锁预防
将4个必要条件不成立,就能预防死锁
4.1互斥
对于非共享资源,必须有个互斥条件。共享资源不要求互斥访问,因此不会涉及死锁。
4.2占用并等待
为确保这个条件不会在系统内出现,必须保证:当一个进程申请一个资源时,他不能占用其他资源。
一种可以使用的协议是每个进程在执行前申请并获得所有资源,这样在进程执行时他会一直占有该资源。另外一种协议是允许进程在没有资源时才可以申请资源,然而在申请资源之前,他必须释放他所占有的资源。
这两种方法有两个缺点:一是资源利用率可能较低,二是可能发生饥饿。
4.3非抢占
为确保对已分配的资源不能抢占的条件不成立。可使用这种协议:若一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都可被抢占。这个协议通常适用于可以保存和恢复的资源,如cpu寄存器和内存。
4.4循环等待
使该条件不成立的方法是对所有的资源类型完全排序,且要求每个进程按递增顺序来申请资源。
5.死锁避免
上面一节是通过限制资源申请的方法来预防死锁,其副作用是低设备使用率和系统吞吐量。
另一方法是动态的检测资源分配状态以确保循环等待条件不可能成立。
5.1安全状态
如果系统能按某个顺序为每个进程分配资源并能避免死锁,那么系统状态时安全的。更为准确的说法是如果存在一个安全序列,那么系统处于安全状态。
进程顺序<p1,p2,.....pn>,如果对每个进程pi,其可以申请的资源数小于当前可用资源加上所有进程pj (j<i)所占用的资源,那么这一顺序称为安全序列。
5.2资源分配图算法
5.3银行家算法
对于每种资源类型有多个实例的资源分配系统,资源分配图算法就不适用了。银行家算法可适用于这种系统,但其效率比资源分配图算法更低。其名称由来是因为其可用于银行系统。当其不能满足所有用户需要时,银行绝不会分配给其现金。
6.死锁检测
7.死锁恢复
7.1进程终止
两种方法:一种是终止所有进程,二是一次只终止一个进程知道取消死锁循环为止。
7.2资源抢占
有三点要考虑:选择一个牺牲品、回滚以及饥饿。如果系统主要根据代价来选择牺牲进程来进行回滚,那可能出现饥饿现象,导致所选进程永远不能完成任务
8.小结
死锁避免算法比预防算法要求低,只要事先了解进程使用资源的情况即可。
- 操作系统七死锁
- 操作系统总结(七)死锁
- 操作系统死锁
- 操作系统死锁
- 操作系统死锁
- 操作系统死锁
- 操作系统 死锁
- 死锁---操作系统
- 操作系统------死锁
- 操作系统-死锁
- 【操作系统】死锁
- 多线程七(死锁)
- 操作系统程序设计 死锁
- 操作系统之死锁
- 操作系统死锁 四个必要条件
- 死锁——操作系统
- 操作系统 第九章 死锁
- 操作系统之死锁
- java 正则表达式 (非常详细)
- Linux 终端显示乱码解决
- mp4播放器中音量的调节(win8开发中遇到的问题)
- 前31项(傅里叶,沃什,U系统,哈尔,V系统)分解重构对比
- Android中的Handler, Looper, MessageQueue和Thread
- 操作系统七死锁
- 玩玩指针
- java中final的意义
- 设计模式5:单例模式【创建型】
- string search and match
- Django startproject的问题
- OS开源项目汇总——Wifi扫描,条码扫描,base64等等
- Why Google uses MTP instead of USB file transfer on Android 3.
- gcc编译C++程序