操作系统缺页中断-FIFO、LRU、OPT算法实现

目前只针对于三个页框的实现,笔者后续实现人页框的自由调整。

// Exercise4.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
int pageList[12] = {4,3,2,1,4,3,5,4,3,2,1,5};

/*检测该页号是否已经存入*/
int checkPage(int num, int page1, int page2, int page3) {
	if (num == page1)
		return 1;
	else if (num == page2)
		return 2;
	else if (num == page3)
		return 3;
	else
		return 0;
}

/*在pageList中查找一个页面*/
int searchPage(int page, int i) {
	i++;
	for(;i < 12;i++)
		if (pageList[i] == page) {
			return i;
		}
	return 999;
}

/*在pageList中统计页面出现的次数*/
int countPage(int page, int i) {
	for (int j = i;j >= 0;j--)
		if (pageList[j] == page)
			return j;
	return -1;
}


/*打印*/
void display(int sPage1[], int sPage2[], int sPage3[], char empty[], int count) {
	cout << "Page:  ";
	for (int i = 0;i < 12;i++)
		cout << pageList[i] << "\t";
	cout << endl;
	cout << "page1: ";
	for (int i = 0;i < 12;i++) {
		if (sPage1[i] == -1)
			cout << "\t";
		else
			cout << sPage1[i] << "\t";
	}
	cout << endl;
	cout << "page2: ";
	for (int i = 0;i < 12;i++) {
		if (sPage2[i] == -1)
			cout << "    \t";
		else
			cout << sPage2[i] << "\t";
	}
	cout << endl;
	cout << "page3: ";
	for (int i = 0;i < 12;i++) {
		if (sPage3[i] == -1)
			cout << "    \t";
		else
			cout << sPage3[i] << "\t";
	}
	cout << endl;
	cout << "缺页否: ";
	for (int i = 0;i < 12;i++) {
		cout << empty[i] << "\t";
	}
	cout << endl;
	cout << "共缺页: " << count << "次" << endl;
}

/*先进先出算法*/
void FIFO() {
	int page1 = -1, page2 = -1, page3 = -1;
	int sPage1[12], sPage2[12], sPage3[12];
	int count = 0;
	char empty[12];
	for (int i = 0;i < 12;i++) {  
		empty[i] = 'F';
		sPage1[i] = -1;
		sPage2[i] = -1;
		sPage3[i] = -1;
	}
	for (int i = 0;i < 12;i++) {
		int num = checkPage(pageList[i], page1, page2, page3);
		if (num >= 1) {
			sPage1[i] = page1;
			sPage2[i] = page2;
			sPage3[i] = page3;
			continue;
		}
		else {
			page3 = page2;
			page2 = page1;
			page1 = pageList[i];
			empty[i] = 'T';
			count++;
		}
		sPage1[i] = page1;
		sPage2[i] = page2;
		sPage3[i] = page3;
	}
	display(sPage1, sPage2, sPage3, empty, count);
}

