网络平台怎么搭建网站,wordpress贴吧,wordpress 360浏览器,做情诗网站【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》#xff0c;内容非常棒#xff0c;墙裂推荐#xff1b; 【19.1】死锁场景
1#xff09;死锁#xff1a; 多个进程由于互相等待对方持有的资源而造成的谁也无法执行的情况#xff1b; 1.1#xff09;死…【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》内容非常棒墙裂推荐 【19.1】死锁场景
1死锁 多个进程由于互相等待对方持有的资源而造成的谁也无法执行的情况 1.1死锁造成的结果
cpu执行的进程都在阻塞或自旋且阻塞的进程越来越多则cpu执行的指令没有运行业务程序全都运行自旋程序如while循环这时用户感觉机器响应非常慢最终不响应或死机
1.2正常代码示例
// 生产者
Producer(item)
{P(empty); // empty减1后判断empty是否小于0是则表明没有可用缓冲区当前进程阻塞P(mutext);// mutex减1后判断mutex是否小于0是则表明已有进程进入临界区mutex初始值为1当前进程阻塞// 读入in将item写入到in的位置上 临界区V(mutex); // mutex加1后判断mutex是否小于等于0是则表明存在阻塞进程唤醒在mutex信号量上阻塞的进程V(full); // full加1后判断full是否小于等于0是则表明缓冲区中没有内容唤醒在full信号量上阻塞的消费者进程消费当前进程产生的数据内容
}// 消费者
Consumer()
{P(full); // full减1后判断full是否小于0是则表明缓冲区没有内容可消费当前进程阻塞P(mutex); // mutex减1后判断mutex是否小于0是则表明已有进程进入临界区mutex初始值为1当前进程阻塞// 读入out 从文件中的out 位置读出到item;临界区 // 打印item V(mutex); // mutex加1后判断mutex是否小于等于0是则表明存在阻塞进程唤醒在mutex信号量上阻塞的进程 V(empty); // empty加1后判断 empty 是否小于等于0是则表明没有可用缓冲区唤醒在empty信号量上阻塞的生产者进程使用当前进程释放的一个缓冲区
}
补充PV操作
// 生产者消费资源这里消费资源指的是生产者消费一个空闲缓冲区或一个数组项
P (semaphore s)
{s.value--; // 消费资源 if (s.value 0) {sleep(s.queue); // 当前生产者进程睡眠 }
} // 消费者产生资源 这里产生资源指的是消费者释放一个空闲缓存区或一个数组项
V (semaphore s)
{s.value; // 释放资源if (s.value 0 ) {wakeup(s.queue); // 消费者唤醒睡眠的生产者进程 }
}
1.3死锁代码示例可以看做是用户程序写错了顺序 同正常代码相比把生产者的P(mutex) 放在P(empty)的前面把消费者的P(mutex)放在 P(full)的前面如下 生产者 消费者 Producer(item) { P(mutex); P(empty); // 读入in将item写入到in的位置上 临界区 V(mutex); V(full); } Consumer() { P(mutex); P(full); // 读入out 从文件中的out 位置读出到item;临界区 // 打印item V(mutex); V(empty); }
【代码解说】
生产者P(mutex)mutex减1后判断mutex是否小于0小于0则阻塞等待V(mutex)唤醒生产者P(empty)empty减1后判断empty是否小于0小于0则阻塞等待消费者的V(empty)唤醒生产者P(mutex)mutex减1后判断mutex是否小于0小于0则阻塞等待V(mutex)唤醒消费者P(full)full减1后判断full 是否小于0小于0则阻塞等待生产者的V(full)唤醒【产生死锁场景】 生产者代码1处的empty信号量上阻塞
因为生产者获取了mutex互斥信号量没有释放所以消费者在代码3处阻塞生产者代码1处的P(empty)只能被消费者代码2处的V(empty)唤醒又消费者代码2处的V(empty)依赖代码3处的P(mutex)被唤醒消费者代码3处的P(mutex)只能被生产者的代码4处的V(mutex)唤醒又生产者的代码4处的V(mutex)依赖代码1处的P(empty)被唤醒而代码1处的P(empty)只能被消费者代码2处的V(empty)唤醒这里就形成一个环路了死循环了......
为什么会出现死锁
原因是因为对 mutex的加锁解锁顺序不一致加锁解锁的正确顺序应该是先进后出造成各自占有的资源和互相申请的资源形成记录环路等待。正常代码是 先对empty加锁再对mutex加锁对mutex解锁再对full解锁死锁代码是 先对mutex加锁再对empty加锁对mutex解锁再对full解锁 【19.2】 死锁成因
1死锁成因 各自占有的资源和互相申请的资源形成环路等待。 【19.3】死锁的4个必要条件
14个必要条件
互斥使用资源的固有属性不可抢占资源只能自愿放弃请求和保持进程必须占有资源再去申请循环等待在资源分配图中存在一个环路 【19.4】死锁处理方法概述
1死锁处理的4种方法
死锁预防 破坏死锁的条件死锁避免 检测每个资源请求如果造成死锁就拒绝死锁检测与恢复 检测到死锁出现让一些进程回滚让出资源死锁忽略不处理死锁就好像没有出现死锁一样对于普通pc机器可以使用因为可以通过重启来解决死锁 【19.4.1】死锁预防的方法例子
方法1在进程执行前一次性申请所有需要的资源不会占有资源再去申请其他资源
缺点1需要预知未来编程困难缺点2许多资源分配后很长时间后才使用资源利用率低
方法2 对资源类型进行排序资源申请必须按序进行不会出现环路等待
缺点 仍然造成了资源浪费 【19.4.2】死锁避免
1判断此次请求是否引起死锁 2如果系统中的所有进程存在一个可完成的执行序列 P1, ..., Pn则称系统处于安全状态 3银行家算法
如何判断系统中是否存在一个可完成的执行序列通过银行家算法来实现 4银行家算法找出一个可完成的执行序列的算法 补充
m表示资源的个数n表示进程的个数每做一次资源分配时都要执行银行家算法每次时间复杂度为 10^6若m100n100的情况下缺点银行家算法的时间复杂度为 O(mn^2)时间复杂度比较高效率低 补充银行家算法实例 图片解说
Allocation已分配资源 如 P0对应已分配的A B C类资源分别为 0个 1个 0个 Need 还需要分配资源如P0对应还需要分配的A B C资源分别为 7个4个3个Available操作系统可用资源个数如 ABC对应332 表示可用的A B C资源分别为 3个3个2个
银行家算法步骤
步骤1把可用资源332分配给P0而P0还是无法执行且P1,P2,P3,P4 这4个进程也无法执行所以死锁所以可用资源拒绝分配给P0这是一种预分配算法步骤2把可用资源122分配给P1P1可以运行起来则实际情况是操作系统把可用资源122分配给P1P1运行完成后释放出分配的资源则可用资源为 532因为P1会释放2个A类资源;步骤3把可用资源532分配给P2P2无法执行且除P1外的其他进程也无法执行则死锁所以532拒绝分配给P2步骤4把011分配给P3P3可以执行则实际情况是操作系统把011分配给P3以此类推....因为把可用资源210分配给进程P0后P0无法执行且其他进程因为没有可用资源也无法执行这就造成了死锁所以银行家算法的分配结果是拒绝进程P0的资源申请请求 【19.4.3】死锁检测与恢复发现问题再处理
1定时检测或者是发现资源利用率低时检测 2进程回滚
问题1选择哪一个进程回滚问题2进程如何回滚回滚到什么状态下可以解除死锁 【19.4.4】死锁忽略
许多通用操作系统如windowslinux都 采用了死锁忽略方法因为死锁忽略的代价最小