今天,第一次写博客,有点小激动。
这次的题目是页式存储管理,要求输入内存页面数,进程访问序列个数以及进程的页号,根据FIFO算法求出淘汰页号,缺页页号,缺页次数,缺页率,默认内存3个物理块,且是单进程。本次实验用到了队列,将物理块中页号,淘汰的页号,缺页号压入队列,最后打印出来,并根据缺页队列长度计算缺页率。
#include <iostream>
#include<queue>
using namespace std;
int main(){
//输入内存页面数,进程访问序列个数以及进程的页号,根据FIFO算法求出淘汰页号,缺页页号,缺页次数,缺页率
//默认内存有3个物理块,单进程
queue<int> pro; //物理块队列
queue<int> th; //淘汰队列
queue<int> nopage;//缺页队列
int page, num,nopagenum;
cout << "请输入内存页面数:";
cin >> page;
cout << endl;
cout << "请输入进程访问序列的个数:";
cin >> num;
cout << endl;
int *process;
process = new int[num];
cout << "请依次输入进程的页号:";
for (int i = 0; i < num; i++){
cin >> process[i];
}
cout << endl;
//FIFO算法
int a = process[0];
int b = process[1];
int c = process[2];
pro.push(a);
pro.push(b);
pro.push(c);
//缺页处理
for (int i = 3; i < num; i++){
if (process[i] != a && process[i] != b && process[i] != c){
pro.pop(); //淘汰物理块队列中队首元素,队首是最先进来的,因此最先淘汰
pro.push(process[i]); //将缺页号压入物理块队列队尾,这是此时3个物理块中的页号
th.push(a); //将淘汰页号压入淘汰队列
a = b;
b = c;
c = process[i];
nopage.push(process[i]);//将缺页号压入缺页队列
}
}
nopagenum = nopage.size()+3; //接下来要返回缺页队列队首元素并删除,删除后队列为空,
//因此要先取出该队列长度 ,最先访问3个页号时,物理块为空,因此缺页次数+3
cout << "淘汰的页号依次为:";
while (!th.empty()){
cout << th.front() << " ";//依次返回淘汰队列队首元素,队首是最先从物理块中淘汰的
th.pop(); //将刚才的队首删除,使得队首后面的元素成为队首
}
cout << endl;
cout << "缺页的页号依次为:" << process[0] << " " << process[1] << " " << process[2] << " ";
while (!nopage.empty()){
cout << nopage.front() << " ";//依次返回缺页队列队首元素
nopage.pop();
}
cout << endl;
cout << "缺页次数为:" << nopagenum << endl;
cout << "缺页率为:" << nopagenum /(double) num<<endl;
system("pause");
return 0;
}