计算机操作系统课设需要,写了两个下午的银行家算法(陷在bug里出不来耽误了很多时间),参考计算机操作系统(汤子瀛)
实现过程中不涉及难度较大的算法,仅根据银行家算法的思想和步骤进行实现。以下为详细步骤:
- 定义:
max1[ ][ ] : 最大需求矩阵,max1[i][j]为第i条进程的第j项资源的最大需求数目;
allocation[ ][ ] : 分配矩阵,allocation[i][j]为第i条进程已分得的第j项资源的数目;
need[ ][ ] : 需求矩阵,need[i][j]为第i条进程尚需要的第j项资源的数目;
available[ ] : 可利用资源量,available[i]为系统中第i项资源的可分配数目;
request[ ][ ] : 请求矩阵,request[i][j]表示第i条进程对第j项资源的请求数目;//可以改成一维数组
int safe (int n,int m,int work) : n条进程,m项进程,返回值为1时当前状态安全,否则不安全;
- 程序流程:
- 键盘输入max1矩阵,allocation矩阵,available数组,计算出need矩阵。
- 判断当前时刻系统的状态是否安全。true 转向3,false转向7
- 判断当前时刻request<=need。true 转向4,false 转向7
- 判断当前时刻request<=available。true 转向5,false 转向7
- 进行安全性算法检测。true 转向6,false 转向7
- 系统分配资源并继续等待指令。
- 系统不予分配资源并输出原因。
- 安全性算法 : 每次从第一个进程开始检测,如遇到所有的m项资源都可以满足时,work+=allocation,否则转入下一个进程的检测。两种情况跳出第20行的循环。
- 所有finish均为1,i无法置为-1 ,i==N时跳出循环
- 存在为0的finish,但直至i==N时,仍未有新的work<need出现(从最近的一次i==-1算起),i==N时跳出循环
第50行进行检测区分上述两种情况,如安全返回1,否则返回0;
以下为完整的代码实现:(另附测试数据)
1 #include2 int max1[1000][1000]= { 0}; 3 int allocation[1000][1000]= { 0}; 4 int need[1000][1000]= { 0}; 5 int finish[1000]= { 0}; 6 int available[1000]= { 0}; 7 int request[1000][1000]= { 0}; 8 int waitq[1000]= { 0}; 9 int waitnum=0; 10 int safeq[1000]= { 0}; 11 int safe (int N , int M ,int work[]) 12 { 13 int s=0; 14 memset(finish,0,1000*sizeof(int)); 15 for(int i=0; i work[j]) 28 { 29 flag=0; 30 break; 31 } 32 } 33 if(flag) 34 { 35 for(int j=0; j need[num][i])195 {196 judge=0;197 printf("error!\n");198 break;199 }200 }201 if(judge)202 {203 int wait=0;204 for(int i=0; i available[i])207 {208 wait=1;209 printf("wait because request>available!\n");210 break;211 }212 }213 if(!wait)214 {215 216 for(int j1=0; j1