兰州大学操作系统实验八存储管理模拟题目和答案-实验报告_第1页
兰州大学操作系统实验八存储管理模拟题目和答案-实验报告_第2页
兰州大学操作系统实验八存储管理模拟题目和答案-实验报告_第3页
兰州大学操作系统实验八存储管理模拟题目和答案-实验报告_第4页
兰州大学操作系统实验八存储管理模拟题目和答案-实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10/10实验报告实验八实验名称:存储管理模拟实验目的:掌握请求分页存储管理系统的基本原理实现一个模拟的虚拟分页存储管理系统实验要求:编写一个程序,模拟一个虚拟分页存储管理系统.其中,由系统随机产生进程;进程大小、进程到达次序、时间、进程执行轨迹〔页面访问顺序〕也随机生成,但进程之间必须有并发存在,进程执行时间需有限,进程调度采用时间片轮转算法〔以页面模拟〕;rss驻留集大小物理块分配策略采取固定分配局部置换;分配算法采用按比例分配算法;调页采用请求调页方式;置换分别采用FIFO、LRU<一直没用>访问次数和简单CLOCK算法〔循环链表〕标志有没有被访问;驻留集大小可调,观察驻留集大小对缺页率的影响.算法思想:FIFO先进先出法LRU最久未使用算法CLOCK简单时钟算法命中率=1-页面失效次数/页地址流<序列>长度驻留集大小可调,观察驻留集大小对缺页率的影响.结构体定义页面控制表表结构页面号指针页面控制结构单位时间访问次数页框号上次访问时间页面序号页面控制表表结构页面号指针页面控制结构单位时间访问次数页框号上次访问时间页面序号页面页框号页框号包含链表:空闲页面表忙页面表包含数组:进程数组页面号数组开始流程图:开始引用块编号大于物理块?分配物理块为其分配页号随机得到进程指令序列引用块编号大于物理块?分配物理块为其分配页号随机得到进程指令序列否页号在物理块内?页号在物理块内?是是是否完成?选择FIFOLRUCLOCK置换算法置换是否完成?选择FIFOLRUCLOCK置换算法置换是结束结束实验结果分析:观察数据可看出:横向:三种替换算法的命中率由高到底排列应该是LRU>CLOCK>FIFO.纵向:进程的驻留级越大,其缺页率就越低.实验体会:内存中进程的多少会影响驻留集大小和缺页中断率.如果内存中进程太多,将导致每个进程的驻留集太小,发生缺页中断的概率很大.相应地,系统发生抖动的可能性就会很大.如果在内存中保持太少的活动进程,那么所有活动进程同时处于阻塞状态的可能性就会很大,从而降低处理机的利用率.置换算法的好坏将直接影响系统的性能,不适当的置换算法可能导致系统出现"抖动"现象.常用的页面置换算法:最佳置换算法、最近最少使用算法、先进先出算法和时钟算法等.最佳置换算法难以实现但可以成为核对其他算法的标准.也应注意负载问题,解决系统应当保持多少个活动进程驻留在内存的问题,即控制多道程序系统的度.当内存中的活动进程数太少时,负载控制将增加新进程或激活一些挂起进程进入内存;反之,当内存中的进程数太多时,负载控制将暂时挂起一些进程,减少内存中的活动进程数.实验代码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#defineTRUE1#defineFALSE0#defineINVALID-1#definetotal_instruction320//指令流长#definetotal_vp32//页长#defineclear_period50typedefstruct//页面结构{intpn, //页面序号pfn, //页面所在内存区的页框号 counter, //单位时间内访问次数 time; //上次访问的时间}pl_type;pl_typepl[total_vp];//页面结构数组structpfc_struct{//页面控制结构intpn, //页面号 pfn; //内存区页面的页框号structpfc_struct*next; //页面指针,用于维护内存缓冲区的链式结构};typedefstructpfc_structpfc_type;//主存区页面控制结构别名pfc_typepfc[total_vp], //主存区页面控制结构数组*freepf_head, //主存区页面控制结构的空闲页面头指针*busypf_head, //主存区页面控制结构的忙页面头指针*busypf_tail; //主存区页面控制结构的忙页面尾指针intdiseffect; //页错误计数器,初次把页面载入主存时也当做页错误inta[total_instruction]; //随即指令流数组intpage[total_instruction]; //指令对应的页面号intoffset[total_instruction]; //指令所在页面中的偏移量intinitialize<int>; //初始化页面结构数组和页面控制结构数组intFIFO<int>; //先进先出算法intLRU<int>; //最近最久未使用算法intCLOCK<int>; //简单时钟<钟表>算法intmain<>{ints; //随机数inti;srand<10*getpid<>>;/*每次运行时进程号不同,用来作为初始化随机数队列的"种子"*/s=<int><<float><total_instruction-1>*<rand<>/<RAND_MAX+1.0>>>; printf<"\nrandinstructionsqueue\n">;for<i=0;i<total_instruction;i+=4>//产生指令队列{a[i]=s;//任选一指令访问点ma[i+1]=a[i]+1;//顺序执行一条指令a[i+2]=<int><<float>a[i]*<rand<>/<RAND_MAX+1.0>>>;//执行前地址指令m'a[i+3]=a[i+2]+1;//顺序执行一条指令printf<"%6d%6d%6d%6d\n",a[i],a[i+1],a[i+2],a[i+3]>;s=<int><<float><<total_instruction-1>-a[i+2]>*<rand<>/<RAND_MAX+1.0>>>+a[i+2];} printf<"\n">; for<i=0;i<total_instruction;i++>//将指令序列变换成页地址流{page[i]=a[i]/10;offset[i]=a[i]%10;}printf<"parethethreemethods:">; printf<"\n\n">;printf<"Rss\tFIFO\tLRU\tCLOCK\n">;for<i=4;i<=32;i++>//用户内存工作区从4个页面到32个页面{printf<"%2d\t",i>;FIFO<i>;LRU<i>; CLOCK<i>;printf<"\n">;}return0;}//初始化页面结构数组和页面控制结构数组//total_pf;用户进程的内存页面数intinitialize<inttotal_pf>{inti;diseffect=0;for<i=0;i<total_vp;i++> { pl[i].pn=i; pl[i].pfn=INVALID;//置页面所在主存区的帧号为-1.表示该页不在主存中 pl[i].counter=0; //置页面结构中的访问次数为0 pl[i].time=-1; //置页面结构中的上次访问的时间为-1 } for<i=0;i<total_pf-1;i++> { pfc[i].next=&pfc[i+1]; //建立pfc[i-1]和pfc[i]之间的 pfc[i].pfn=i; //初始化主存区页面的页框号 } pfc[total_pf-1].next=NULL; pfc[total_pf-1].pfn=total_pf-1; freepf_head=&pfc[0]; //主存区页面控制结构的空闲页面头指针指向pfc[0] return0;}//最近最久未使用算法//inttotal_pf;用户进程的内存页面数intLRU<inttotal_pf>{intMinT; //最小的访问时间,即很久没被访问过 intMinPn; //拥有最小的访问时间的页的页号 inti,j; intCurrentTime; //系统当前时间initialize<total_pf>; //初始化页面结构数组和页面控制结构数组CurrentTime=0; diseffect=0; for<i=0;i<total_instruction;i++> { if<pl[page[i]].pfn==INVALID>//页面失效 { diseffect++; //页错误次数加if<freepf_head==NULL>//无空闲页面{MinT=100000; for<j=0;j<total_vp;j++>{//找出time的最小值,表明该页很久没被访问过 if<MinT>pl[j].time&&pl[j].pfn!=INVALID> {MinT=pl[j].time;MinPn=j; } } freepf_head=&pfc[pl[MinPn].pfn];//最久没被访问过的页被释放 pl[MinPn].pfn=INVALID; //最久没被访问过的页被换出主存 pl[MinPn].time=-1; //最久没被访问过的页的访问时间置为无效 freepf_head->next=NULL; }pl[page[i]].pfn=freepf_head->pfn;//有空闲页面,把相应的页面换入主存,并把pfn改为相应的页框号pl[page[i]].time=CurrentTime; //令访问时间为当前系统时间freepf_head=freepf_head->next;//减少一个空闲页面 } else pl[page[i]].time=CurrentTime;//命中则刷新该单元的访问时间 CurrentTime++;//系统当前时间加} printf<"%6.3f\t",1-<float>diseffect/320>; return0;}//简单时钟算法//inttotal_pf;用户进程的内存页面数intCLOCK<inttotal_pf>{ inti; intuse[total_vp];//使用位 intswap; swap=0; //发生替换 initialize<total_pf>; pfc_type*pnext; //时钟指针 pfc_type*head; //队列头指针 pnext=freepf_head; head=freepf_head; for<i=0;i<total_vp;i++>{use[i]=0;}//初始化使用位为 diseffect=0; for<i=0;i<total_instruction;i++> { if<pl[page[i]].pfn==INVALID>//页面失效,不在主存中 { diseffect++; //页错误次数加 if<freepf_head==NULL>//无空闲页面 { while<use[pnext->pfn]==1>//若时钟指针指向的页的使用位为,则改为并跳过 { use[pnext->pfn]=0; pnext=pnext->next; if<pnext==NULL>pnext=head;//如果时钟指针到达队列尾部,重新返回头部 } //换出被替换的页 pl[pnext->pn].pfn=INVALID; swap=1; } if<use[pnext->pfn]==0>{//如果使用位为,则换入相应的页 pl[page[i]].pfn=pnext->pfn;//页面结构中要标记页框号 pnext->pn=page[i];//页面控制结构中要标记页号 use[pnext->pfn]=1; //重置使用位为 pnext=pnext->next; //时钟指针下移 if<pnext==NULL>pnext=head; //如果时钟指针到达队列尾部,重新返回头部 if<swap==0>{freepf_head=freepf_head->next; } } }else{//页面在主存中 use[pl[page[i]].pfn]=1;//刷新使用位为 } } printf<"%6.3f\t",1-<float>diseffect/320>; return0;}//先进先出算法版本//inttotal_pf;用户进程的内存页面数//实现细节由CLOCK算法退化而来,与FIFO同效果intFIFO<inttotal_pf>{ inti; intuse[total_vp]; intswap=0; initialize<total_pf>; pfc_type*pnext,*head; pnext=freepf_head; hea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论