操作系统之死锁检测算法:银行家算法
一、银行家算法
银行家是用来检测进程是否会发送死锁的一种算法,这是死锁避免的一种提前预防的机制。可以利用银行家算法进行系统安全进行一个预估。下面我将用一个案例来详细介绍银行家算法的过程。
二、银行家算法
#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; }