操作系统——请求分页

[问题描述]  设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值