当前位置:文档之家› 操作系统实验3 请求分页式存储管理

操作系统实验3 请求分页式存储管理

请求分页式存储管理
为简单起见。

页面淘汰算法采用 FIFO 页面淘汰算法, 只将该页在页表中修改状态位。

而不再判断它是否被改写过, 也不
将它
输入进程大小(例如 5300bytes ),对页表进行初始化
系统为进程分配3个物理块(页框),块号分别为0、1、2,页框管理表(空闲块表)
任意输入一个需要访问的指令地址流(例如:
4355,输入负数结束),打印页表情况。

每访问一个地址时, 首先要计算该地址所在的页的页号, 然后查页表,判断该页是否在
主存 ——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满 (查空闲块表, 找到空闲块),则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则 按FIFO 页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况。

存储管理算法的流程图见下页。

三、实验要求
完成实验内容并写出实验报告,报告应具有以下内容:
1、 实验目的。

2、 实验内容。

3、 程序及运行情况。

4、 实验过程中出现的问题及解决方法。

#in clude<stdio.h>
#in clude<stdlib.h> int P UB[20][3];
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<size;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<size;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<size;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;。

相关主题