1 死锁
- 临界资源
每次只允许一个进程访问的资源,分硬件临界资源、软件临界资源。 - 临界区
每个进程中访问临界资源的那段程序叫做临界区。
进程对临界区的访问必须互斥,每次只允许一个进程进去临界区,其他进程等待。
临界区管理的基本原则(重点)
①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入
②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待
③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区
④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”
1.1 死锁的定义
一组进程中,每个进程都无限等待被该组进程中另一进程所占用的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
如果发生死锁,会浪费大量系统资源,甚至导致系统崩溃,注意:
- 参与死锁的所有进程都在等待资源
- 参与死锁的进程是当前系统中所有进程的子集
1.2 死锁的产生原因
资源数量有限、锁和信号量错误使用。
- 资源的使用方式
“申请-分配-使用-释放”模式
- 可重用资源:可被多个进程多次使用,又可分为可抢占资源与不可抢占资源,如处理器、
I/O部件、内存、文件、数据库、信号量等可抢占资源。 - 可消耗资源:只可使用一次、可创建和销毁的资源。如信号、中断、消息等。
1.3 活锁和饥饿
说明:
如图,这里有两个进程都需要使用资源1和资源2。比如这两个进程都上cpu执行,但是进程A执行到第二句的时候需要使用资源2,而进程B执行到第二句的时候需要资源1,但是此时恰好都不能获得各自的资源,这样就进入忙等待(进入轮询看资源是否可用),这就是活锁,也就是先加锁再轮询,这样导致两个进程既无进展也没有阻塞。这和死锁的概念的区别在于死锁的时候进程不能进入cpu去执行。
饥饿:资源分配策略决定
死锁与“饥饿”
- 饥饿
进程在竞争资源时,一直得不到其想要的资源,因而得不到服务,此时系统中并没有死锁
1.4 产生死锁的必要条件
- 互斥使用(资源独占):一个资源每次只能给一个进程使用
- 占有且等待(请求和保持,部分分配):进程在申请新的资源的同时保持对原有资源的占有。
- 不可抢占(不可剥夺):资源申请者不能强行的从资源占有着手中多去资源,资源只能由占有着自愿释放
- 循环等待
存在一个进程等待队列{P1,P2,......,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路。
2 资源分配图(RAG:Resource Allocation Graph)
用有向图描述系统资源和进程的状态
2.1 资源分配图画法说明
- 系统由若干类资源构成,一类资源称为一个资源类;每个资源类中包含若干个同种资源,称为资源实例。
- 资源类:用方框表示。资源实例:用方框中的黑圆点表示。进程:用圆圈中加进程名表示。
- 分配边:资源实例–>进程;申请边:进程–>资源类
2.2 死锁定理
- 如果资源分配图中没有环路,则系统中没有死锁;如果图中存在还礼则系统中可能存在死锁。
- 如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件。例如:
2.3 资源分配图化简
化简步骤:
- 1、找一个非孤立、且只有分配边的进程结点,去掉分配边,将其变为孤立结点
- 2、再把相应的资源分配给一个等待该资源的进程,即将该进程的申请边变为分配边。
- 3、重复上述步骤直到找不到资源分配结点。完成之后如果所有结点都变为孤立结点则表示系统中没有死锁,否则系统存在死锁。