请求分页存储器管理

上传人:飞*** 文档编号:34006166 上传时间:2018-02-19 格式:DOC 页数:15 大小:359KB
返回 下载 相关 举报
请求分页存储器管理_第1页
第1页 / 共15页
请求分页存储器管理_第2页
第2页 / 共15页
请求分页存储器管理_第3页
第3页 / 共15页
请求分页存储器管理_第4页
第4页 / 共15页
请求分页存储器管理_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《请求分页存储器管理》由会员分享,可在线阅读,更多相关《请求分页存储器管理(15页珍藏版)》请在金锄头文库上搜索。

1、请求分页存储器管理2.1 目的实现分页式存储地址转换过程,在此基础上实现请求分页的地址转换。实现请求页式地址转换中出现的缺页现象时,用到的先进先出 FIFO、最近最久未使用 LRU。 2.2 内容利用键盘输入本模拟系统的物理块的大小,作业的页表中的块号;完成逻辑地址转换成相应的物理地址的过程。1、建立一张位示图,用来模拟内存的分配情况,利用随机数产生一组 0 和1 的数对应内存的使用情况。2、输入块(页)的大小,通过模拟位示图为本作业分配内存空间建立相应的页表(长度不定) ;3、录入逻辑地址转换成相应的物理地址4、扩充页表,变成请求式的二维页表(增加存在位等)完成地址转换。5、输入分配给本作业

2、的块数,模拟作业执行的逻辑地址转换成页面调度次序;6、分别采用 OPT、FIFO 置换算法,利用堆栈结构完成页面置换;记录被换出的页面和新换入的页面。2.3 数据结构数据结构:231 typedef struct node /*页表项 */int yh; int kh;int zt;node *next;linklist;struct linklist1 /*内存块分配 */int hm;int jr;linklist1 *next; ; 函数说明:335 函数 exectu()功能:查页表,并产生对 m1()函数或 m2()函数的调用。336 函数 m1()功能:在不缺页的情况下对各页面的最

3、近最少使用情况变更函数。337 函数 m2()功能:在发生缺页中断情况下,对页面的置换及调用的函数。2.4 算法设计及流程图FIFO 页面调度算法是淘汰最先进入内存的页面,即在页面中驻留时间最久的页面予以淘汰。置换图如下:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 LRU 页面调度算法总是淘汰该作业中距现在最久没被访问过的那页,因此可以用一个数组来表示该作业已在主存的页面。数组中的第一个元素总是指出当前刚访问的页号,因此最久没被访问过的页总是由最后一个元素指出。置换图如下:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 7 7

4、 7 2 2 2 4 4 4 0 0 0 7 7 70 0 0 3 3 3 2 2 2 1 1 1 0 01 1 1 0 0 0 3 3 3 2 2 2 17 7 7 2 2 4 4 4 0 1 1 10 0 0 0 0 0 3 3 3 0 01 1 3 3 2 2 2 2 2 7O s 命令 C P U 从外存读缺页启动 设备从外存读页到内存修改页表将该也写回外存选出一页换出是否被修改 ?内存满否 ?从外存中找到缺页保留 现场页号 页表长度 ? 检索快表页表项在块表中页在内存 ?访问页表修改快表修改访问位和修改位形成物理地址地址变换结束越界中断开始缺页中断处理否否是是是否否是是产生缺页中断请

5、求调页逻辑地址 块长状态位访问字段位视图外存地址不一定修改 Y / N程序请求访问一页2.5 源代码#include#include#include#include#define null 0typedef struct nodeint yh;int kh;int zt;node *next;linklist;struct linklist1int hm;int jr;linklist1 *next;void Create(linklist *head,int m) /创建页表linklist *r,*s;r=head;int ch;int i;for(i=0;iyh=ch;s-kh=-1;s

