文章目录

  • 实验目的和要求
  • 实验内容
  • 实验原理
  • 系统实现
  • 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

FIFO页面置换算法代码Python fifo页面置换算法实验报告_c++

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页面置换算法代码Python fifo页面置换算法实验报告_队列_02

总结:

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;
}