操作系统–磁盘与死锁
1、磁盘
一次磁盘读/写操作需要的时间
1、寻找时间(寻道时间):在读/写数据前,将磁头移动到指定磁道所花的时间。
2、延迟时间:通过旋转磁盘,使磁头定位到目标扇区所需要的时间
3、传输时间:从磁盘读取或向磁盘写入数据所经历的时间。
延迟时间与传输时间都与磁盘转速相关,是磁盘的固有属性,若想减少整个读/写操作时间,操作系统能干涉的是寻道时间。
★ 磁盘调度算法
算法名称 | 算法规则 | 优点 | 缺点 |
---|---|---|---|
先来先服务算法 | 根据进程请求访问磁盘的先 后顺序进行调度 | 公平,如果请求访问的磁道比较集中的话,算法性能还能算过得去 | 如果大量进程竞争使用磁盘,请求访问的磁道很分散 |
最短寻找时间优先 | 优先处理与当前磁头最近的磁道 | 性能较好,平均寻道时间短 | 可能产生饥饿现象(磁头在一个小区域内来回地移动,即假设在处理12号磁道时,来了个1号的磁道请求,接着又来了个12号的,这样源源不断的请求,其他区域的请求无法得到满足) |
扫描算法 | 只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧的时候才能往外移动 | 性能较好,平均寻道时间较短,不会产生饥饿现象 | 只有到达最边上的磁道才能改变磁头移动方向,对于边上没有请求的情况没有利;对于各个位置磁道的响应频率不平均 |
LOOK调度算法 | 扫描算法的改进,如果磁头移动方向上已经没有别的请求就可以立即改变磁头移动方向 | 比起扫描算法,不需要每次都移动到最外侧/最内侧,进一步缩短寻道时间 | |
循环扫描算法 | 只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求 | 相对扫描算法,对于各个位置磁道的响应频率很平均 | 只有到达最边上的磁道才能改变磁头移动方向 |
C-LOOK调度算法 | 循环扫描算法的改进,如果磁头移动方向上已经没有别的请求就可以立即改变磁头移动方向,并且只需回到由磁道访问请求的位置即可 | 比起循环扫描算法,不需要每次都移动到最外侧/最内侧才改变磁头方向,进一步缩短寻道时间 |
2、死锁
死锁的概念:在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象。
区别 | |
---|---|
死锁 | 死锁一定是循环等待对方手里的资源导致,因此如果有死锁现象至少有两个或两个以上的进程同时发生死锁,发生死锁的进程一定处于阻塞态。 |
饥饿 | 可能只有一个进程发生饥饿,发生饥饿的进程既可能是阻塞态(如长期等不到分配的资源),也有可能是就绪态(如长期分配不到处理机) |
死循环 | 可能只有一个进程发生死循环,有时是程序逻辑bug导致,有时是程序员故意设计。而死锁和饥饿是由于操作系统分配资源策略的不合理导致。 |
死锁必须满足以下四个条件:
1、互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁;
2、不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放;
3、请求和保持条件:进程已经保持了至少一个资源,但又提出新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但对自己已有的资源保持不放。
4、循环等待条件:存在一种进程资源的循环等待链,链中的每个进程已获得的资源同时被下一个进程所请求。
循环等待是死锁的必要不充分条件。
3、死锁的处理策略
3.1 预防死锁
破坏死锁所必备的条件:
破坏互斥条件:把只能互斥使用的资源改造成允许共享使用,如使用spooling技术把独占设备在逻辑上改造成共享设备。
破坏不剥夺条件:当某个进程请求新的资源得不到满足时,必须立即释放保持的所有资源,待以后需要时再重新申请;或者由操作系统协助,进行强制剥夺。
破坏请求和保持条件:采用静态分配方法,即进程在运行前一次申请完她所需要的全部资源。
破坏循环等待条件:采用顺序资源分配法,即破防循环等待的现象
3.2 避免死锁
银行家算法核心思想:在进程提出资源申请时,预先判断这次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
银行家算法步骤:
- 检查此次申请是否超过了之前声明的最大需求数
- 检查此时系统剩余的可用资源是否还能满足此次请求
- 用安全性算法检查分配是否会导致系统进入不安全状态
安全性算法步骤:检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收,不断重复上述过程,看最终是否能让所有进程都加入安全序列。
判断依据:是否能找到安全序列,如果找不到安全序列,会使系统处于不安全状态,可能会发生死锁。
3.3 死锁的检测和解除
死锁的检测
用某种数据结构保存资源的请求和分配的信息,提供一种算法,利用上述信息来检测系统是否已进入死锁状态。
对资源分配图,如果最终能消除所有边,即这个图可完全简化的,此时一定没有发生死锁。如果不能消除所有边,那么此时就是发生了死锁,并不是所有进程处于死锁状态,最终连着边的进程蔡是处于死锁状态。
死锁解除
一日检测出死锁的发生,就应该立即解除死锁。
解除死锁的主要方法有:
-
资源剥夺法
挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
-
撤销进程法(或称终止进程法)
强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
-
进程回退法
让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
具体对哪个死锁进程”动手”取决于:进程优先级、已执行多长时间、还要多久完成、进程已经使用了多少资源、进程是交互式的还是批处理式的。