6、-zt=0;r-next=s;r=s;r-next=null;void Create1(linklist1 *head1,int n) /创建内存分配块数表linklist1 *r,*s;r=head1;int ch; int i;for(i=0;ihm=ch;s-jr=-1;r-next=s;r=s;r-next=null;void output(linklist *head,linklist1 *head1,int a,int b,int c,int d,int e,float f) /a 为逻辑地址,b 为页长,c 为物理地址, d 为块长,e 为缺页数, f 为缺页率linklist

7、*l=head-next;linklist1 *l1=head1-next;printf(页表为:n);while(l!=null)printf(页号:%d,块号:%d,状态位:%dn,l-yh,l-kh,l-zt);l=l-next;printf(分配的块为;n);while(l1!=null)printf(块号:%d,页号:%dn,l1-hm,l1-jr);l1=l1-next; printf(逻辑地址为:%dn,a);printf(页号为:%dn,b);printf(物理地址为:%dn,c);printf(块长为:%dn,d);printf(却页数为:%dn,e);printf(缺页率为

8、:%fn,f);void FIFO(linklist *head,linklist1 *head1,int m,int w88,int p1) /m 为页长,w 为位试图,p 为块长int a,b,c,i,j;float sun=0,sum=0; /计算缺页比率linklist *r;linklist1 *q,*p;q=head1-next; /kuair=head-next; /yeprintf(请输入逻辑地址:n);scanf(%d,while(a!=0)sum+;int k=0;p=head1-next;b=a/p1;c=a%p1;r=head-next;while(b=m)printf

9、(超出页表长度,请重新输入:n);scanf(%d,b=a/p1;c=a%p1;printf(页号为:%d,相对地址为:%d,b,c);while(b!=r-yh)r=r-next;if(r-zt=1)int Add=(r-kh*p1)+c;output(head,head1,a,b,Add,p1,sun,sun/sum);elsesun+;r-zt=1;if(q!=null)for(i=0;ikh=i*8+(j+1);q-jr=b;q=q-next;break;elselinklist *r1;linklist1 *r2;r1=head-next;r2=head1-next;while(r2

10、-jr!=r1-yh)r1=r1-next;r-kh=r1-kh;r1-zt=0;while(r2-next!=null)r2-jr=r2-next-jr;r2=r2-next;r2-jr=b;int Add=(r-kh)*p1+c;output(head,head1,a,b,Add,p1,sun,sun/sum); printf(请输入逻辑地址:n);scanf(%d,void LRU(linklist *head,linklist1 *head1,int m,int w88,int p1) /m 为页长,w 为位试图,p 为块长int a,b,c,i,j;float sun=0,sum=0

11、; /计算缺页比率linklist *r;linklist1 *q,*p,*t;q=head1-next; /kuair=head-next; /yeprintf(请输入逻辑地址:n);scanf(%d,while(a!=0)sum+;int k=0;p=head1-next;b=a/p1;c=a%p1;r=head-next;t=head1-next;while(b=m)printf(超出页表长度,请重新输入:n);scanf(%d,b=a/p1;c=a%p1;printf(页号为:%d,相对地址为:%d,b,c);while(b!=r-yh)r=r-next;if(r-zt=1)while

12、(t-jr!=r-yh)t=t-next;while(t-next!=null&t-next-jr!=-1)int c2;c2=t-next-jr;t-next-jr=t-jr;t-jr=c2;t=t-next;output(head,head1,a,b,(r-kh*p1)+c,p1,sun,sun/sum);elsesun+;r-zt=1;if(q!=null)for(i=0;ikh=i*8+(j+1);q-jr=b;q=q-next;break;elselinklist *r1;linklist1 *r2;r1=head-next;r2=head1-next;while(r2-jr!=r1

13、-yh)r1=r1-next;r-kh=r1-kh;r1-zt=0; while(r2-next!=null)r2-jr=r2-next-jr;r2=r2-next;r2-jr=b;int Add=(r-kh)*p1+c;output(head,head1,a,b,Add,p1,sun,sun/sum); printf(请输入逻辑地址:n);scanf(%d,void main()linklist *head;linklist1 *head1;char c;int m,n,p,i,j;int a88;srand(time(0);for(i=0;i8;i+)for(j=0;j8;j+)if(i=

14、0)aij=1;elseaij=rand()%2;head=(linklist *)malloc(sizeof(linklist);head1=(linklist1 *)malloc(sizeof(linklist1);printf(请输入页表大小:n);scanf(%d,Create(head,m);printf(请输入内存分配块数量:n);scanf(%d,Create1(head1,n);printf(请输入块的大小:n);scanf(%d,printf(请选择算法 f 或 l:n);getchar();scanf(%c,switch(c)case f: FIFO(head,head1,m,a,p);break;case l: LRU(head,head1,m,a,p);break; 2.6 小结通过本次实验加深了我对于作业/进程调度功能的认识,并且更加深刻地理 解了操作系统中进程调度的基本原理。在模拟作业/进程调度过程中,我深深体会到此次课程设计的重要性,它是我走上工作岗位前的一次重要的练习,更深刻体会到理论联系实践的重要性和必要性。同时,我也感受到 VC+语言的功能之强大,事件处理的灵活性和高效性,有了较好的了解,但我掌握和应用的还不是很熟练,应多加,在以后的工作中,我将不断的学习和充实自己,力争成为一个高水平的程序员。在

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号