《操作系统》课程综合性实验报告
: 学号: 2016 年 11 月 20 日
实验题目 | 进程调度算法程序设计 | ||||||||||
一、实验目的 通过对安全性算法和银行家算法的模拟,进一步理解资源分配的基本概念,加深对资源申请,资源分配(银行家算法)以及系统是否能分配(安全性算法)资源的理解。 二、设备与环境 1. 硬件设备:PC机一台 2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。 三、实验容 用C语言(或其它语言,如Java)实现对资源的资源申请与分配; (一)银行家算法(bank()函数): 进程i发出请求资源申请, (1)如果Request [j]<=need[i,j],转向步骤(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。 (2)如果:Request i[j]<=available[i,j],转向步骤(3),否则表示尚无足够资源,进程i需等待。 (3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值: Available[i,j]= Available[i,j]- Request [j]; Allocation[i][j]= Allocation[i][j]+ Request [j]; need[i][j]= need[i][j]- Request [j]; (4)试分配后,执行安全性检查,调用check()函数检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程。否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。 (5)用do{…}while 循环语句实现输入字符y/n判断是否继续进行资源申请。 (二)安全性算法(safe()函数): (1)设置两个向量: 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。 工作向量Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够的资源分配给进程时, 再令Finish[i]=true。 (2)在进程中查符合以下条件的进程: 条件1:Finish[i]=false; 条件2:need[i][j]<=Work[j] 若到,则执行步骤(3)否则,执行步骤(4) (3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]= Work[j]+ Allocation[i][j]; Finish[i]=true; goto step (2); (4)如果所有的Finish[i]=true都满足,则表示系统处于安全状态,否则,处于不安全状态。 四、实验结果及分析 1.实验设计说明 按0由用户输入,按1由系统提供数据 2.实验代码 #include <stdio.h> #include <stdlib.h> #include <math.h> #define max_process 50 //最大进程数 #define max_resource 100//最大资源数 #define false 0 #define true 1 int available[max_resource]={3,3,2};//可利用资源向量 int max[max_process][max_resource]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//最大需求矩阵 int allocation[max_process][max_resource]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//分配矩阵 int need[max_process][max_resource];//需求矩阵 int request[max_process][max_resource];//进程需要资源数 int finish[max_process]; int m=5,n=3; void init(); int safe(); void bank(); void init2(); void print(); void print2(); void main() { int i; printf("请输入测试数据,按0由用户输入测试数据,按1由系统提供测试数据:\n"); scanf("%d",&i); switch(i){ case 0: init(); break; case 1: init2(); break; } print(); safe(); bank(); } void init() { int i,j; printf("请输入进程数目:\n"); scanf("%d",&m); printf("请输入资源种类数目:\n"); scanf("%d",&n); printf("请按顺序输入系统中可利用的每种资源量:\n"); c语言算法书籍 for(i=0;i<n;i++) scanf("%d",&available[i]); printf("请输入最大需求矩阵:\n"); for (i=0;i<m;i++) for (j=0;j<n;j++) { scanf("%d",&max[i][j]); } printf("请输入分配矩阵:\n"); for (i=0;i<m;i++) for (j=0;j<n;j++) { scanf("%d",&allocation[i][j]); } for (i=0;i<m;i++) for (j=0;j<n;j++) { need[i][j]=max[i][j]-allocation[i][j]; if(need[i][j]<0) printf("您输入的第%d个进程的%d个资源数据有错,请重新输入\n",i,j); } } void init2() { int i,j; for (i=0;i<m;i++) for (j=0;j<n;j++) need[i][j]=max[i][j]-allocation[i][j]; } void print(){ int i,j; printf("最大需求矩阵如下:\n"); for(i=0;i<m;i++) { printf("p%d\t",i); for(j=0;j<n;j++) { printf("%d\t",max[i][j]); } printf("\n"); } printf("分配矩阵如下:\n"); for(i=0;i<m;i++) { printf("p%d\t",i); for(j=0;j<n;j++) { printf("%d\t",allocation[i][j]); } printf("\n"); } printf("需求矩阵如下:\n"); for(i=0;i<m;i++) { printf("p%d\t",i); for(j=0;j<n;j++) { printf("%d\t",need[i][j]); } printf("\n"); } printf("系统可提供资源如下:\n"); for(j=0;j<n;j++) printf("%d\t",available[j]); printf("\n"); } int safe() { int i,j,k=0,l[m],p; int work[n]; for (i=0;i<n;i++) work[i]=available[i]; for (i=0;i<m;i++) finish[i]=false; for(i=0;i<m;i++) { if(finish[i]==true) continue; else{ for(j=0;j<n;j++) if(need[i][j] > work[j])break; if(j==n){ for(p=0;p<n;p++) work[p]=work[p]+allocation[i][p]; finish[i]=true; l[k]=i; k++; i=-1; } else continue; } } if(k==m) { printf("\n"); printf("**************************此时刻资源分配情况**************************\n"); printf(" 进程 | Work | Need | Allo | W+Allo | Finish\n"); for (i=0;i<n;i++) work[i]=available[i]; for(i=0;i<m;i++) { printf(" p%d |",l[i]); for(p=0;p<n;p++) printf("%3d ",work[p]); printf("|"); for(p=0;p<n;p++) { printf("%3d ",need[l[i]][p]); } printf("|"); for(p=0;p<n;p++) { printf("%3d ",allocation[l[i]][p]); } printf("|"); for(p=0;p<n;p++) { printf("%3d ",allocation[l[i]][p]+work[p]); } printf("|"); printf(" Ture\n"); for(p=0;p<n;p++) work[p]=work[p]+allocation[l[i]][p]; if(i==4) return true; } } else {printf("系统不安全\n"); return false;} } void bank(){ int i,number; char answer; while(1){ printf("\n请输入需申请资源的进程号(第一个进程号为0):\n"); scanf("%d",&number); printf("请依次输入该进程所需申请的所有资源数目:\n"); for(i=0;i<n;i++) scanf("%d",&request[number][i]); for(i=0;i<n;i++) { if(request[number][i]>need[number][i]) { printf("申请的资源超过还需要的资源,请重新输入\n"); continue; } if(request[number][i]>available[i]) { printf("申请的资源超过所能提供的资源,请重新输入\n"); continue; } } for(i=0;i<n;i++){ available[i]=available[i]-request[number][i]; allocation[number][i]=allocation[number][i]+request[number][i]; need[number][i]=need[number][i]-request[number][i]; } if(safe()){printf("分配成功!\n");} else{ printf("系统无法分配资源!\n"); for(i=0;i<n;i++){ available[i]=available[i]+request[number][i]; allocation[number][i]=allocation[number][i]-request[number][i]; need[number][i]=need[number][i]+request[number][i]; } } printf("是否继续申请资源?请回答(Y,N):\n"); scanf("%c",&answer);//清楚回车符 scanf("%c",&answer); if(answer=='Y' || answer=='y') continue; else break; } } 3.实验结果 按1由系统提供数据,测试t0时刻的安全性 按0由用户输入,测试t0时刻的安全性 输入进程号4,申请资源(4,8,9),如图所示,申请失败显示出失败原因,无法分配资源,若需继续分配选择Y或y 输入进程号1,申请资源(1,0,2),调用安全性算法若符合安全性,出安全序列并打印出此时系统资源分配情况,显示分配成功!若需继续分配输入Y或y,输入其他退出程序 4.实验结果分析 如上 5.实验心得 | |||||||||||
教 师 评 价 | 评定项目 | A | B | C | D | 评定项目 | A | B | C | D | |
算确 | 界面美观,布局合理 | ||||||||||
程序结构合理 | 操作熟练 | ||||||||||
语法、语义正确 | 解析完整 | ||||||||||
实验结果正确 | 文字流畅 | ||||||||||
报告规 | 题解正确 | ||||||||||
其他: 评价教师签名: 年 月 日 | |||||||||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论