操作系统课程设计报告——银行家算法

更新时间:2024-06-21 23:34:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中原工学院信息商务学院 操作系统课程设计报告

操 作 系 统 课 程 设 计

报 告

课程设计名称:银行家算法的模拟实现 专 业:计算机科与技术(软件工程方向)

班 级:软件***班 学 号:*** *

学生 姓名:锦超 9817 指导 教师:杨**

2010 年 6 月 26 日星期六

中原工学院信息商务学院 操作系统课程设计报告 目录 一、实验目的…………………………………………………………………2 二、实验内容…………………………………………………………………2 三、实验步骤…………………………………………………………………3 (1) 需求分析…………………………………………………………………….3 (2) 概要设计…………………………………………………………………….3 (3) 详细设计…………………………………………………………………….3 (4) 调试分析……………………………………………………………………11 (5) 测试结果……………………………………………………………………11 (6)使用说明:………………………………………………………………….15 四、实验总结…………………………………………………………………15 五、附录:程序清单………………………………………………………15 六、参考资料………………………………………………………………….26 - 1 -

中原工学院信息商务学院 操作系统课程设计报告 银行家算法的模拟实现 一、 实验目的

( 1)了解进程产生死锁的原因,了解为什么要进行死锁的避免。

(2)掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的 理解。 二、 实验内容

编制银行家算法通用程序 ,并检测所给状态的系统安全性 。 ( 1)银行家算法中的数据结构 :

可利用资源向量 Available。这是一个含有 m 个元素的数组 ,其中的 每一个元素代表一类可利用的资源数目 ,其初始值是系统中所配置的该类 全部可用资源的数目 ,其数值随该类资源的分配和回收而动态地改变 。Available[j]=K,则表示系统中现有 Rj 类资源 K 个 。

最大需求矩阵 Max 。这是一个 n*m 的矩阵 ,它定义了系统中 n 个进程 中的每一个进程对 m 类资源的最大需求 。如果 Max[i,j]=K,则表示进程 i 需要 Rj 类资源的最大数目为 K。

分配矩阵 Allocation。这也是一个 n*m 的矩阵 ,它定义了系统中每一 类资源 当前已分配给没一进程的资源数 。如果 Allocation[i ,j]=K ,则 表示 进程 i 当前已分得 Rj 类资源的数目为 K。

需求矩阵 Need。这也是一个 n*m 的矩阵 ,用以表示每一个进程尚需的 各类资源数 。如果 Need[i,j]=K,则表示进程 i 还需要 Rj 类资源 K 个 ,方 能完成其任务 。 上述三个矩阵存在如下关系 :

Need[i,j]= Max[i,j]- Allocation[i,j] 2)银行家算法

设 Request[i] 是进程 Pi 的请求向量 ,如果 Request[i ,j]=K,表示 进程 Pi 需要 K 个 Rj 类型的资源 。当 Pi 发出资源请求后 ,系统按下述步 骤进行检查 :

如果 Request[i ,j]<= Need[i,j] ,便转向步骤 2;否则认为出错 , 因为它所需要的资源数已超过它所宣布的最大值 。

- 2 -

