[问题描述] 设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。而不再判断它是否被改写过,也不将它写回到辅存。
[基本要求]
页面尺寸1K,输入进程大小(例如5300bytes),对页表进行初始化,
页表结构:
页 号 | 物理块号 | 状态位 |
0 | 2 | True (在主存) |
1 | 1 | |
2 | False (在辅存) | |
3 | 0 | |
4 | False (在辅存) | |
5 | False (在辅存) |
系统为进程分配3 个物理块(页框),块号分别为0、1、2,页框管理表(空闲块表):
物理块号 | 是否空闲 |
0 | true |
1 | true |
2 | true |
任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满 ,则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况;
#include <iostream>
#include <queue>
#include <cstdlib>
#include <vector>
#include <list>
using namespace std;
struct Node
{
int ID;
int Time;
int PageNum;
friend bool operator <(Node a,Node b)
{
return a.Time>b.Time;
}
};
int Size=1024;
int MAX=10000;
list<Node >lst;
void OutPut()
{
list<Node >::iterator it;
//cout<<"The Size is: "<<lst.size()<<endl;
for(it=lst.begin();it!=lst.end();it++)
cout<<"The address :"<<it->ID<<" PageNum :"<<it->PageNum<<endl;
}
int main()
{
int adress;
list<Node >::iterator it;
int K=1;
int cnt=4;
while(adress)
{
cin>>adress;
if(adress==0)
break;
int flag=0;
int ans=adress/Size;
for(it=lst.begin();it!=lst.end();it++)
{
if(it->PageNum==ans)
{
flag=1;
}
}
if(flag)
{
OutPut();
continue;
}
if(lst.size()==3)
{
cnt=lst.begin()->ID;
lst.erase(lst.begin());
}
Node s;
if(cnt>=3)
s.ID=K++;
else
s.ID=cnt;
s.Time=MAX--;
s.PageNum=ans;
lst.push_back(s);
OutPut();
}
system("pause");
return 0;
}