(完整word版)操作系统实验3--请求分页式存储管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
请求分页式存储管理
一、问题描述
设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。而不再判断它是否被改写过,也不将它写回到辅存。
二、基本要求
页面尺寸1K,输入进程大小(例如5300bytes),对页表进行初始化
页表结构如下:
系统为进程分配:
任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满(查空闲块表,找到空闲块),则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况。
存储管理算法的流程图见下页。
三、实验要求
完成实验内容并写出实验报告,报告应具有以下内容:
1、实验目的。
2、实验内容。
3、程序及运行情况。
4、实验过程中出现的问题及解决方法。
#include
#include
int PUB[20][3];
int ABC[3][2]={{0,1},{1,1},{2,1}};//物理块
int key=0;
void output(int size){
//打印
int i,j;
printf("页号\t\t物理块号\t\t状态位\n\n");
for(i=0;i { printf(" %d\t\t%d\t\t\t%d\n\n",PUB[i][0],PUB[i][1],PUB[i][2]); } printf("物理块号\t\t是否空闲\n\n"); for(i=0;i<3;i++) { printf(" %d\t\t\t%d\n\n",ABC[i][0],ABC[i][1]); } } void main(){ int size; int i,j; int address=0; int select=0; printf("请输入进程大小\n"); scanf("%d",&size); if(size<=0 || size>20000) { printf("进程大小超出范围\n"); exit(0); } size%1000==0 ? size=size/1000 : size=size/1000+1; for(i=0;i { PUB[i][0]=i; //页号 PUB[i][1]=0; //物理块号 PUB[i][2]=0; //状态位 } output(size); while(1) { printf("输入指令地址\n"); scanf("%d",&address); if(address<0 || address>20000) { printf("地址超出范围\n"); exit(0); } address%1000==0 ? address=address/1000 : address=address/1000; if(PUB[address][2]==0) //不在主存 { if(ABC[2][1]==0) //满了 { printf("满了\n"); if(select!=address) key++; for(i=0;i { if(PUB[i][1]==key) { PUB[i][1]=0; PUB[i][2]=0; } } PUB[address][1]=key; PUB[address][2]=1; key++; if(key>3) key=1; } if(ABC[2][1]==1) //没满 { printf("没满\n"); for(i=0;i<3;i++) { if(ABC[i][1]==1) { ABC[i][1]=0; PUB[address][1]=i+1; PUB[address][2]=1; break; } } } output(size); } else { printf("该页已在内存\n"); output(size); } select=address; } }