银行家算法模拟。
系别:班级:组员:
银行家算法模拟。
1.课程设计目的。
通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件·安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。
2.任务及要求。
设n为系统进程的个数,m为资源类型的种类,需要如下数据结构:**ailabe:长度为m的向量,表示每种资源的现有实例的数量。
如aailabe[j] =k,那么资源rj现有k个实例。
max:nm矩阵,定义每个进程的最大需求。如果max[i][j] =k,那么进程pi最多可申请k个资源类型为rj的实例。
allocation:nm矩阵,定义每个进程现在所分配的各种资源类型的实例数量,如果allocation[i][j]=k表示进程pi现在分配了k个资源类型rj的实例。
need:nm矩阵,表述每个进程还需要的剩余的资源,如果need[i][j]=k,表示进程pi还可能申请k个资源类型rj的实例。need[i][j]=max[i][j]-allocation[i][j]。
3.数据结构及算法。
3.1.1数据结构。
#definem3#definen5
int **ailable[m] =可用资源向量int max[n][m] =进程最大资源需求。
int allocation[n][m] =进程已分配资源。
int need[n][m] =进程需要的资源。
3.1.2算法的总体思想(流程)
银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进。
程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。
反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待。
3.2数组大小比较模块。
3.2.1功能:
比较数组之间大小,定义如下:
设x和y为长度为n的向量,则xy当且仅当对所有i = 1,2,··n,x[i]y[i]。如果y≤x且y≠x,那么y<x.
3.2.2算法:
bool lessthan(int a[n][m],int b[m],int n)
//数组a[n][*小于等于一维数组b时返回true,否则返回falsefor(int i = 0; i < m; i++)lessthan
bool lessthan1(int a[n][m],int b[n][m],int n)
//数组a[n][*小于等于数组b[n][*时返回true,否则返回falsefor(int i = 0; i < m; i++)
return true;}/lessthan
bool equal(int a[n][m],int b,int n)
return true;}/equal
if(a[n][i] !b)
return false;if(a[n][i] >b[n][i])
return false;
3.3安全性算法模块3.3.1功能:
确定计算机系统是否处于安全状态。
3.3.2算法:
bool safe()
//判断当前状态是否安全。
int work[m];bool finish[n];int i,j,k;
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
printf("安全序列为:")
finish[j] =false;work[i] =**ailable[i];
for(j = 0; j < n; j++)
for(j = 0; j < n; j++)
if(finish[i] =false &&lessthan(need,work,i))
for(k = 0; k < m; k++)
work[k] +allocation[i][k];
finish[i] =true;printf("p%d ",i);
if(finish[j] =false)
if(lessthan1(qequset,need,n))
//请求资源量小于等于需求数量继续,否则退出。
if(lessthan(qequset,**ailable,n))scanf("%d",&qequset[n][i]);
//请求资源量小于等于可用资源量继续,否则退出。
for(int j = 0; j < m; j++)
**ailable[j] -qequset[n][j];allocation[n][j] +qequset[n][j];need[n][j] -qequset[n][j];
if(!safe())else
printf("没有可用资源,进程等待");
if(equal(need,0,n))
//如果进程需求资源为零说明进程已完成}
printf("进程%d已完成!",n);for(int l = 0; l < m; l++)
**ailable[l] =**ailable[l] +max[n][l];allocation[n][l] =0;max[n][l] =0;
for(int k = 0; k < m; k++)
**ailable[k] +qequset[n][k];allocation[n][k] -qequset[n][k];need[n][k] +qequset[n][k];
elseprintf("请求大于最大需求");
//qequest
4.实验结果及分析。
4.1实验结果:
4.2结果分析:
1.进程初始状态都是固定的,主要是因为在使用随即函数产生随机状态时在for循环里产生的随机数是一样的,到网上没查到解决办法,用srand函数也没变化,所以就在初始化时已赋值。
2.当进程的need向量为0时,说明该进程已经完成,所以。
把进程的max向量和allocation向量全部赋值为0,表示进程已完成。3.在数组大小比较模块中,函数实现的较繁琐,主要是由于对多维数组的指针操作没有掌握,实现时出现太多错误,不好调试。
所以采用了模块中那种方法。
操作系统课程设计
课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...
操作系统课程设计
学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....
操作系统课程设计
一个多用户多级目录结构文件系统设计与实现。课程设计的环境是linux 操作系统。设计时可利用linux 提供的文件管理的功能调用,建立一个模拟的文件系统。基本思想是,在linux 系统中创建一个较大容量的文件,作为所设计的文件系统的 文件卷 并利用linux 系统的功能调用,编写各程序模块。以 1m...