操作系统缺页中断FIFO、LRU、OPT算法实现(对于页框数量可以由用户调控)

在之前,笔者随意的用针对固定的三个页框的情况下写了一份儿基本代码,也就是熟悉一下算法原理,大家可以忽略。

这一次写的是实现用户对于页框数量实现自由的调控。

注意的是笔者使用的是C/C++的数组,所以为了避免麻烦,在代码开始写了一个#define max 5,当然对于这里的5大家可以自己调整,由于手中的测试数据是12个数的数组,所以这里对于很多循环中都直接用了12,这是可以自由更改的,大家需要的时候可以自己实现或者用参数传递。算法本身很简单,只要稍微注意一下细节就行。废话不多说,直接贴代码。

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

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

int checkPage(int page, int Page[], int k) {
	for (int i = 0;i < k;i++)
		if (page == Page[i])
			return i;
	return -1;
}

/*前向查找最近出现的页面*/
int frontSearchPage(int page, int i) {
	for (int j = 0;j < i;j++)
		if (page == pageList[j])
			return j;
	return i;
}

int backSearchPage(int page, int i) {
	for (int j = i;j >= 0;j--)
		if (page == pageList[j])
			return j;
	return -1;
}

/*在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) {
	int count = 0;
	for (int j = i;j >= 0;j--)
		if (pageList[j] == page)
			count++;
	return count;
}

/*打印算法*/
void display(int k, int *Spage[], int count, char empty[]) {
	cout << "List: \t";
	for (int i = 0;i < 12;i++)
		cout << pageList[i] << "\t";
	cout << endl;
	for (int i = 0;i < k;i++)
	{
		cout << "page" << i + 1 << ": \t";
		for (int j = 0;j < 12;j++) {
			if (Spage[i][j] != -1)
				cout << Spage[i][j] << "\t";
			else
				cout << "\t";
		}
		cout << endl;
	}
	cout << endl << "empty :\t";
	for (int i = 0;i < 12;i++)
		cout << empty[i] << "\t";
	cout << endl;
	cout << endl << "共缺页: " << count << "次" << endl;
}

/*先进先出算法*/
void FIFO(int k) {
	int page[max];
	int *sPage[max];
	for (int i = 0; i < max;i++) {
		if (i < k)
		{
			sPage[i] = new int[12];  //对使用的区域进行内存分配,可增加项则不考虑
			page[i] = -1;    //-1表示在本实验中需要用到的
		}
		else
			page[i] = -2;   //-2表示可增加项
	}
	int count = 0;
	char empty[12];
	for (int i = 0;i < 12;i++) {
		empty[i] = 'F';
		for (int j = 0;j < k;j++)
			sPage[j][i] = -1;
	}
	for (int i = 0;i < 12;i++) {
		int num = checkPage(pageList[i], page, k);
		if (num >= 0) {
			for (int j = 0;j < k;j++)
				sPage[j][i] = sPage[j][i - 1];
			continue;
		}
		else {
			for (int j = k - 1;j > 0;j--)
				page[j] = page[j - 1];
			page[0] = pageList[i];
			for (int j = 0;j < k;j++)
				sPage[j][i] = page[j];
			empty[i] = 'T';
			count++;
		}
	}
	display(k, sPage, count, empty);
}

/*OPT算法*/
void OPT(int k) {
	int page[max];
	int *sPage[max];
	int count = 0;
	char empty[12];
	for (int i = 0; i < max;i++) {
		if (i < k)
		{
			sPage[i] = new int[12];  //对使用的区域进行内存分配,可增加项则不考虑
			page[i] = -1;    //-1表示在本实验中需要用到的
		}
		else
			page[i] = -2;   //-2表示可增加项
	}
	for (int i = 0;i < 12;i++) {
		empty[i] = 'F';
		for (int j = 0;j < k;j++)
			sPage[j][i] = -1;
	}
	sPage[0][0] = pageList[0];
	page[0] = pageList[0];
	count++;
	empty[0] = 'T';
	for (int i = 1;i < 12;i++) {
		int num = checkPage(pageList[i], page, k);
		if (num >= 0) {
			for (int j = 0;j < k;j++)
				sPage[j][i] = sPage[j][i - 1];
			continue;
		}
		else {
			int j;
			for(j = 1;j < k;j++)
				if (page[j] == -1) {
					for (int l = j;l > 0;l--) {
						page[l] = page[l - 1];
						sPage[l][j] = page[l];
					}
					sPage[0][i] = pageList[i];
					page[0] = pageList[i];
					break;
				}
			if (j == k) {
				int pageLoc[max];
				for (int l = 0;l < k;l++) {
					pageLoc[l] = searchPage(page[l], i);
				}
				int far = 0;
				for (int l = 0;l < k;l++) {
					if (pageLoc[far] < pageLoc[l])
						far = l;
				}
				for (int l = far;l > 0;l--)
					page[l] = page[l - 1];
				page[0] = pageList[i];
				for (int l = 0;l < k;l++) {
					sPage[l][i] = page[l];
				}
			}
			count++;
			empty[i] = 'T';
		}
	}
	display(k, sPage, count, empty);
}

