应用条件:
1、 在固定数量的进程中共享数量固定的资源
2、 每个进程预先指定完成工作所需的最大资源数量
3、 进程不能申请比系统中可用资源总数还多的资源
4、 进程等待资源的时间是有限的
5、 如果系统满足了进程对资源的最大需求,那么,进程应该再有限的时间内使用资源,然后归还给系统
假设系统中:
N:系统中进程数量
M:资源类数量
数据结构用以描述系统状态:
Available:ARRAY[1……M]of integer; //系统中的可以分配的资源数量
Max: ARRAY[1…N,1…M] of integer; //进程对资源的最大需求
Allocation: ARRAY[1…N,1…M] of integer; //当前系统中分配给进程的资源数
Need: ARRAY[1…N,1…M] of integer; //进程还需要多少资源
Request: ARRAY[1…N,1…M] of integer; //本次进程对资源申请数量
符号:
Available
Max[i]
Allocation[i]
Need[i]
Request[i]
当进程pi提出资源申请时,系统执行下列步骤:
(1)若Request[i]<= Need[i], 转(2);
否则,报错返回;
(2)若Request[i]<= Available,转(3);
否则,进程等待;
(3)假设系统分配了资源,则有:
Available = Available[i] – Request[i];
Allocation[i] = Allocation[i] + Request[i];
Need[i] = Need[i] – Request[i];
(以上表示系统的新状态)
若系统新状态是安全的,则分配完成
若系统新状态是不安全的,则回复原来状态,进程等待
如何判断系统是否处于安全状态?
为进行安全性检查,定义数据结构:
Work: ARRAY[1…M]of integer;
Finish:ARRAY[1…N] of Boolean;
安全性检查的步骤:
(1) Work = Available; //存放当前可用资源数量
Finish = false; //初始化为false
(2) 寻找满足条件的i:
a. Finish[i]==false; //这个进程还没有被检查过
b. Need[i]<=Work; //检查这个进程还需要的资源是否可以满足
如果不存在,则转(4)
(3) Work = Work +Allocation[i];
//假设这个进程战友的资源都还给系统,得到新可用资源的数量
Finish[i] = true; //把进程标记成true,然后继续找下一个未检查过进程
转(2)
(4) 若对所有i,Finish[i]==true,
则系统处于安全状态,否则系统处于不安全状态
//跳出循环结束
例子
| 目前占有量 | 最大需求量 | 尚需要量 |
P1 | 1 | 4 | 3 |
P2 | 4 | 6 | 2 |
P3 | 5 | 8 | 3 |
系统剩余量 |
| 2 |
|
//此时系统只能分配资源给P2,
那么安全序列是P2,P1或P2,P3
伪代码(pseudo-code)
P – 进程的集合
Mp – 进程p的最大的请求数目
Cp – 进程p当前被分配的资源
A – 当前可用的资源
while (P != ∅) {
found = FALSE;
foreach (p ∈ P) {
if (Mp − Cp≤ A) {
/* p可以獲得他所需的資源。假設他得到資源後執行;執行終止,並釋放所擁有的資源。*/
A = A+ Cp ;
P = P− {p};
found= TRUE;
}
}
if (! found)return FAIL;
}
return OK;