中原工学院信息商务学院 操作系统课程设计报告 二、 实验步骤 (1)需求分析 编写银行家算法通用程序 ,并检测所给状态的系统安全性 ,可利用资 源向量 Available 。这是一个含有 N 个元素的数组 ,其中的每一个元素代 表一类可利用的资源数 ,其初始值是系统中所配置的该类全部可用资源的 数目 ,其数值随该类资源的分配和回收而动态地改变 。 最大需求矩阵 Max 这是一个 M*N 的矩阵 ,它定义了系统中 M 个进程中 的每一个进程对 N 类资源的最大需求 。如果 Max[i][j]=K ,则表示进程 i 需要 Rj 类资源的最大数目为 K。 分配矩阵 Allocation。这也是一个 n*m 的矩阵 ,它定义了系统中每一 类资源 当前已分配给没一进程的资源数 。如果 Allocation[i][j]=K ,则 表示 进程 i 当前已分得 Rj 类资源的数目为 K。 需求矩阵 Need。这也是一个 M*N 的矩阵 ,用以表示每一个进程尚需的 各类资源数 。如果 Need[i][j]= Max[i][j]- Allocation[i][j],则表示 i 个进程对 j 类资源需求量 ,方能完成其任务 。 设 Request[i] 是进程 Pi 的请求向量 ,如果 Request[i][j]=K,表示 进程 Pi 需要 K 个 Rj 类型的资源 。当 Pi 发出资源请求后 ,系统按下述步 骤进行检查 : 如果 Request[i][j]<= Need[i][j],便转向步骤 2;否则认为出错 , 因为它所需要的资源数已超过它所宣布的最大值 ,不能进行资源分配 。 (2)概要设计 从主函数开始,通过调用函数 system(\改变字体以颜色,密码函数 mima( ),进入银行家算法系统,通过调用 SLEEP()函数暂缓进入系统时间并清 屏,接着使用 while 循环语句,在循环语句中首先调用 version()显示主菜单, 选择菜单项目,调用函数 system(\清理屏幕,最后使用 switch 语句分别 调用函数:1、初始化可用资源和进程并检查安全性函数 init();2、增加资源, 并 检 测 安 全 性 函 数 addresources();3 、 删 除 资 源 , 并 检 测 安 全 性 函 数 delresources(); 4、修改资源,并检测安全性函数 changeresources(); 5、分 配 资 源 , 并 检 测 安 全 性 函 数 share();6 、 增 加 进 程 , 并 检 测 安 全 性 函 数 addprocess();7、删除进程,并检测安全性函数 delprocess() 0、退出系统系统 函数 exit(0)。 (3)详细设计 1、此程序调用函数所用的头文件和全局变量 #include

- 3 -

中原工学院信息商务学院 操作系统课程设计报告 #include #include//用于调用函数 setw() #include using namespace std;

#include //调用字符输入函数 getch(); #include//用于调用 Sleep()函数 #define BACKSPACE 8 #define False 0 #define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求 int Avaliable[100]={0};//系统可用资源 char name[100]={0};//资源的名称 int Allocation[100][100]={0};//系统已分配资源 int Need[100][100]={0};//还需要资源 int Request[100]={0};//请求资源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系统可提供资源 int M=100;//进程的最大数为 100 int N=100;//资源的最大数为 100 2,休眠函数 SLEEP()用于延缓进入系统时间 void SLEEP()

{ int i; for (i=10;i>=0;i--) { cout<

cout<<\\cout<<\\cout<<\\cout<<\\cout<<\\cout<<\\☆★\★☆ \3,显示可用资源和各个进程资源非配情况的函数 showdata() void showdata()//显示资源矩阵 {int i,j; cout<<\系统目前可用的资源[Avaliable]:\ for(i=0;i

- 4 -

中原工学院信息商务学院 操作系统课程设计报告 cout<<\进程名\for(j=0;j<3;j++){for(i=0;i

cout<Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i;//记录调度进程的安全序列 i=-1; //用于返回上一级寻找需求资源小于可用资源的进程 k++;} }}} for(i=0;i

中原工学院信息商务学院 操作系统课程设计报告 cout<<\请输入要求分配的资源进程号(0-\ cin>>i;//输入须申请的资源号 cout<<\请输入进程 P \申请的资源:\for(j=0;j>Request[j]; }//输入需要申请的资源 for (j=0;jNeed[i][j])//判断申请是否大于需求,若大于则出错 { cout<<\进程 P \申请的资源大于它需要的资源\分配不合理,不予 分配!\else { if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则出错 { cout<<\进程 P\申请的资源大于系统现在可利用的资源\ cout<<\分配出错,不予分配!\ if(ch=='y'){changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();}}//根据进程需求量进行银行家算法判断 7, 添加资源,并检测安全性 addresources() void addresources()//添加资源 {int n,flag; cout<<\请输入需要添加资源种类的数量:\flag=N;N=N+n;

for(int i=0;i>Max[i][j];cout<<\对 \类 资 源 的 已 分 配 量 :\afe();} 8,删除资源,并检测安全性函数 void delresources()//删除资源 {char ming;int i,flag=1; cout<<\请输入需要删除的资源名称:\do{cin>>ming;

for(i=0;i>Nam;

for(i=0;i

中原工学院信息商务学院 操作系统课程设计报告 if(i>=M) cout<<\该进程名称不存在,请重新输入:\for(int m=0;m

{ Avaliable[i]= Avaliable[i]+Allocation[i][m];//将删除的进程已分配的资源存入可 用资源中去 }

for(j=i;j

Allocation[j][m]= Allocation[j+1][m]; Need[j][m]= Need[j+1][m];}} M=M-1;showdata();safe();} 10,修改资源数量,并检测安全性 changeresources() void changeresources()//修改资源函数 cout<<\系统目前可用的资源[Avaliable]:\for(int i=0;i>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<\经修改后的系统可用资源为\for (int k=0;k>Max[flag][i];} cout<<\请输入该进程已分配的资源 Allocation\for(int j=0;j>Allocation[flag][j];} for(int k=0;k

中原工学院信息商务学院 操作系统课程设计报告 cout<<\┃ 6: 增加进程,并检测安全性 ┃\cout<<\┠───────────────────────┨\cout<<\┃ 7: 删除进程,并检测安全性 ┃\cout<<\┠───────────────────────┨\cout<<\┃ 0: 退出系统系统 ┃\cout<<\┗━━━━━━━━━━━━━━━━━━━━━━━┛\cout<

13,初始化资源种类和大小、进程,并检测安函数 init() void init()//初始化进程,分配资源 并检测安全性 {int i,j,number,m,n,flag;char Name; cout<<\请首先输入系统可供资源种类的数量:\for(i=0;i>Max[i][j]; do{flag=0; cout<<\请 输 入 各 进 程 已 分 配 的 资 源 量 (\矩 阵)[Allocation]:\for(i=0;i>Allocation[i][j];if(Allocation[i][j]>Max[i][j])flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; }

if(flag) cout<<\已分配的资源大于最大需求量,请重新输入!\\n\}while(flag);showdata();safe();} 14,密码初始化函数 char *get_password(const char *prompt) char *get_password(const char *prompt)

{static char buffer[128];int i = 0; char letter=NULL;printf( prompt ); // 最多可输入 127 个字符,最后一个留个'\\0' while ((i<127) && (letter!='\\r')) {letter = getch(); // 当前输入的字符为退格'\\b' if ( letter==BACKSPACE)

{ // buffer 中有字符存在 if(i>0){// 缓冲区中字符退一个 buffer[--i] = NULL;// 当前光标正等着你输入一个字符,而 //你却按下了退格键, 屏幕上字符也应该退一个,这里相当于 putchar( '\\b' ); // 这 样 就 将 光 标 退 到 了 上 一 个 字 符 的 位 置 putchar(BACKSPACE); // 这里光标在要删除的字符上面闪烁,输出一个空格就 将'*'号换掉了 putchar(' '); - 8 -

中原工学院信息商务学院 操作系统课程设计报告 // 因为你的空格操作导致光标又跳到了下一个字符位置,所 以还需要退一次,以使光标在正确位置显示 putchar(BACKSPACE);} else{ putchar(7);}}

else if ( letter != '\\r' ){buffer[ i++ ] = letter;putchar( '*' );}} buffer[i] = '\\0'; return buffer;// 加上字符串结束标志,在 C++编译器 下这上语句是错的, buffer = NULL; 可以这样处理 }

15,密码设置函数 mima( ) void mima( ) {char *password;

for(int i=1;i<=3;i++) { cout<<\您第\次\password = get_password( \输入密码:\if((i!=3)&&strcmp( password, \cout<< \您的密码有误 ,请重新输入密 码!\else if((i==3)&&strcmp( password, \{ cout<

case 1: init();break; case 2: share();break; case 3: delresources();break; case 4: addresources();break; case 5: changeresources();break; case 6: addprocess();break; case 7: delprocess();break; case 0: exit(0); default: cout<<\请正确选择功能号(0-7)!\ - 9 -

中原工学院信息商务学院 操作系统课程设计报告 画出函数和过程调用关系流程图 主函数 void main() 字体颜色改变函数 system(\ 密码 mima( ); F while(choice) T 菜单函数显示 version(); 输入 choice 清屏函数 system(\); Case 1 初始资源 创建进程 init(); Case2 Case 3 switch(choice) Case4 Cas5 Case 6 Case7 Case0 请求分配 资 源 share(); 删除资源 delresour ces(); 增 加资源 addresour ces(); 修 改 资 源 增加进 程 addproces s(); 删除进程 delproces s(); changer 选 项 错 退 出 系 统 exit(0) 显 示 各 种 资 源 showdat a(); 安 全 检 测 函 数 safe(); 显 示 各 种 资 源 showdat a(); 显 示 各 种 资 源 showdat a(); 显 示 各 种 资 源 showdat a(); 显 示 各 种 资 源 showdat a(); 显 示 各 种 资 源 showdat a(); 显 示 各 种 资 源 showdat a(); 安 全 检 测 函 数 safe(); 安 全 检 测 函 数 safe(); 安 全 检 测 函 数 safe(); 安 全 检 测 函 数 safe(); 安 全 检 测 函 数 safe(); 安 全 检 测 函 数 safe(); 停止 - 10 -

中原工学院信息商务学院 操作系统课程设计报告 (4)调试分析 1、安全检测 safe()函数中不能实现多个资源的检测,进审查修改使用循环语 句 for(i=0;i

{ cout<>name[flag];cout<<\数 量:\for( i=0;i>Max[i][j];cout<<\对\类资源的已分配量:\cin>>Allocation[i][j];Need[i][j]=Max[i][j]-Allocation[i][j];} 4、在得到一个安全序列后,删除一个资源,不能得到一个安全序列,经调试检 测,原来进程中对应的资源没有删除。修改程序中代码,将相应进程中资源删除。 for(int j=0;j

中原工学院信息商务学院 操作系统课程设计报告 3、选择功能号 1 初始化资源种类和大小、进程,并检测安全性 4、选择功能号 2 请求分配资源,并检测安全性 - 12 -

中原工学院信息商务学院 操作系统课程设计报告 5、选择功能号 3 删除资源,并检测安全性 6、选择功能号 4 增加资源,并检测安全性选择功能号 7、选择功能号 5 修改资源,并检测安全性 - 13 -

中原工学院信息商务学院 操作系统课程设计报告 8、选择功能号 6 增加进程,并检测安全性 9、选择功能号 7 删除进程,并检测安全性 10、 选择功能号 0 退出系统系统 - 14 -

中原工学院信息商务学院 操作系统课程设计报告 (6)使用说明: 输入正确密码,进入银行家算法系统,显示主菜单以后,按序号选择功能号,首 先选择功能号 1 初始化可用资源、和进程,然后选择其他功能号,按找每项功能 的提示做出相应的操作,若要推出系统请选择 0 号,退出银行家算法系统。 四、实验总结 通过本次课程设计,我收获很多,首先我对十大算法之一的银行家算法有了 清楚的认识,认真分析了进程产生死锁的原因,了解为什么要进行死锁的避免, 掌握银行家算法的数据结构,了解了算法的执行过程,加深了对银行家算法的理 解。其次,我对编程有了个清楚的认识,编程就是将先现实中的规律模拟成电脑 能运行的程序,方便我们的工作和学习生活。最后,我也清楚认识到理论联系实 际重要性,动手操作能力和编程逻辑思维能力的提高的重要性,对自己所编写的 程序要学会调试,不断改进,向更加全面的方向考虑,同时也要考虑程序的可行 性和健壮性。总而言之,我在编写程序方面有了更加深入的认识。 五、附录:程序清单 #include #include #include//用于调用函数 setw() #include using namespace std;

#include //调用字符输入函数 getch(); #include//用于调用 Sleep()函数 #define BACKSPACE 8 #define False 0 #define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求 int Avaliable[100]={0};//系统可用资源 - 15 -

中原工学院信息商务学院 操作系统课程设计报告 char name[100]={0};//资源的名称 int Allocation[100][100]={0};//系统已分配资源 int Need[100][100]={0};//还需要资源 int Request[100]={0};//请求资源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系统可提供资源 int M=100;//进程的最大数为 100 int N=100;//资源的最大数为 100 void SLEEP()

{ int i; for (i=10;i>=0;i--) { cout<

cout<<\┏━━━━━━━━━━━━━━━━━━━━━━━┓ \cout<<\\cout<<\\cout<<\\cout<<\\cout<<\\Sleep(i); system(\} }

void showdata()//显示资源矩阵 {

int i,j; cout<<\系统目前可用的资源[Avaliable]:\cout<for(i=0;i

┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 正在进入银行家算法系统 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┛ \☆★\★☆ \

中原工学院信息商务学院 操作系统课程设计报告 cout<

cout<

cout<<\for(j=0;j}

int changdata(int i)//进行资源分配 { int j; for (j=0;j

int safe()//安全性算法 {int i,k=0,m,apply,Finish[100]={0}; int j; for(i=0;i

apply++;//当需求资源数目都小于可用资源数时,改变分配资源数目 if(apply==N) {for(m=0;m

Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i;//记录调度进程的安全序列 i=-1; //用于返回上一级寻找需求资源小于可用资源的进程 k++;} } } } - 17 -

中原工学院信息商务学院 操作系统课程设计报告 for(i=0;i

cout<<\系统是安全的!\如果安全,输出成功 cout<<\分配的序列:\for(i=0;i

cout<<\if(i>i;//输入须申请的资源号 cout<<\请输入进程 P \申请的资源:\{cout<>Request[j];//输入需要申请的资源 } for (j=0;jNeed[i][j])//判断申请是否大于需求,若大于则出错 { cout<<\进程 P \申请的资源大于它需要的资源\ cout<<\分配不合理,不予分配!\ ch='n';break;} else { if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则出错 { cout<<\进程 P\申请的资源大于系统现在可利用的资源\cout<<\分配出错,不予分配!\ch='n'; break;} ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 请求分配资源,并检测安全性 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ 安全 - 18 -

中原工学院信息商务学院 操作系统课程设计报告 } }

if(ch=='y') {changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } }

void addresources()//添加资源 {int n,flag; cout<<\\cout<<\\cout<<\\cout<<\\cout<<\┗━━━━━━━━━━━━━━━━━━━━━━━┛ \cout<<\请输入需要添加资源种类的数量:\flag=N;N=N+n; for(int i=0;i>name[flag];cout<<\数量:\for( i=0;i>Max[i][j];cout<<\对\类资源的已分配量:\Need[i][j]=Max[i][j]-Allocation[i][j];} }

showdata();safe(); }

void delresources()//删除资源 {char ming;int i,flag=1; cout<<\\cout<<\\cout<<\\┃ 删除资源,并检测安全性 - 19 -

┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 添加资源,并检测安全性 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃

中原工学院信息商务学院 操作系统课程设计报告 cout<<\\cout<<\\┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┛ cout<<\请输入需要删除的资源名称:\do {cin>>ming; for(i=0;i

for(j=i;j

int Nam,j; int i,flag=1; cout<<\\cout<<\\cout<<\\cout<<\\cout<<\\cout<<\请输入需要删除的进程名称:P\ - 20 -

┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 删除进程,并检测安全性 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┛

中原工学院信息商务学院 操作系统课程设计报告 do//查找要删除的与输入进程名相同的进程 {cin>>Nam;

for(i=0;i=M) cout<<\该进程名称不存在,请重新输入:\}while(flag); for(int m=0;m

{ Avaliable[i]= Avaliable[i]+Allocation[i][m];//将删除的进程已分配的资源存入可 用资源中去 }

for(j=i;j

{Max[j][m]=Max[j+1][m]; Allocation[j][m]= Allocation[j+1][m]; Need[j][m]= Need[j+1][m];} }

M=M-1;showdata();safe(); }

void changeresources()//修改资源函数 {

cout<<\\cout<<\\cout<<\\cout<<\\cout<<\\cout<<\系统目前可用的资源[Avaliable]:\ for(int i=0;i>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<\经修改后的系统可用资源为\for (int k=0;k

- 21 -

┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 修改资源数量,并检测安全性 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┛

中原工学院信息商务学院 操作系统课程设计报告 void addprocess()//添加进程 { int flag=M; M=M+1; cout<<\\cout<<\\cout<<\\cout<<\\cout<<\┗━━━━━━━━━━━━━━━━━━━━━━━┛ \cout<<\请输入该进程的最大需求量[Max]\{cout<>Max[flag][i];} cout<<\请输入该进程已分配的资源 Allocation\for(int j=0;j>Allocation[flag][j]; }

for(int k=0;k

void version() //显屏函数 {

cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\cout<<\┏━━━━━━━━━━━━━━━━━━━━━━━┓\┃ 欢迎进入银行家算法系统 ┃\┠───────────────────────┨\┃ 1:初始化资源种类和大小、进程,并检测安全性┃\┠───────────────────────┨\┃ 2: 请求分配资源,并检测安全性 ┃\┠───────────────────────┨\┃ 3: 删除资源,并检测安全性 ┃\┠───────────────────────┨\┃ 4:增加资源,并检测安全性 ┃\┠───────────────────────┨\┃ 5: 修改资源,并检测安全性 ┃\┠───────────────────────┨\┃ 6: 增加进程,并检测安全性 ┃\┠───────────────────────┨\┃ 7: 删除进程,并检测安全性 ┃\┠───────────────────────┨\ - 22 -

┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 添加进程,并检测安全性 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃

中原工学院信息商务学院 操作系统课程设计报告 cout<<\┃ 0: 退出系统系统 ┃\cout<<\┗━━━━━━━━━━━━━━━━━━━━━━━┛\cout<

void init()//初始化进程,分配资源 并检测安全性 {int i,j,number,m,n,flag;char Name; cout<<\┏━━━━━━━━━━━━━━━━━━━━━━━┓ \cout<<\┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ \cout<<\\cout<<\\cout<<\┗━━━━━━━━━━━━━━━━━━━━━━━┛ \cout<<\请首先输入系统可供资源种类的数量:\cin>>n; N=n;

for(i=0;i>m; M=m; cout<<\请输入各进程的最大需求量(\矩阵)[Max]:\for(i=0;i>Max[i][j]; do{

flag=0; cout<<\请输入各进程已分配的资源量(\矩阵)[Allocation]:\for(i=0;i

cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag) cout<<\已分配的资源大于最大需求量,请重新输入!\\n\} - 23 -

┃ 初始化资源种类和大小、进程 ,并检测安 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃

中原工学院信息商务学院 操作系统课程设计报告 while(flag); showdata();//显示各种资源 safe();//用银行家算法判定系统是否安全 } char *get_password(const char *prompt) {

static char buffer[128]; int i = 0; char letter=NULL; printf( prompt ); // 最多可输入 127 个字符,最后一个留个'\\0' while ((i<127) && (letter!='\\r')) {

letter = getch(); // 当前输入的字符为退格'\\b' if ( letter==BACKSPACE) {

// buffer 中有字符存在 if(i>0) {

// 缓冲区中字符退一个 buffer[--i] = NULL;// 当前光标正等着你输入一个字符,而你却按下了 退格键, 屏幕上字符也应该退一个,这里相当于 putchar( '\\b' ); // 这样就将光标退到了上一个字符的位置, putchar(BACKSPACE); // 这里光标在要删除的字符上面闪烁,输出一个空格就将'*'号换掉了 putchar(' '); // 因为你的空格操作导致光标又跳到了下一个字符位置,所以还需要退 一次,以使光标在正确位置显示 putchar(BACKSPACE); } else { putchar(7);} } else if ( letter != '\\r' ) {buffer[ i++ ] = letter;putchar( '*' );} } buffer[i] = '\\0'; return buffer;// 加上字符串结束标志,在 C++编译器下这上语句 是错的, buffer = NULL; 可以这样处理 }

void mima( ) {char *password;

cout<<\┏━━━━━━━━━━━━━━━━━━━━━━━┓ - 24 -

中原工学院信息商务学院 操作系统课程设计报告 \cout<<\┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ \ cout<<\┃ 请输入密码,您最多可以输入三次 ┃ \ cout<<\┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ \ cout<<\┗━━━━━━━━━━━━━━━━━━━━━━━┛ \ for(int i=1;i<=3;i++) { cout<<\您第\次\password = get_password( \输入密码:\if((i!=3)&&strcmp( password, {

cout<

cout<< \您的密码有误,请重新输入密码!\continue; }

else if((i==3)&&strcmp( password, \{ cout<

{printf( \你的密码正确,欢迎进入银行家算法系 统!\\n\ } } void main()//主{ system(\ mima( );//密SLEEP(); int choice; while(choice) { version(); cout<<\*\cout<<\请选择功能号(0-7):\cin>>choice; system(\switch(choice) {

case 1: init();break; case 2: share();break;

case 3: delresources();break;

- 25 -

函码\);break;}数b\数 函

中原工学院信息商务学院 操作系统课程设计报告 case 4: addresources();break; case 5: changeresources();break; case 6: addprocess();break; case 7: delprocess();break; case 0: cout<

cout<<\┏━━━━━━━━━━━━━━━━━━━━━━━┓ \cout<<\\cout<<\\cout<<\\cout<<\\ cout<

}}} ┗━━━━━━━━━━━━━━━━━━━━━━━┛ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 谢谢使用银行家算法 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ 六、 参考资料 计算机操作系统(第二版);汤小丹,梁红冰,哲凤屏,汤子瀛;西 安电子科技大学出版社。 数据结构(c 语言版);严蔚敏,吴伟民;清华大学出版社。 C 程序设计教程;谭浩强;清华大学出版社。 - 26 -

中原工学院信息商务学院 操作系统课程设计报告 case 4: addresources();break; case 5: changeresources();break; case 6: addprocess();break; case 7: delprocess();break; case 0: cout<

cout<<\┏━━━━━━━━━━━━━━━━━━━━━━━┓ \cout<<\\cout<<\\cout<<\\cout<<\\ cout<

}}} ┗━━━━━━━━━━━━━━━━━━━━━━━┛ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ ┃ 谢谢使用银行家算法 ┃ ┃☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆┃ 六、 参考资料 计算机操作系统(第二版);汤小丹,梁红冰,哲凤屏,汤子瀛;西 安电子科技大学出版社。 数据结构(c 语言版);严蔚敏,吴伟民;清华大学出版社。 C 程序设计教程;谭浩强;清华大学出版社。 - 26 -

本文来源:https://www.bwwdw.com/article/54h3.html

Top