/*LRU算法*/

void LRU(int k) {
	int page[max];
	int *sPage[max];
	int count = 0;
	char empty[12];
	for (int i = 0; i < max;i++) {
		if (i < k)
		{
			sPage[i] = new int[12];  //对使用的区域进行内存分配,可增加项则不考虑
			page[i] = -1;    //-1表示在本实验中需要用到的
		}
		else
			page[i] = -2;   //-2表示可增加项
	}
	for (int i = 0;i < 12;i++) {
		empty[i] = 'F';
		for (int j = 0;j < k;j++)
			sPage[j][i] = -1;
	}
	sPage[0][0] = pageList[0];
	page[0] = pageList[0];
	count++;
	empty[0] = 'T';
	for (int i = 1;i < 12;i++) {
		int countpage[max];
		int num = checkPage(pageList[i], page, k);
		if (num >= 0) { //页面处于该队列中
			for (int j = 0;j < k;j++)
				sPage[j][i] = sPage[j][i - 1];
			for (int l = 0; l < k && sPage[l][i] != -1;l++) {
				for (int j = 0;j < k && sPage[j][i] != -1;j++) {
					int d1 = backSearchPage(page[l], i);
					int d2 = backSearchPage(page[j], i);
					if (d1 > d2) {
						int temp = page[l];
						page[l] = page[j];
						page[j] = temp;
					}
				}
			}
			for (int l = 0;l < k;l++)
				sPage[l][i] = page[l];
			continue;
		}
		else {
			count++;
			empty[i] = 'T';
			//对原始队列中的页面按照顺序排列:
			//排序机制:1.让出现次数较多的排在前列,2.在同等次数的情况下,让最后一次出现靠后的排在前列
			for (int l = 0;l < k && sPage[l][i] != -1;l++)
				countpage[l] = countPage(page[l], i);
			int far = 0;
			for (int l = 0; l < k && sPage[l][i] != -1;l++) {
				for (int j = 0;j < k && sPage[j][i] != -1;j++) {
					if (countpage[l] < countpage[j]) {
						int temp = page[l];
						page[l] = page[j];
						page[j] = temp;
					}
					else if (countpage[l] == countpage[j]) {
						int d1 = frontSearchPage(page[l], i);
						int d2 = frontSearchPage(page[j], i);
						if (d1 < d2) {
							int temp = page[l];
							page[l] = page[j];
							page[j] = temp;
						}
					}
				}
			}
			for (int l = k - 1;l > 0;l--)
				page[l] = page[l - 1];
			page[0] = pageList[i];
			for (int l = 0;l < k;l++)
				sPage[l][i] = page[l];

		}
	}
	display(k, sPage, count, empty);
}


int main()
{
	int k;
	while (1) {
		cout << "输入需要的页框数(max = 5,输入6退出): ";
		cin >> k;
		if (k == 6) {
			cout << "感谢使用" << endl;
			exit(0);
		}
		else {
			cout << "FIFO算法: " << endl;
			FIFO(k);
			cout << endl;
			cout << "OPT算法: " << endl;
			OPT(k);
			cout << endl;
			cout << "LRU算法: " << endl;
			LRU(k);
		}
	}
    return 0;
}

                                                                 尊重原作,转载请注明,转载自:https://blog.csdn.net/kr2563

おすすめ

転載: blog.csdn.net/kr2563/article/details/84328109