- P0 0.0 课程白嫖指南
- P2 1.11操作系统的概念、功能和目标
- P3 1.12操作系统的特征
- P4 1.13操作系统的发展与分类
- P5 1.14操作系统的运行机制与体系结构
- P6 1.15中断和异常
- P7 1.16系统调用
- P8 2.11进程的定义、组成、组织方式、特征
- P9 2.12进程的状态与转换
- P10 2.13进程控制
- P11 2.14进程通信
- P1 22.15线程概念和多线程模型
- P13 2.21处理机调度的概念、层次
- P14 2.22进程调度的时机、切换与过程、方式
- P15 2.23调度算法的评价指标
- P16 2.2_4_FCFS、SJF、HRRN调度算法
- P17 2.25调度算法:时间片轮转、优先级、多级反馈队列
- P18 2.31进程同步、进程互斥
- P19 2.32进程互斥的软件实现方法
- P20 2.33进程互斥的硬件实现方法
- P21 2.34信号量机制
- P22 2.35用信号量实现进程互斥、同步、前驱关系
- P23 2.36生产者-消费者问题
- P24 2.37多生产者-多消费者问题
- P25 2.38吸烟者问题
- P26 2.39读者-写者问题
- P27 2.310哲学家进餐问题
- P28 2.311管程
- P292.41死锁的概念(1)
- P30 2.42死锁的处理策略—预防死锁
- P31 2.43死锁的处理策略—避免死锁
- P32 2.44死锁的处理策略—检测和解除
- P33 3.11内存的基础知识
- P34 3.12内存管理的概念
- P35 3.13覆盖与交换
- P36 3.14连续分配管理方式
- P37 3.15动态分区分配算法
- P38 3.16基本分页存储管理的基本概念
- P39 3.17基本地址变换机构
- P40 3.18具有快表的地址变换机构
- P41 3.19两级页表
- P42 3.110基本分段存储管理方式
- P43 3.111段页式管理方式
- P44 3.21虚拟内存的基本概念
- P45 3.22请求分页管理方式
- P46 3.23页面置换算法
- P47 3.24页面分配策略
- P48 4.11初识文件管理
- P49 4.12文件的逻辑结构
- P50 4.13文件目录
- P51 4.14文件的物理结构(上)
- P52 4.14文件的物理结构(下)
- P53 4.15文件存储空间管理
- P54 4.16文件的基本操作
- P55 4.17文件共享
- P56 4.18文件保护
- P57 4.19文件系统的层次结构
- P58 4.21磁盘的结构
- P59 4.22磁盘调度算法
- P60 4.23减少磁盘延迟时间的方法
- P61 4.24磁盘的管理
- P62 5.1_1_I-O设备的概念和分类
- P63 5.1.2_I-O控制器
- P64 5.1.3_I-O控制方式
- P65 5.1_4_I-O软件层次结构
- P66 5.1_5_I-O核心子系统
- P67 5.16假脱机技术
- P68 5.17设备的分配与回收
- P69 5.18缓冲区管理
P0 0.0 课程白嫖指南
P2 1.11操作系统的概念、功能和目标
P3 1.12操作系统的特征
P4 1.13操作系统的发展与分类
P5 1.14操作系统的运行机制与体系结构
P6 1.15中断和异常
P7 1.16系统调用
P8 2.11进程的定义、组成、组织方式、特征
P9 2.12进程的状态与转换
P10 2.13进程控制
P11 2.14进程通信
P1 22.15线程概念和多线程模型
P13 2.21处理机调度的概念、层次
P14 2.22进程调度的时机、切换与过程、方式
P15 2.23调度算法的评价指标
P16 2.2_4_FCFS、SJF、HRRN调度算法
P17 2.25调度算法:时间片轮转、优先级、多级反馈队列
P18 2.31进程同步、进程互斥
P19 2.32进程互斥的软件实现方法
P20 2.33进程互斥的硬件实现方法
P21 2.34信号量机制
P22 2.35用信号量实现进程互斥、同步、前驱关系
P23 2.36生产者-消费者问题
P24 2.37多生产者-多消费者问题
P25 2.38吸烟者问题
P26 2.39读者-写者问题
P27 2.310哲学家进餐问题
P28 2.311管程
P292.41死锁的概念(1)
死锁、饥饿、死循环的区别
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直都得不到处理,从而发生长进程“饥饿”。
死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。
共同点 | 区别 | |
---|---|---|
死锁 | 都是进程无法顺利推进的现象(故意设计的死循环除外) | 死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态 |
饥饿 | 可能只有一个进程发生饥饿。发生饥饿的进程即可能阻塞态(如长期得不到需要的I/O设备),也可能是就绪态(长期得不到处理机) | |
死循环 | 可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。 |
死锁产生的必要条件
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生
互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)一个线程使用了其他线程就无法使用
不剥夺条件:进程锁获得的资源再未使用完之前,不能由其他进程强行夺走,只能主动释放。
请求和保持条件:进程已经保持类至少一个资源,但又提出新的资源请求,而该资源又被其他进程占用,此时请求进程被阻塞,但又对自己已有的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
注意!发送死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)
如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。
什么时候会发生死锁
- 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。
- 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
- 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)
死锁的处理策略
- 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
- 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
- 死锁的检测和解除。允许死锁的发发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
P30 2.42死锁的处理策略—预防死锁
知识回顾:死锁的产生必须满足四个必要条件,只要其中一个或者几个条件不满足,死锁就不会发生
破坏互斥条件
破坏不剥夺条件
不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
破坏不剥夺条件
方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时候再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏不可剥夺条件。(大白话就是主动放弃)
方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)
该策略的缺点:
- 实现起来比较复杂
- 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
- 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
- 若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就需要放弃,以后再重新申请。如果一直发生这样的情况,就会导致进程饥饿。
破坏请求和保持条件
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放
可以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。
该策略实现起来简单,但也有明显的缺点:
有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。
破坏循环等待条件
循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。
原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。
该策略的缺点:
- 不方便增加新的设备,因为可能重新分配所有的编号;
- 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费。
- 必须按规定次序申请资源,用户编程麻烦。
P31 2.43死锁的处理策略—避免死锁
所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺序完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是考虑到最坏的情况。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。
P32 2.44死锁的处理策略—检测和解除
如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供两个算法:
1 死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁。
2 死锁解除算法:当认定系统中已经发生了死锁,利用该算法可以将系统从死锁状态中解脱出来。
死锁的检测
检测死锁的算法: