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