实 验3: 页式虚拟存储管理程序模拟
实验目的: 编写程序来模拟计算机的两种调度方式:
(1)先进先出算法
(2)最近最少使用算法
程序设计
FIFO()
FIFO()
LRU()
Msize加1
S=?
用户内存空间msize=2
Msize≤32
是否用其他算法继续
结 束
N
Y
1
2
Y
N
提示出错,重新输入
输入算法号S
1≤S≤4
开 始
生成地址流
形成地址页号
FIFO页面置换算法
1在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先运行的AP个页面放入内存。
2这时有需要处理新的页面,则将原来内存中的AP个页面最先进入的调出(是以称为FIFO),然后将新页面放入。
3以后如果再有新页面需要调入,则都按2的规则进行。
算法特点:所使用的内存页面构成一个队列。
LRU页面置换算法
1当分配内存页面数(AP)小于进程页面数(PP)时,当然是把最先执行的AP个页面放入内存。
2当需要调页面进入内存,而当前分配的内存页面全部不空闲时,选择将其中最长时间没有用到的那个页面调出,以空出内存来放置新调入的页面(称为LRU)。
算法特点:每个页面都有属性来表示有多长时间未被CPU使用的信息。
结果分析
#include
#include
using namespace std;
const int MaxNum=320;//指令数
const int M=5;//内存容量
int PageOrder[MaxNum];//页面请求
int Simulate[MaxNum][M];//页面访问过程
int PageCount[M],LackNum;//PageCount用来记录LRU算法中最久未使用时间,LackNum记录缺页数
float PageRate;//命中率
int PageCount1[32];
bool IsExit(int i)//FIFO算法中判断新的页面请求是否在内存中
{ bool f=false;
for(int j=0;j
{if(Simulate[i-1][j]==PageOrder[i])//在前一次页面请求过程中寻找是否存在新的页面请求
{ f=true; }
}
return f;
}
int IsExitLRU(int i)//LRU算法中判断新的页面请求是否在内存中
{int f=-1;
for(int j=0;j
{if(Simulate[i-1][j]==PageOrder[i])
{ f=j; }
}
return f;
}
int Compare()//LRU算法找出内存中需要置换出来的页面
{ int p,q;
p=PageCount[0];
q=0;
for(int i=1;i
{if(p
{p=PageCount[i];
q=i; }
}
return q;
}
void Init() //初始化页框
{for(int k=0;k
{int n=rand()%320;//随机数产生320次指令
PageOrder[k]=n/10;//根据指令产生320次页面请求}
for(int i=0;i
{ for(int j=0;j
{ Simulate[i][j]=-1; }
}
for(int q=0;q
{PageCount[q]=0; }
}
void OutPut()//输出
{int i,j;
cout<
for(j=0;j
{cout<
cout<
cout<
for(i=0;i<10;i++)
{for(j=0;j
{if(Simulate[i][j]==-1)
cout<
else
cout<
}
cout<
}
cout<
cout<
cout<
}
void FIFO()//FIFO算法
{int j,x=0,y=0;
LackNum=0,
Init();
for(j=0;j