当前位置:文档之家› 南京邮电大学-操作系统实验报告

南京邮电大学-操作系统实验报告

课内实验报告课程名:操作系统任课教师:沈超专业:信息管理与信息系统学号:姓名:二○一六至二○一七年度第一学期南京邮电大学经济与管理学院Process[numberschedul].order=tempcounter;}程序结果截图:二、银行家算法(网上借鉴)银行家算法,当进程提出资源申请时,系统首先检查该进程对资源的申请量是否超过其最大需求量及系统现有的资源能否满足进程需要。

若超过,则报错,若不能满足,则让该进程等待;否则进一步检查把资源分给该进程后系统能否出于安全状态,若安全,则分配,否则置该进程为等待资源状态。

算法实现过程:设进程i 提出请求REQUEST [j] ,则银行家算法按如下规则进行判断。

(1) 如果REQUEST [i] [j]<= NEED[i][j] ,则转(2) ;否则,出错。

(2) 如果REQUEST [i] [j]<= A V AILABLE[i][j] ,则转(3) ;否则,出错。

(3) 系统试探分配资源,修改相关数据:A V AILABLE[j]-=REQUEST[i][j];ALLOCATION[i][j]+=REQUEST[i][j];NEED[i][j]-=REQUEST[i][j];(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

Check()关键代码:{int k, f, no=0;int work[M],a[M];char finish[M];anquan=1;for(i=0;i<n; i++) finish[i]='F';for(j=0;j<m; j++) work[j]=available[j]; k=n;do{ for (i=0;i<n; i++){if (finish[i]=='F'){ f=1;for (j=0;j<m; j++)if (need[i][j]>work[j]) printf("处于安全状态.");printf("安全序列号:");for (i=0;i<n;i++) printf ("%d ",a[i]); printf("\n");printf("进程");printf(" ");printf(" Max ");rintf(" ");rintf("allocation");printf(" ");printf("need");printf(" ");f=0;if (f==1)//找到还没完成的且需求数小于可提供进程继续运行的{ finish[i]='T';a[no++]=i;//记录安全序列号for (j=0;j<m; j++)work[j]=work[j]+allocation[i][j];//释放该进程已分配的资源available[j] =work[j];}}}k--; }while(k>0);f=1;for (i=0;i<n; i++)//判断有没有进程没完成{ if (finish[i]=='F'){f=0;break; }} if (f==0) {printf("不安全状态!\n");anquan=0;} else {printf("available");printf("\n");for (i=0;i<n; i++){ printf("%2d",i);printf(" ");for(j=0;j<m; j++)printf("%2d",max[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",allocation[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",need[i][j]);printf(" ");for(j=0;j<m; j++){if(i>0)break;printf("%2d",available[j]);}printf("\n");}}}程序结果截图:三、实验总结:这次上机模拟了进程调度过程和解决了死锁问题,让我对短作业优先调度算法和银行家算法有了比在课堂上更深刻的认识。

纸上得来终觉浅,绝知此事要躬行。

这句话说的很有道理,本以为自己在课堂上已经对算法的调度过程掌握得一清二楚,但在实践编程的时候,总是遇到系统不按短作业次序执行,或者周转时间计算结果错误等逻辑错误,只有当自己把程序执行过程和老师ppt上的过程一一对照认真理解,才最终把短作业优先调度算if(flag!=0)printf("插入失败!\n");}void recycle()主要代码:int i,number,flag; //回收操作,把要删除的作业信息用后一个覆盖flag=1;while(flag){ printf("请输入要回收的作业号:");scanf("%d",&number);if(number>0 && number-1<n){for(i=number-1;i<=n;i++){ram[i][0]=ram[i+1][0];ram[i][1]=ram[i+1][1];}n--;flag=0;} else {printf("无此作业号!\n");}}printf("注意,删除后作业号会改变!\n");程序结果截图:2、LRU算法最近最久未使用置换算法就是当需要置换一页时,选择在最近一段时间内最久不用的页予以淘汰。

算法实现过程:①定义了一个存放页面的数组page和一个记录页面使用情况的数组p,两个数组长度都为3。

②每当置换一个页面或因页面存在而未置换时,与页面对应的数组p位置的数就会加1;当要置换一个页面时,比较数组p3个数的大小,值最小的就是最久未使用的页面。

LRU算法关键代码:for(i=0;i<N;i++){printf("%5d",input[i]);num=compare(i,input);//比较页面是否存在if(flag)p[num]=i+1;else {longtime=findmin(p);//找到下标最小的页面的位置page[longtime]=input[i];p[longtime]=i+1;sum++;}printf("%12d%5d%5d\n",page[0],page[1],page[2]);}printf("\n");change=sum-3;change_rate=float(change)/N;lost_rate=float(sum)/N;程序结果截图:3、虚拟存储器的地址变换先将一个进程的逻辑地址空间分成若干个大小相等的片称为页面或页,并为各页加以编号,从0开始,每个页面后有页面号,当有请求时,把逻辑地址前几位提出来与页号比较,成功后返回页面号,与有效地址形成物理地址。

算法实现过程:①设定一个二维字符串数组数组存储页面信息,两个一维字符串数组存放输入和输出地址。

②假设页号为3位,页面号和有效地址都为4位,把输入数组的前三位与每个页号相比较,成功后返回下标,然后拼接输出。

int compare(char input[])关键代码:for(i=0;i<8;i++){cout=0;for(j=0;j<3;j++)if(input[j]==page[i][j])cout++;if(cout==3) //若3位的页号匹配成功cout=3{flag=1;p=i;break;}拼接字符串关键代码:printf("对应的物理地址如下:\n");for(i=0;i<4;i++)temp[i]=page[p][i+3];temp[4]='\0'; //避免乱码strcpy(output,temp); //页面号的复制for(i=0;i<4;i++)temp[i]=input[i+3];temp[4]='\0';strcat(output,temp);puts(output);程序结果截图:四、实验总结:通过此次上机实验,让我对动态分区分配的首次适应算法有了深刻的了解,加深了对虚拟存储器的地址变换过程的理解,掌握了虚拟地址的置换方式——LRU算法的页面替换策略。

这其中,让我印象深刻的是首次适应算法,这个算法所花的时间精力较多,里面有很多要考虑情况,例如页面能否插入位置在内存起始或末尾,又如插入位置在内存起始或末尾情况是怎样的;我的回收算法是用后一个作业覆盖要回收的作业,这就会产生打乱space数组存放空余内存信息问题,所以我又在show函数里对内存里的作业按起始地址重新排序,重新调整space数组里的数据以达到首次适应目的。

之后的两个程序虚拟存储器的地址变换过程开始还不理解,在得到老师讲解后豁然开朗,程序比较简单,就是要注意处理好字符串输出时乱码的问题;而LRU算法再仔细理解了ppt的内容后,用了p数组记录每个页面信息,也得以顺利用程序实现。

以上就是我对三个程序编写的大致情况,能力有限,代码虽烂,但是我还是对上课讲的这几种算法有了更深入的认识,加深了印象,受益匪浅。

成绩评定:该生对待本次实验的态度□认真□良好□一般□比较差。

本次实验的过程情况□很好□较好□一般□比较差对实验结果的分析□很好□良好□一般□比较差文档书写符合规范程度□很好□良好□一般□比较差综合意见:成绩指导教师签名日期12.13代码下载地址百度云:/s/1bQMHqQ解压密码下载后截图邮件给335469822@qq11。

相关主题