操作系统概念学习笔记 13 死锁(一)

操作系统概念学习笔记 13

死锁(一)



所有申请的资源都被其他等待进程占有,那么该等待进程有可能在无法改变其状态,这种情况称为死锁(deadlock)

系统模型

进程在使用资源之前必须先申请资源,在使用资源之后要释放资源。进程所申请的资源数量不能超过系统所有资源的总量。

在正常操作模式下,进程只能按如下顺序使用资源:

  • ①申请:如果申请不能立即被允许,那么申请进程必须等待,直到它获得该资源为止。
  • ②使用:进程对资源进行操作。
  • ③释放:进程释放资源

资源的申请与释放为系统调用。其他资源的申请与释放可以通过信号量的wait与signal操作或通过互斥锁的获取与释放来完成。因此对于进程和线程的每次使用,操作系统会检查以确保使用进程已经申请并获得了资源。

系统表记录了每个资源是否空闲或已被分配,分配给了哪个进程。如果进程正在申请的资源正在为其他进程所使用,那么该进程会增加到该资源的等待队列。

当一组进程的每个进程都在等待一个事件,而这个事件只能由这一组进程的另一个进程所引起,那么这组进程就处于死锁状态。

死锁也可设计不同的资源类型。多线程可能因为竞争共享资源而容易产生死锁。

死锁特征

当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行。

必要条件:

如果在一个系统中下面四个条件同时满足,那么会引起死锁。

(1) 互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用,如果另一个进程申请该资源,那么申请进程必须等到该资源被释放为止。

(2) 占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有。

(3) 非抢占:资源不能被抢占,即资源只能在进程完成任务后自动释放。

(4) 循环等待:有一组等待进程{P0,P1,P2,P3…,Pn},P0等待的资源被P1等待,P1等待的资源被P2所占有,……,Pn-1等待的资源为Pn所占有,Pn所等待的资源被P0所占有。

4个条件必须同时满足才会出现死锁,循环等待条件意味着占有并等待条件,这样四个条件并不完全独立。

资源分配图:

死锁问题可用称为系统资源分配图的有向图进行更为精确地描述。

这种图由一个节点集合V和一个边集合E组成。节点集合V可以分成两种类型的节点:

  • P={P1,P2,…,Pn}(系统活动进程的集合)
  • R={R1,R2,…,Rn}(系统所有资源的集合)

Pi -> Rj 表示进程Pi已经申请了资源类型为Rj的一个实例,称为申请边

Rj->Pi表示资源类型Rj已经分配给进程Pi,称为分配边

如一个分配图的例子如下:

可以证明:

如果分配图没有环,那么系统就没有进程死锁。如果分配图有环,那么可能存在死锁。

如果每个类型只有一个实例,环是死锁存在的充分必要条件。过每个类型不止一个实例,环是死锁的必要条件。

存在死锁的资源分配图:

存在环但是没有死锁的资源分配图

死锁处理方法:

有三种方法:

  • 可使用协议以预防或避免死锁,确保系统不会进入死锁状态。
  • 可允许系统进入死锁状态,然后检测它,并加以修复。
  • 可忽略这个问题,认为死锁不可能在系统内发生。

这里第三种方法为绝大多数操作系统所用,因此应用程序开发人员需要自己来处理死锁。

为了确保死锁不会发生,系统可以采用死锁预防或死锁避免方案

死锁预防(deadlock prevention)是一组方法,以确保至少一个必要条件不成立。这些方法通过限制如何申请资源的方法来预防死锁。

死锁避免(deadlock avoidance)要求操作系统事先得到有关进程申请资源和使用资源的额外信息。有了这些额外信息,系统可以确定:对于一个申请,进程是否应等待。为了确定当前申请是允许还是延迟,系统必须考虑可用资源,已经分配给每个进程的资源,每个进程将来申请和释放的资源。

除此之外,系统还可以提供一个算法来检查系统状态来确定死锁是否发生,并提供另一个算法来从死锁中恢复。

预防死锁的副作用是降低设备的使用率和系统的吞吐率。

缺点是低设备使用率和系统吞吐率。

死锁预防:

出现死锁有四个必要条件,只要保证至少一个条件不成立,就能预防死锁的发生。

互斥:

对于非共享资源,必须要有互斥条件(如打印机)。另一方面,共享资源不要求互斥访问,因此不会涉及死锁(如只读文件)。

故通常不能通过否定互斥条件来预防死锁,有的资源本身就是非共享的。

