在之前,笔者随意的用针对固定的三个页框的情况下写了一份儿基本代码,也就是熟悉一下算法原理,大家可以忽略。
这一次写的是实现用户对于页框数量实现自由的调控。
注意的是笔者使用的是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