法编写出来。银行家算法大部分内容是在我上网搜到的代码,之后对照ppt上银行家算法的过程后改动了一些内容得以顺利运行,这加深了我对银行家算法避免死锁检查步骤的理解。以上就是我对这两个程序编写大致情况,总的来说,这次上机使我受益匪浅。 成绩评定: 该生对待本次实验的态度 □认真 □良好 □一般 □比较差。 本次实验的过程情况 □很好 □较好 □一般 □比较差 对实验结果的分析 □很好 □良好 □一般 □比较差 文档书写符合规范程度 □很好 □良好 □一般 □比较差 综合意见: 成绩 指导教师签名 日期 12.2 《 操作系统 》课程实验第 二 次实验报告 实验内容及基本要求: 实验项目名称:内存分配算法模拟实现 实验类型:操作 每组人数: 1 实验内容及要求: 实验内容: 本实验的主要内容是实现存储管理系统中的内存分配、地址变换和虚拟存储管理中的页面置换。具体内容包括三个方面: 1、掌握动态分区分配的基本原理,设计动态分区分配系统,可以实现首次适应算法、最坏适应算法和最佳适应算法进行分区分配。 2、理解虚拟存储器的地址变换过程,设计用于模拟快表、页表、地址变换所用的寄存器的数据结构。编制页表的初始信息文件,举例说明文件中具有的信息:共有5块,每块的状态、在内存和外存的起始地址等。编程实现虚拟存储器地址变换算法程序,动态输入所要访问的逻辑地址,变换过程文字描述以及变换后的物理地址;检查输入有效、无效地址,测试程序的正确性和错误处理能力。(字符串表示二进制) 3、编程实现LRU算法或CLOCK/改进算法等置换算法(二选一),模拟实现虚拟存储器的地址变换过程。理解LRU或CLOCK改进算法等置换算法;设计与算法相关的数据结构,如:LRU的堆栈或CLOCK改进算法中的循环结构;按照最多5块的内存分配情况,编程实现所选算法,动态输入访问内存的块6
号序列,输出置换结果;输入合法、非法的访问序列数据,检查程序的正确性和健壮性。 实验要求: 虚拟地址变换程序提供逻辑地址输入界面,形象地表示出变换成物理地址的过程与最后变换成的物理地址。置换算法程序提供内存访问序列的输入界面,输出正确的置换过程描述和置换结果。 思考: 1、 地址变换产生错误的原因有哪些? 2、 在页面置换过程中,为什么会出现抖动的情况? 实验结果: 1、首次适应算法 首次适应算法(firstfit)就是在搜索储存空间时,选择所碰到的第一个满足作业储存量要求的块分配给用户 算法实现过程: ①首次适应算法(firstfit),定义了一个二维数组space,第一列存放空余内存空间,第二列存放空余空间首地址,存放时与之比较,首次匹配则终止比较,插入作业。 ②回收算法(recycle),就是让要删除的作业的首尾地址值被后一个作业替换,然后在show()中重新排序,对space数组里的数据重新赋值,然后展示出来。 void firstfit(int cout)主要代码: for(i=0;i<=cout;i++){ / /找到首次匹配的空间并插入 if(space[i][0]>=inserttask) {if(i==0) {ram[n][0]=space[0][1]; ram[n][1]=ram[n][0]+inserttask; space[0][0]=ram[0][0]-ram[n][1]; space[0][1]=ram[n][1];} else if(i==cout) {ram[n][0]=space[cout][1]; ram[n][1]=ram[n][0]+inserttask; space[cout][0]=200-ram[n][1]; pace[cout][1]=ram[n][1]; }else { ram[n][0]=space[i][1]; ram[n][1]=ram[n][0]+inserttask; space[i][0]=ram[i][0]-ram[n][1]; space[i][1]=ram[n][1];} ram[n][2]=inserttask; printf(\插入地址位置为:%d----%d\\n\n++;flag=0;break;}} 7
if(flag!=0) printf(\插入失败!\\n\void recycle()主要代码: int i,number,flag; //回收操作,把要删除的作业信息用后一个覆盖 flag=1; while(flag) { printf(\请输入要回收的作业号:\ scanf(\ if(number>0 && number-1 2、LRU算法 最近最久未使用置换算法就是当需要置换一页时,选择在最近一段时间内最久不用的页予以淘汰。 算法实现过程: ① 定义了一个存放页面的数组page和一个记录页面使用情况的数组p,两个数组长度都为3。 ② 每当置换一个页面或因页面存在而未置换时,与页面对应的数组p位置的数就会加1;当要置换一个页面时,比较数组p3个数的大小,值最小的就是最久未使用的页面。 LRU算法关键代码: for(i=0;i 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); 10 程序结果截图: 四、实验总结: 通过此次上机实验,让我对动态分区分配的首次适应算法有了深刻的了解,加深了对虚拟存储器的地址变换过程的理解,掌握了虚拟地址的置换方式——LRU算法的页面替换策略。这其中,让我印象深刻的是首次适应算法,这个算法所花的时间精力较多,里面有很多要考虑情况,例如页面能否插入位置在内存起始或末尾,又如插入位置在内存起始或末尾情况是怎样的;我的回收算法是用后一个作业覆盖要回收的作业,这就会产生打乱space数组存放空余内存信息问题,所以我又在show函数里对内存里的作业按起始地址重新排序,重新调整space数组里的数据以达到首次适应目的。之后的两个程序虚拟存储器的地址变换过程开始还不理解,在得到老师讲解后豁然开朗,程序比较简单,就是要注意处理好字符串输出时乱码的问题;而LRU算法再仔细理解了ppt的内容后,用了p数组记录每个页面信息,也得以顺利用程序实现。以上就是我对三个程序编写的大致情况,能力有限,代码虽烂,但是我还是对上课讲的这几种算法有了更深入的认识,加深了印象,受益匪浅。 成绩评定: 该生对待本次实验的态度 □认真 □良好 □一般 □比较差。 本次实验的过程情况 □很好 □较好 □一般 □比较差 对实验结果的分析 □很好 □良好 □一般 □比较差 文档书写符合规范程度 □很好 □良好 □一般 □比较差 综合意见: 成绩 指导教师签名 日期 12.13 代码下载地址百度云:/s/1bQMHqQ 解压密码下载后截图邮件给335469822@qq 11