解决死锁问题的方法主要有以下几种:
1. 预防死锁(Deadlock Prevention):预防死锁是通过破坏死锁的四个必要条件之一来防止死锁的发生。常见的预防死锁的方法包括:
- - - -破坏互斥条件:允许多个进程共享资源,或者使用可重入资源。就没有进程会阻塞在资源上,从而不发生死锁。
只读数据文件、磁盘等软硬件资源均可采用这种办法管理;
但是许多资源是独占性资源,如可写文件、键盘等只能互斥的占有;
所以这种做法在许多场合是不适用的。
- - - -破坏请求与保持条件:采用静态分配的方式,静态分配的方式是指进程必须在执行之前就申请需要的全部资源,且直至所要的资源全部得到满足后才开始执行。
实现简单,但是严重的减低了资源利用率。
因为在每个进程占有的资源中,有些资源在运行后期使用,有些资源在例外情况下才被使用,可能会造成进程占有一些几乎用不到的资源,而使其他想使用这些资源的进程等待。
- - - -破坏不可剥夺条件:剥夺调度能够防止死锁,但是只适用于内存和处理器资源。 方法一:占有资源的进程若要申请新资源,必须主动释放已占有资源,若需要此资源,应该向系统重新申请。 方法二:资源分配管理程序为进程分配新资源时,若有则分配;否则将剥夺此进程已占有的全部资源,并让进程进入等待资源状态,资源充足后再唤醒它重新申请所有所需资源。
- - - -破坏循环等待条件:给系统的所有资源编号,规定进程请求所需资源的顺序必须按照资源的编号依次进行。
采用层次分配策略,将系统中所有的资源排列到不同层次中
- 一个进程得到某层的一个资源后,只能申请较高一层的资源
- 当进程释放某层的一个资源时,必须先释放所占有的较高层的资源
- 当进程获得某层的一个资源时,如果想申请同层的另一个资源,必须先释放此层中已占有的资源。
2. 避免死锁(Deadlock Avoidance):避免死锁是通过动态地分配资源来避免系统进入可能导致死锁的状态。常见的避免死锁的算法包括银行家算法和资源分配图算法。这些算法根据进程对资源的请求和系统资源的可用情况,判断是否分配资源会导致死锁,如果会,则不分配资源,否则进行资源分配。
3. 检测与恢复(Deadlock Detection and Recovery):检测与恢复是允许系统进入可能导致死锁的状态,但通过周期性地检测死锁并采取适当的恢复措施来解决死锁。常见的死锁检测算法包括资源分配图算法和银行家算法。一旦检测到死锁,可以采取以下恢复措施:
- 进程终止:终止部分或全部进程来释放资源。
- 资源抢占:抢占部分或全部资源来满足其他进程的需求。
- 进程回滚:回滚进程的状态到先前的检查点,释放已经获得的资源。
4. 忽略死锁(Deadlock Ignorance):有些系统选择忽略死锁问题,认为死锁发生的概率非常低,或者解决死锁问题的代价过高。这种方法适用于某些实时系统或简单的应用场景,但不适用于大多数系统。
最后呢,选择哪种解决死锁的方法取决于具体的应用场景、系统需求和性能要求。在设计和开发阶段,应该根据系统的特点和需求选择合适的方法,并进行适当的调整和优化。
----可能这是纯文字不是很好理解,但还是希望大家能有所收获----
文章介绍了四种处理死锁的方法:预防死锁通过破坏四个必要条件之一,避免死锁使用动态资源分配,检测与恢复通过检测并解除死锁状态,以及忽略死锁策略。预防和避免死锁各有优缺点,而检测与恢复则涉及进程终止、资源抢占等措施。
4809

被折叠的 条评论
为什么被折叠?



