目前只针对于三个页框的实现,笔者后续实现人页框的自由调整。
// 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;
}