1.死锁
死锁,顾名思义,是一种锁住不可自行解开的死局。
在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因为需求的资源被别的进程抢占,只好互相等待,以至于等待循环中的所有进程均无法正常运行的情况。
死锁形成需要四个条件,这四个条件缺少一个,就不会形成死锁。
死锁的四个条件
1)互斥条件
即对于某资源在一段时间内仅允许一个进程占有使用。
2)占有且等待条件/请求和保持条件
在进程已经占有一个或多个资源的情况下,若它仍申请新的资源,在等待获得新的资源时,进程仍会继续占有旧有资源,不会主动释放。
3)不可抢占条件
直到占有该资源的进程使用完毕之前,其他任何进程均不应该强行抢占该资源。
4)循环等待条件
若干个进程之间形成了一个等待循环。
2.安全状态
若针对目前资源分配情况,系统可以找到某种次序为进程分配资源,使得所有进程能够依次运行成功,则称系统此时的分配状态是安全的,分配资源的次序称为“安全序列”。
安全状态时系统中无死锁,所以所有避免死锁的算法都尽可能地使系统进入安全状态。
值得注意的是,即使是安全状态下的系统,如果资源分配不当,仍然可以使系统变为不安全状态。
3.银行家算法
1)设计思想
在系统中,进程发起一项资源分配请求,由系统检查是否可以满足该分配请求,若可以,应暂时满足该请求,并查看此时系统是否仍是安全状态。
2)程序流程图
可以分为三个功能模块,第一个模块检查需求是否可以被满足,第二个模块检查系统是否安全,第三个模块是主程序,通过调用前两个模块实现资源分配或请求驳回。
3)数据结构
设有m种资源,n个进程。
int[] Available[m] 系统内可用资源
int[,] Max[n,m] 进程对每种资源的最大需求
int[,] Allocation[n,m] 已分配给各个进程的资源
int[,] Need[n,m] 目前各个进程对各个资源的需求数
[显然有Need=Max-Allocation]
int[,] Require[m] 对于各种资源的请求函数
bool[] Finish[n] 进程是否可以成功运行的标志
int[] Work[m] 用于分配资源的向量
[定义:Work=Available-Require]
4)窗体设计
5)窗体代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawi