文章目录
- 实验目的和要求
- 实验内容
- 实验原理
- 系统实现
- main
- date.txt
- 结果展示
- 总结:
- 代码
- PageRep.h
- main.cpp
实验目的和要求
(1) 加深对页面置换的概念和算法的理解
(2) 深入了解FIFO、LRU页面置换算法
实验内容
在集成开发环境下使用C++语言设计并实现FIFO、LRU页面置换算法,并进行相应的测试。
实验原理
(1) 分别实现FIFO、LRU页面置换算法;
(2) 页面序列从指定的文本文件data.txt中取出;
(3) 输出:第一行为每次淘汰的页面号,第二行显示缺页的总次数。
系统实现
(1) 定义一个PageRep类,包含属性:页号、缺页次数,内存页面队列,指向队列的收尾指针,记录每个页项有多久未被访问的数组
class PageRep {
private:
int pagNum; //页号
int sum = 0; //缺页次数
int buff[N]; //内存页面队列
int front, tail; //队列指针
int buff_flag[N]; //记录每个页项有多久未被访问
public:
PageRep(){//初始化构造函数
for (int i = 0; i != N; ++i) {
buff[i] = -1;
buff_flag[i] = 0;
}
front = tail = 0;
}
bool FIFO(ifstream&);//FIFO算法
int add();//给buff_flag数组每个页项加1,返回页项最大数的下标
bool LRU(ifstream& ); //LRU算法
};
(2) 具体过程可包括:创建输入流对象,并打开文件,由用户选择算法,模拟模拟算法调度过程
(3) main函数流程
main
int main() {
int n;
do {
ifstream input;
input.open("data.txt");
PageRep pagereq;
cout << "选FIFO算法按1,LRU算法按2,退出按3" << endl;
cin >> n;
switch (n) {
case 1:
pagereq.FIFO(input); break;
case 2:
pagereq.LRU(input); break;
}
if (n == 3)
break;
} while (true);
return 0;
date.txt
1 13 13 1 2 5 9 4 6 2 3 5 4 4 2 2 2 3 5 4 11 6 8 9 5 2 33 6 5 1 2 3 21 3 5 15 41 54 51 451 5 41 51 51 5 151 516 641 65 61
结果展示
总结:
FIFO、LRU每种算法都有各自的优缺点, FIFO算法与进程实际运行的规律不相适用,LRU算法这是根据页面调入内存后的使用情
此次试验是用c++做的,这次课程设计我最大的收获是学以致用,通过查阅资料,复习之前遗忘的知识点,学习新的知识。通过这次试验让我们对操作系统的页面置换算法有了更深入的了解
代码
PageRep.h
#pragma once
#include <iostream>
#include <fstream>
const int N = 10;
using std::cout;
using std::endl;
using std::ifstream;
class PageRep {
private:
int pagNum; //页号
int sum = 0; //缺页次数
int buff[N]; //内存页面队列
int front, tail; //队列指针
int buff_flag[N]; //记录每个页项有多久未被访问
public:
PageRep() {
for (int i = 0; i != N; ++i) {
buff[i] = -1;
buff_flag[i] = 0;
}
front = tail = 0;
}
bool FIFO(ifstream&);
int add();
bool LRU(ifstream&);
};
bool PageRep::FIFO(ifstream& input) {
while (input >> pagNum) {
int flag = 0;
for (int i = front; i != tail; i = (i + 1) % N) {
if (buff[i] == pagNum) {
//如果内存中存在该页号则flag=1;
flag = 1;
break;
}
}
// 内存页面存满
if (flag == 0 && buff[N - 1] != -1) {
cout << buff[front] << " ";
buff[tail] = pagNum;
front = (front + 1) % N;
tail = (tail + 1) % N;
++sum;
}
// 内存页面未存满
if (flag == 0 && buff[N - 1] == -1) {
buff[tail] = pagNum;
tail = (tail + 1) % N;
}
}
cout << endl;
cout << sum << endl;
return 0;
}
int PageRep::add() {
int tmp = -1;
for (int i = 0; i != N; ++i) {
if (buff[i] != -1) {
++buff_flag[i];
tmp = tmp > buff_flag[i] ? tmp : i;
}
}
return tmp;
}
bool PageRep::LRU(ifstream& input) {
while (input >> pagNum) {
int flag = 0;
static int num = 0;
//遍历所有内存中的页表,若pagNum存在内存中则flag=1;
for (int i = 0; i != N; ++i) {
if (buff[i] == pagNum) {
buff_flag[i] = 0;
add();
flag = 1;
break;
}
}
//若页表不存在内存中,且内存已满
if (flag == 0 && buff[N - 1] != -1) {
num = add();
cout << buff[num] << " ";
buff[num] = pagNum;
buff_flag[tail] = 1;
++sum;
}
若页表不存在内存中,且内存未满
if (flag == 0 && buff[N - 1] == -1) {
int tmp = 0;
while (tmp < N) {
if (buff[tmp] == -1)
break;
tmp++;
}
buff[tmp] = pagNum;
buff_flag[tmp] = 0;
add();
}
}
cout << endl;
cout << sum << endl;
return 0;
}
main.cpp
#include <iostream>
#include "PageRep.h"
using namespace std;
int main() {
int n;
do {
ifstream input;
input.open("data.txt");
PageRep pagereq;
cout << "选FIFO算法按1,LRU算法按2,退出按3" << endl;
cin >> n;
switch (n) {
case 1:
pagereq.FIFO(input); break;
case 2:
pagereq.LRU(input); break;
}
if (n == 3)
break;
} while (true);
return 0;
}