占有并等待:

为了确保占有并等待条件不会在系统内出现,必须保证:当一个进程申请一个资源时,就不能占有其他资源

  • 方法一:可以使用的协议是每个进程在执行前申请并获得所有资源。通过要求申请资源的系统调用在所有其他系统调用之前进行。
  • 方法二:允许进程在没有资源时才可申请资源,一个进程可申请一些资源并使用它们,然而,在它申请更多其他资源之前,它必须释放其现已分配的所有资源。

这两种协议有两个主要缺点

  • 第一,资源利用率(resource utilization)可能比较低,因为很多资源可能已分配,但长时间没有被使用。
  • 第二,可能发生饥饿。一个进程如需要多个常用资源,可能会永久等待,比如因为其所需要的资源中至少一个总是分配给其他的进程。

非抢占:

为确保这一条件不成立,可使用如下协议:

即可以抢占,如果一个进程占用资源并申请另一个不能立即分配的资源,那么其现已分配的资源都可被抢占,即这些资源被隐式地释放了。只有当进程获得其原有资源和所申请的新资源时,进程才可以重新执行。

或者说,如果一个进程申请一些资源,首先检查是否可用,如果可用就分配它们,如果不可用,那么检查这些资源是否已分配给其他等待额外资源的进程。如果是就抢占这些资源,并分配给申请进程。如果资源不可用且也不可被其他等待进程占有,那么申请进程必须等待。当一个进程处于等待时,如果其他进程申请其拥有的资源,那么该进程部分资源可以被抢占。一个进程要重新执行,他必须分配到其所申请的资源,并恢复其在等待时被抢占的资源。

这个协议通常用于状态可以保存和恢复的资源,如CPU寄存器和内存,一般不适用其他资源,如打印机和磁带驱动器。

循环等待:

一个确保此条件不成立的方法是:对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。

设R={R1,R2,R3,…,Rn}为资源类型的的集合。为每个资源类型分配一个唯一整数来允许比较两个资源以确定其先后顺序。可定义一个函数F:R -> N ,其中N是自然数集合,例如:

F(tape drive)=1

F(disk drive)=5

F(printer)=12

每个进程只按照递增顺序申请资源,即一个进程开始可以申请任意数量的资源类型为Ri的实例。之后,当且仅当F(Rj)> F(Ri)时,该进程可以申请资源Rj的实例。如果需要同一资源类型的多个实例,那么对它们必须一起申请。

例如,对于以上给定函数,一个进程如果同时需要打印机和磁带驱动器,那么就必须先申请磁带驱动器,再申请打印机。换句话说,要求当一个进程申请资源类型Rj时,必须先释放所有Ri(F(Ri)> F(Rj))

可以使用反证法证明,使用这两个协议,那么循环等待就不可能成立。

设计一个完全排序或层析并不能防止死锁,而是要靠应用程序员来按顺序编写程序。另外函数F应该根据系统内资源使用的正常顺序来定义。例如,由于磁带通常在打印机之前使用,所以定义F(tape drive)< F(printer)较为合理。

时间: 2024-08-01 20:29:51

操作系统概念学习笔记 13 死锁(一)的相关文章

操作系统概念学习笔记 5 操作系统管理简述

操作系统概念学习笔记 5 操作系统管理简述 进程管理 处于执行中的程序被称作进程. 进程需要一定的资源(包括cpu时间.内存.文件.I/O设备)来完成任务.这些资源可以在进程创建时分配给进程,也可以在执行时分配给进程.除了在创建时得到各种物理和逻辑资源外,进程还可以接受传输过来的各种初始化数据. 程序本身并不是进程,程序是被动的实体.而进程是活动的实体.进程是系统工作的单元. 单线程进程具有一个程序计数器来明确下一个执行的指令,直到进程终止. 在任何时候,最多只有一个指令代表进程被执行.因此,尽

操作系统概念学习笔记 9 线程

操作系统概念学习笔记 9 线程 概述 单个进程可以包括多个控制线程. 线程 --一种CPU利用的基本单元,它是形成多线程计算机的基础. 线程是CPU使用的基本单元,它由线程ID.程序计数器.寄存器集合和栈组成.它与属于统一进程的其他线程共享代码段.数据段和其他操作系统资源. 一个传统重量级的进程只有单个控制线程,如果进程有多个控制线程,那么能同时做多个任务. 单线程与多线程 动机 一个应用程序通常是作为一个具有多个控制线程的独立进程实现的.如一个忙碌的网页服务器如果有多个(或数千个)客户并发访问

