5 虚拟存储管理器的页面调度.docx
- 文档编号:10816068
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:18
- 大小:282.57KB
5 虚拟存储管理器的页面调度.docx
《5 虚拟存储管理器的页面调度.docx》由会员分享,可在线阅读,更多相关《5 虚拟存储管理器的页面调度.docx(18页珍藏版)》请在冰点文库上搜索。
5虚拟存储管理器的页面调度
实验报告
课程名称操作系统实验
实验名称虚拟存储管理器的页面调度
实验类型验证型
实验地点304机房实验日期2011.5.18
指导教师赵新慧
专业计算机科学与技术
班级算机0901
学号32
姓名代静雯
成绩______________
辽宁石油化工大学计算机与通信工程学院
实验报告说明
1、封面内容
(1)课程名称:
实验所属的课程的名称。
(2)实验名称:
要用最简练的语言反映实验的内容。
要求与实验指导书中相一致。
(3)实验类型:
说明是验证型实验、设计型实验、创新型实验还是综合型实验。
2、正文内容
实验报告的正文内容须包括以下内容:
(1)实验目的:
目的要明确,要抓住重点,符合实验指导书中的要求。
(2)实验内容:
说明本实验的主要内容。
(3)实验原理:
简要说明本实验项目所涉及的理论知识。
(4)实验环境:
实验用的软硬件环境(配置)。
(5)实验方案:
对于验证性型实验,写明依据何种原理、操作方法进行实验;对于设计型和综合型实验,写明依据何种原理、操作方法进行实验,并画出硬件组成图、软件流程图、设计思路和设计方法,再配以相应的文字说明;对于创新型实验,除符合设计型和综合型实验要求外,还应注明其创新点、特色。
(6)实验步骤:
写明实验的实施步骤,包括实验过程中的记录、数据。
(7)实验结果与分析:
写明实验的最终结果,并对结果进行分析,做出结论。
(8)实验中遇到的问题及解决方法:
写明实验过程中遇到的问题及所采取的解决方法。
(9)实验总结(在封底上):
写出对本次实验的心得体会、思考和建议。
一、实验目的
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。
熟悉虚存管理的各种页面淘汰算法;
二、实验原理
请求分页式存储管理:
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存;如果该页不在主存且内存块未满,则调入该页;如果该页不在主存且内存块已满,则按页面淘汰算法淘汰一页后调入所需的页。
三、实验内容
假设分给一作业的内存块数为4,每个页面中可存放10条指令。
用C语言设计一个程序,模拟一作业的执行过程。
设该作业共有320条指令,即它的地址空间为32页,目前它的所有页面都还未调入内存。
在模拟过程中,每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印内存块情况;如果该页不在主存且内存块未满,则调入一页并打印内存块情况;如果该页不在主存且内存块已满,则按页面淘汰算法淘汰一页后调入所需的页,打印内存块情况;逐个地址访问,直到所有地址访问完毕。
在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
置换算法:
请分别考虑OPT、FIFO和LRU算法。
作业中指令的访问次序要求按下述原则生成:
50%的指令是顺序执行的。
25%的指令是均匀分布在前地址(即低地址)部分。
25%的指令是均匀分布在后地址(即高地址)部分。
具体的实施办法是:
①在[0,319]之间随机选取一条起始执行指令,其序号为m;
②顺序执行下一条指令,即序号为m+1的指令;
③通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1;
④顺序执行下一条指令,即序号为m1+1的指令;
⑤通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;
⑥顺序执行下一条指令,即序号为m2+1的指令;
⑦重复“跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行”的过程,直至执行完全部320条指令。
注:
随机数函数的使用
Turboc:
random()的函数原型为int random(int num)
它的作用是求 0<= i randomize的函数原型为void randomize(void) randomize()用于初始化随机种子,程序中一般只写一次。 另外使用这两个函数时应含入 #include 例如: #include "stdio.h" #include "stdlib.h" voidmain() { int i; int a[10]; randomize(); for(i=0;i<10;i++) { a[i]=random(100);//return a random number bewteen 0 to 99 printf("%d ",a[i]); } printf("\n"); getch(); } VisualC++下与randomize()相对应的函数为srand(),与random()相对应的函数为ran(),例如: inti; intRANGE_MIN=0; intRANGE_MAX=100; srand((unsigned)time(NULL)); for(i=0;i<10;i++) {intrand100=(((double)rand()/ (double)RAND_MAX)*RANGE_MAX+RANGE_MIN); printf("%6d",rand100); } 四、实验环境 软件环境: Tc或VisualC++ 五、实验步骤 1)虚拟存储管理器的页面调度流程图 2)虚拟存储管理器的页面调度源程序 #include #include #include #defineMAXSIZE1000//定义最大页面数 #defineMAXQUEUE3//定义页框数 typedefstructnode {//申明页框表中页面结点的结构 intloaded;//页面号装载器 inthit;//页面状态装载器 }page; pagepages[MAXQUEUE];//定义页框表 intqueue[MAXSIZE];//需访问的页面流 intquantity;//页面流计数器 voidinitial() {//初始化结构函数 inti; for(i=0;i { pages[i].loaded=-1; pages[i].hit=0; } for(i=0;i { queue[i]=-1; } quantity=0; } voidinit() {//初始化页框函数 inti; for(i=0;i { pages[i].loaded=-1; pages[i].hit=0; } } voidreadData() {//读入页面流 FILE*fp; charfname[20]; inti; printf("请输入页面流文件名: "); scanf("%s",fname); printf("\n"); if((fp=fopen(fname,"r"))==NULL) { printf("错误,文件打不开,请检查文件名! ! ! \n"); exit (1); } else { while(! feof(fp)) {//录入需访问的页面流 fscanf(fp,"%d",&queue[quantity]); if(queue[0]==-1) { printf("错误,文件为空,请检查文件是否为空! ! ! \n"); exit (1); } quantity++; } } printf("录入的需访问的页面流为: "); printf("\n\n"); for(i=0;i { printf("%6d",queue[i]); } printf("\n"); } voidFIFO() {//FIFO调度算法 inti,j,flag,p=0; intabsence=0; printf("\nFIFO调度算法页面调出流: *: 页框表为空而发生缺页中断¥: 未发生缺页中断"); printf("\n\n"); for(i=0;i { flag=0; for(j=0;j {//检查是否发生缺页中断,如果没发生则将flag的值置1 if(pages[j].loaded==queue[i]) { flag=1; printf("%5s¥","");//输出¥号表示未发生缺页中断 } } if(flag==0) {//缺页中断处理 if(absence>=MAXQUEUE) {//输出被淘汰的的页面号 printf("%6d",pages[p]); } else { printf("%5s*","");//输出*号表示页框表为空而发生缺页中断 } pages[p].loaded=queue[i]; p=(p+1)%MAXQUEUE; absence++;//统计缺页次数 } } printf("\n总缺页数为: %-6d%6s缺页率为: %f\n",absence,"",float(absence)/quantity); } voidLRU() {//最近最少使用调度算法(LRU) intabsence=0; inti,j,p,k=2; intflag; printf("\n最近最少使用调度算法页面调出流: \n%4s*: 页框表为空的缺页中断%4s¥: 未发生缺页中断","",""); printf("\n\n"); for(i=0;i { printf("%5s*","");//输出*号表示页框表为空而发生缺页中断 pages[k--].loaded=queue[i];//页框表为空时装入页面 absence++; } for(i=MAXQUEUE;i { flag=-1; for(j=0;j {//检查是否发生缺页中断,如果没发生则进行相应处理 if(queue[i]==pages[j].loaded) { for(p=j;p>0;p--) { pages[p].loaded=pages[p-1].loaded; } pages[p].loaded=queue[i]; flag=1; printf("%5s¥","");//输出¥号表示未发生缺页中断 } } if(flag==-1) {//缺页中断处理 printf("%6d",pages[MAXQUEUE-1]);//输出被淘汰的的页面号 for(j=2;j>=0;j--) { pages[j]=pages[j-1]; } pages[0].loaded=queue[i]; absence++; } } printf("\n总缺页数为: %-6d%6s缺页率为: %f\n",absence,"",float(absence)/quantity); } voidLFU() {//最近最不常用调度算法(LFU) inti,j,p; intabsence=0; intflag; printf("\n最近最不常用调度算法页面调出流: \n%4s*: 页框表为空的缺页中断%4s¥: 未发生缺页中断","",""); printf("\n\n"); for(i=0;i { printf("%5s*","");//输出*号表示页框表为空而发生缺页中断 pages[i].loaded=queue[i];//页框表为空时装入页面 pages[i].hit++; absence++; } for(i=MAXQUEUE;i { flag=0; for(j=0;j {//检查是否发生缺页中断,如果没发生则将flag的值置1,计数器值加1 if(pages[j].loaded==queue[i]) { flag=1; pages[j].hit++; printf("%5s¥","");//输出¥号表示未发生缺页中断 } } if(flag==0) {//缺页中断处理 p=0; for(j=0;j {//在页框表中查找最近最不常用的页面 if(pages[j].hit { p=j; } } printf("%6d",pages[p]);//输出被淘汰的的页面号 absence++; pages[p].loaded=queue[i];//调出最近最不常用的页面 pages[p].hit=1; for(j=0;j {//周期T计数器清0 pages[j].hit=0; } } } printf("\n总缺页数为: %-6d%6s缺页率为: %f\n",absence,"",float(absence)/quantity); } voidversion() { printf("\n\n"); printf("\n"); printf(" 虚拟存储管理器的页面调度 \n"); printf("\n"); printf("\n"); } voidmain() { intchoice,flag=1; initial(); readData(); while(flag) { printf("\n\n算法符号选择如下所示: \n"); printf("\n"); printf("1FIFO算法%22s2近最少使用调度算法(LRU)\n",""); printf("\n"); printf("3最近最不常用调度算法(LFU)%5s4退出系统\n",""); printf("\n"); printf("请输入你要进行的虚拟存储管理器的页面调度: "); scanf("%d",&choice); switch(choice) { case1: //FIFO算法 FIFO(); break; case2: //最近最少使用调度算法(LRU) LRU(); init();//初始化页框表中页面部分数据相关信息 break; case3: //最近最不常用调度算法(LFU) LFU(); init(); break; case4: //退出系统 flag=0; break; default: printf("命令错误\n"); } } } 3)调试结果 【实验总结】 通过这次编写和调试存储管理的模拟程序,我加深对存储管理方案的理解。 熟悉虚存管理的各种页面淘汰算法;这个程序还可以添加输入文件名,系统自动创建或者删除文本文档的功能,这样可以使功能更趋于完善! 【指导教师评语及成绩】 成绩: 指导教师(签字): 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟存储管理器的页面调度 虚拟 存储 管理器 页面 调度