/*OPT算法*/
void OPT() {
	int page1 = -1, page2 = -1, page3 = -1;
	int sPage1[12], sPage2[12], sPage3[12];
	int count = 0;
	char empty[12];
	for (int i = 0;i < 12;i++) {
		empty[i] = 'F';
		sPage1[i] = -1;
		sPage2[i] = -1;
		sPage3[i] = -1;
	}
	sPage1[0] = pageList[0];
	page1 = pageList[0];
	count++;
	empty[0] = 'T';
	for (int i = 1;i < 12;i++) {
		int num = checkPage(pageList[i], page1, page2, page3);
		if (num >= 1) {
			sPage1[i] = page1;
			sPage2[i] = page2;
			sPage3[i] = page3;
		}
		else {
			if (page2 == -1) {
				sPage1[i] = pageList[i];
				sPage2[i] = page1;
				page2 = page1;
				page1 = pageList[i];
			}
			else if (page2 != -1 && page3 == -1) {
				sPage3[i] = page2;
				page3 = page2;
				sPage2[i] = page1;
				page2 = page1;
				sPage1[i] = pageList[i];
				page1 = pageList[i];
			}
			else if (page1 != -1 && page2 != -1 && page3 != -1) {
				int locPage1 = searchPage(page1, i);
				int locPage2 = searchPage(page2, i);
				int locPage3 = searchPage(page3, i);
				struct cal {
					int loc;
					int page;
				};
				cal temp[3];
				temp[0].loc = locPage1;
				temp[0].page = page1;
				temp[1].loc = locPage2;
				temp[1].page = page2;
				temp[2].loc = locPage3;
				temp[2].page = page3;
				for(int l = 0;l < 3;l++)
					for (int k = 0;k < 3;k++) {
						if (temp[l].loc > temp[k].loc) {
							cal use;
							use = temp[l];
							temp[l] = temp[k];
							temp[k] = use;
						}
					}
				page1 = pageList[i];
				page2 = temp[1].page;
				page3 = temp[2].page;
				sPage1[i] = page1;
				sPage2[i] = page2;
				sPage3[i] = page3;
			}
			count++;
			empty[i] = 'T';
		}
	}
	display(sPage1, sPage2, sPage3, empty, count);
}

/*LRU算法*/
void LRU() {
	int page1 = -1, page2 = -1, page3 = -1;
	int sPage1[12], sPage2[12], sPage3[12];
	int count = 0;
	char empty[12];
	for (int i = 0;i < 12;i++) {
		empty[i] = 'F';
		sPage1[i] = -1;
		sPage2[i] = -1;
		sPage3[i] = -1;
	}
	//第一页默认存入sPage[0]
	sPage1[0] = pageList[0];
	page1 = pageList[0];
	count++;
	empty[0] = 'T';
	for (int i = 1;i < 12;i++) {
		int num = checkPage(pageList[i], page1, page2, page3);
		if (num >= 1) {
			sPage1[i] = page1;
			sPage2[i] = page2;
			sPage3[i] = page3;
		}
		else {
			//如果还有空闲区域
			if (page2 == -1) {
				page2 = page1;
				sPage2[i] = page2;
				page1 = pageList[i];
				sPage1[i] = pageList[i];
			}
			else if (page3 == -1 && page2 != -1) {
				sPage3[i] = page2;
				page3 = page2;
				sPage2[i] = page1;
				page2 = page1;
				sPage1[i] = pageList[i];
				page1 = pageList[i];
			}
			else if (page3 != -1 && page2 != -1 && page1 != -1) {
				//先存入在调整顺序
				page3 = page2;
				page2 = page1;
				page1 = pageList[i];
			}
			count++;
			empty[i] = 'T';
		}
		int cPage1 = countPage(page1, i);
		int cPage2 = countPage(page2, i);
		int cPage3 = countPage(page3, i);
		struct cal {
			int page;
			int count;
		};
		cal temp[3];
		temp[0].count = cPage1;
		temp[0].page = page1;
		temp[1].count = cPage2;
		temp[1].page = page2;
		temp[2].count = cPage3;
		temp[2].page = page3;
		for (int k = 0;k < 3;k++) {
			for (int l = 0;l < 3;l++)
				if (temp[k].count > temp[l].count) {
					cal node;
					node = temp[k];
					temp[k] = temp[l];
					temp[l] = node;
				}
		}
		page1 = temp[0].page;
		page2 = temp[1].page;
		page3 = temp[2].page;
		sPage1[i] = page1;
		sPage2[i] = page2;
		sPage3[i] = page3;
	}
	display(sPage1, sPage2, sPage3, empty, count);
}


int main()
{
	cout << "FIFO算法: " << endl;
	FIFO();
	cout << endl;
	cout << "OPT算法: " << endl;
	OPT();
	cout << endl;
	cout << "LRU算法: " << endl;
	LRU();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/kr2563/article/details/84207220