操作系统概念学习笔记 15 内存管理(一)

操作系统概念学习笔记 15 内存管理(一) 背景 内存是现代计算机运行的中心.内存有很大一组字或字节组成,每个字或字节都有它们自己的地址.CPU根据程序计数器(PC)的值从内存中提取指令,这些指令可能会引起进一步对特定内存地址的读取和写入. 一个典型指令执行周期,首先从内存中读取指令.接着该指令被解码,且可能需要从内存中读取操作数.在指令对操作数执行后,其结果可能被存回到内存.内存单元只看到地址流,而并不直到这些地址是如何产生的(由指令计数器.索引.间接寻址.实地址等)或它们是什么地址(指令或数

《30天自制操作系统》笔记(13)——总结

<30天自制操作系统>笔记(13)——总结 进度回顾 上一篇介绍了操作系统实现多任务的方法.操作系统利用CPU的far模式的JMP指令.寄存器TR.GDT.TSS和PIT中断这些功能实现了多任务,可见CPU在设计时就考虑到了计算机要具有多任务处理的能力.也就是说,CPU.PIC等硬件支持什么功能,操作系统才能实现什么功能. 至此全书已经读了一半.我发现后半部分读不下去,也没必要再读了.本篇就对所有的笔记做一总结,至此<30天自制操作系统>这本书就暂且不读了. 所学所感 我们可以把C

操作系统概念学习笔记 12 进程同步(二)管程

操作系统概念学习笔记 12 进程同步(二) 管程 基本的.高级的同步构造,即管程(monitor)类型. 使用: 管程类型提供了一组由程序员定义的.在管程内互斥的操作.管程类型的表示包括一组变量的声明(这些变量的值定义了一个类型实例的状态)和对这些变量操作的子程序和函数的实现.管程的类型表示不能直接为各个进程所使用.因此,在管程内定义的子程序只能访问位于管程内那些局部声明的变量和形式参数.类似的,管程的局部变量能被局部子程序访问. 管程结构确保一次只有一个进程能在管程内活动.不需要显示的编写同步

操作系统概念学习笔记 10 CPU调度

操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU,操作系统可以提高计算机的吞吐率. 对于单处理器系统,每次只允许一个进程运行:任何其他进程必须等待,直到CPU空闲能被调度为止. 多道程序的目标是在任何时候都有某些进程在运行,以使CPU的使用率最大化.多道程序的思想较为简单,当一个进程必须等待时,操作系统会从该进程拿走CPU的使用权,而将CPU交给其他进程. CPU-I/O 区间周期 CPU的成功调度依赖于进程的如下属性: 进程执行由CPU执行周期和I/O等

操作系统概念学习笔记 3 存储结构和I/O结构

操作系统概念学习笔记 3 存储结构与I/O结构 存储结构 计算机必须在内存或RAM(随机访问内存random access memory)运行,内存是处理器可以直接访问的唯一大容量存储区域. 内存和处理器本身内置寄存器是cpu能直接访问的唯一存储介质. 指令load能将内存中的字移到cpu内部的寄存器中.而指令store能将寄存器的内容移动到内存.除了显式使用load和store,cpu可自动从内存中装入指令以执行. 内存比较小,并且是易失性存储设备,所以计算机系统提供辅助存储器作为内存的扩充.

操作系统概念学习笔记 2 系统中断

操作系统概念学习笔记 2 系统中断 概述 现代操作系统是中断驱动的.如果没有进程可执行,没有I/O设备可服务,没有用户可响应,那么操作系统就会安静的等待事件的发生. 事件的发生几乎总是通过中断或者陷阱来表征的. 陷阱(trap)或异常(exception)是因错误(如除0.非法访问内存)或者用户程序(执行操作系统服务)的特定请求所引起的软件生成中断. 对于中断,硬件可以随时通过系统总线向cpu发出信号,触发中断. 软件通过执行系统调用的特别操作触发中断. 对于每种类型的中断,操作系统都有一段独立

操作系统概念学习笔记 16 内存管理(二) 段页

操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份存储上找到空间,这是问题就产生了.备份存储也有前面所述的与内存相关的碎片问题,只不过访问更慢). 传统上,分页支持一直是由硬件来处理的.最近的设计是通过将硬件和操作系统相配合来实现分页. 基本方法 实现分页的基本方法设计将物理内存分