操作系统之死锁检测算法:银行家算法
一、银行家算法
银行家是用来检测进程是否会发送死锁的一种算法,这是死锁避免的一种提前预防的机制。可以利用银行家算法进行系统安全进行一个预估。下面我将用一个案例来详细介绍银行家算法的过程。
二、银行家算法
#include <stdio.h>
int main(){
int b = 0;
int count = 0, m, n, process, temp, resource;
int allocation_table[5] = {
0, 0, 0, 0, 0};
int available[5], current[5][5], maximum_claim[5][5];
int maximum_resources[5], running[5], safe_state = 0;
printf("
输入总共的进程数: ");
scanf("%d", &process);
for(m = 0; m < process; m++) {
running[m] = 1;
count++;
}
printf("
输入要分配的资源总数: ");
scanf("%d", &resource);
printf("
输入需要个数: ");
for(m = 0; m < resource; m++) {
scanf("%d", &maximum_resources[m]);
}
printf("
输入分配资源表:
");
for(m = 0; m < process; m++) {
for(n = 0; n < resource; n++)
{
scanf("%d", ¤t[m][n]);
}
}
printf("
输入最大需求表:
");
for(m = 0; m < process; m++) {
for(n = 0; n < resource; n++)
{
scanf("%d", &maximum_claim[m][n]);
}
}
printf("
线程载体
");
for(m = 0; m < resource; m++) {
printf(" %d ", maximum_resources[m]);
}
printf("
分配资源表
");
for(m = 0; m < process; m++) {
for(n = 0; n < resource; n++) {
printf(" %d", current[m][n]);
}
printf("
");
}
printf("
最大需求表
");
for(m = 0; m < process; m++) {
for(n = 0; n < resource; n++) {
printf(" %d", maximum_claim[m][n]);
}
printf("
");
}
for(m = 0; m < process; m++) {
for(n = 0; n < resource; n++) {
allocation_table[n] = allocation_table[n] + current[m][n];
}
}
printf("
已经分配的资源
");
for(m = 0; m < resource; m++) {
printf(" %d", allocation_table[m]);
}
for(m = 0; m < resource; m++) {
available[m] = maximum_resources[m] - allocation_table[m];
}
printf("
剩余资源:");
for(m = 0; m < resource; m++) {
printf(" %d", available[m]);
}
printf("
");
while(count != 0) {
safe_state = 0;
for(m = 0; m < process; m++) {
if(running[m]) {
temp = 1;
for(n = 0; n < resource; n++) {
if(maximum_claim[m][n] - current[m][n] > available[n]) {
temp = 0;
break;
}
}
if(temp) {
printf("
进程 %d 正在执行中
", m + 1);
running[m] = 0;
count--;
safe_state = 1;
for(n = 0; n < resource; n++) {
available[n] = available[n] + current[m][n];
}
break;
}
}
}
if(!safe_state) {
printf("
进程处于非安全状态
");
break;
}
else {
printf("
进程处于安全状态
");
printf("
可用资源
");
for(m = 0; m < resource; m++)
{
printf(" %d", available[m]);
}
printf("
");
}
}
return 0;
}
