先进先出页面置换算法模拟
时间限制: 1 Sec 内存限制: 128 MB
题目描述
一、实验目的
1、加深理解先进先出页面置换算法及相关概念。
2、掌握描述页面置换算法的置换图(教材p175图5-3)。
3、会计算缺页率。
二、实验原理
1、进程的页面数目往往远大于操作系统分配给该进程的页框(物理块)数目,因此,往往只有部分页面能够装入页框中。
2、当进程调用 1 个页面时,有可能出现该页面不在页框中,这就需要一种算法决定淘汰哪一个页框中的页面,以加载新调用的页面到该页框中。
3、先进先出页面置换算法淘汰在主存中居留最长时间的页面,理由是:最早加载到页框中的页,其不再被访问的可能性最大。
三、实验要求
1、用C++语言编写程序,模拟先进先出页面置换算法。
2、main 函数及部分代码已编写如下,只需由你编写 fifo 函数并提交(只提交 fifo 函数实现代码)。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
// fifo 函数声明
// 输入参数描述:
// pageframeNum:操作系统分配给某进程的页框数目;
// pageCallSequence:页面调用序列,序列中的每一项是被调用页面的页面号。
void fifo(int pageframeNum, vector<int> &pageCallSequence);
int main()
{
int i, pageframeNum, n;
cin>>pageframeNum; // 输入分配给某进程的页框数目(教材上称“页框”为:物理块)
cin>>n; // 输入该进程的页面调用序列的长度
vector<int> pageCallSequence(n); // 定义页面调用序列,序列中的每一项是被调用页面的页面号
for(i = 0; i < n; i++) // 输入 n 个页面号,构建页面调用序列
{
cin>>pageCallSequence[i];
}
fifo(pageframeNum, pageCallSequence); // 模拟先进先出页面置换算法
return 0;
}
3、在 fifo 函数中,实现:每次访问页面时,依页框编号的次序输出页框中的页面编号;计算并输出缺页率。
4、输入输出格式见样例输入和样例输出。在样例输出中:除最后一行之外,每一行是依页框编号的次序输出页框中的页面编号,如果尚未加载页面到页框,则输出-1;最后一行是缺页率,保留三位有效数字。
输入
3 12
4 3 2 1 4 3 5 4 3 2 1 5
输出
4,-1,-1
4,3,-1
4,3,2
1,3,2
1,4,2
1,4,3
5,4,3
5,4,3
5,4,3
5,2,3
5,2,1
5,2,1
0.750
样例输入
5 20 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
样例输出
7,-1,-1,-1,-1 7,0,-1,-1,-1 7,0,1,-1,-1 7,0,1,2,-1 7,0,1,2,-1 7,0,1,2,3 7,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,0,1,2,3 4,7,1,2,3 4,7,0,2,3 4,7,0,1,3 0.450 就是是纯模拟,没什么难度
代码如下
#include<iostream>
#include<vector>
using namespace std;
void fifo(int pageframeNum, vector<int> &pageCallSequence)
{
int i, j, k;
const int M = pageCallSequence.size();
const int N = pageframeNum;
bool T = 0; //标记位
int *a =new int[N]; //动态数组
float s;
for (i = 0; i<N; i++)
{
a[i] = -1;
}
k =0;
for (j = 0; j<M; j++)
{
T = 0; //调入新页面之前默认该页面不在内存中
for (i = 0; i<N; i++)
if (pageCallSequence[j] == a[i])//如果调用的页面已存在内存中 标记位 置1,否则置0
{
T = 1;
break;
}
if (T == 1) //如果页面已经存在于内存中 则输出 当下内存中的页面号
{
for (i = 0; i < N; i++)
{
if (i==N-1)
printf("%d", a[i]);
else
printf("%d,", a[i]);
}
}
else //如果该页面不在内存中,则替换掉进入内存时间最长的页面
{
a[k%N] = pageCallSequence[j]; //实现先进先出的的代码
k++; //记录页面置换次数
for (i = 0; i<N; i++)
{
if (i ==N - 1)
printf("%d", a[i]);
else
printf("%d,", a[i]);
}
}
printf("\n");
}
s =1.0*k/M;
printf("%0.3f\n", s);
delete a;
}
int main()
{
int i, pageframeNum, n;
cin >> pageframeNum; // 输入分配给某进程的页框数目(教材上称“页框”为:物理块)
cin >> n; // 输入该进程的页面调用序列的长度
vector<int> pageCallSequence(n); // 定义页面调用序列,序列中的每一项是被调用页面的页面号
for (i = 0; i < n; i++) // 输入 n 个页面号,构建页面调用序列
{
cin >> pageCallSequence[i];
}
fifo(pageframeNum, pageCallSequence); // 模拟先进先出页面置换算法
//system("pause");
return 0;
}