页面置换算法OPT+FIFO+LRU+clock

时间:2025-05-14

C语言版页面置换算法OPT+FIFO+LRU+clock

#include<iostream>

#include<fstream>

using namespace std;

#define BlockSize 10

#define PageSize 100

int page[PageSize]; //页面数组存放页面

int block[BlockSize]; //物理块数组

int result[PageSize][BlockSize]; //存放页面和物理块二维数组

int pSize = 0; //用户使用页面数

int bSize = 0; //用户使用物理块数

int blockFlag[BlockSize]; //用于LRU与最佳置换算法中,辅助判断该换出的页面 int noPageCount = 0; //缺页次数

//输入数据

void inputData()

{

cout<<endl<<"请输入物理块数(1<=bSize<="<<BlockSize<<')'<<endl;

cin>>bSize;

cout<<"请输入页面数 (1<=pSize<="<<PageSize<<')'<<endl;

cin>>pSize;

while(bSize<=0||bSize>BlockSize||pSize<=0||pSize>PageSize){//判断用户输入是否在范围内

cout<<"输入范围错误,请重新输入:"<<endl;

cout<<"请输入物理块数(1<=F<="<<BlockSize<<')';

cin>>bSize;

cout<<endl<<"请输入页面数 (1<=p<="<<PageSize<<')';

cin>>pSize;

}

cout<<"请输入页面走向"<<endl;

for(int i = 0;i <pSize;i++)

cin>>page[i];

}

//初始化page数组

void initPage()

{

for(int i = 0;i<PageSize;i++)

page[i] = -1;

}

//初始化block与result数组

void initBlockResult()

{

C语言版页面置换算法OPT+FIFO+LRU+clock

int i = 0;

for(i = 0;i<BlockSize;i++)

block[i] = -1;

for(i = 0;i < PageSize;i++)

for(int j = 0; j < BlockSize;j++)

result[i][j] = -1;

}

//查找物理块中是否存在要调用的页面

int Exist(int i)

{

for(int j = 0;j < bSize;j++)

if(block[j] == i)

return j;

return -1;

}

//显示结果

void display(int noPageCount)

{

for(int i =0 ;i < pSize;i++)

{

cout<<" "<<page[i]<<" ";

for(int j = 0;j < bSize;j++)

{

if(result[i][j] == -1) break;

else cout<<'['<<result[i][j]<<']'<<' ';

}

cout<<endl;

}

cout<<"____________________________________"<<endl;

cout<<endl<<"缺页次数:"<<noPageCount<<endl;

cout<<"缺页率:"<<((double)noPageCount/pSize)*100<<'%'<<endl;

cout<<"===================================="<<endl;

}

//最佳置换算法OPT

void OPT()

{

int i = 0,j = 0;

int position = 0,noPageCount = 0;

int pageFlag = 0,resultFlag = 0; //页面标记(下标)指向下一个页面,结果标记表示结果的行,即result数组的行标

for(i = 0;i < BlockSize;i++)

C语言版页面置换算法OPT+FIFO+LRU+clock

blockFlag[i] = 0; while(pageFlag < pSize) { if(Exist(page[pageFlag]) != -1) //判断页面是否已经存在 resultFlag++; else { if(position < bSize) //判断有无空闲物理块 { //若有则将页面放入空闲块 block[position] = page[pageFlag]; position++; noPageCount++; for(i = 0;i < position;i++) result[resultFlag][i] = block[i]; resultFlag++; } else{ for(i = 0;i < bSize;i++) { for(j = pageFlag+1;j < pSize;j++) { if(block[i] == page[j]) { blockFlag[i] = j; break; } } if(j == pSize) blockFlag[i] = 999; } int optPos = 0,max = blockFlag[0]; for(int i = 0;i < bSize;i++) if(max < blockFlag[i]) { max = blockFlag[i]; optPos = i; } block[optPos] = page[pageFlag]; noPageCount++; for(i = 0;i < bSize;i++) result[resultFlag][i] = block[i]; resultFlag++; } } pageFlag++;

C语言版页面置换算法OPT+FIFO+LRU+clock

}

cout<<endl<<"最佳置换算法:"<<endl;

display(noPageCount);

return;

}

//先进先出页面置换算法FIFO

void FIFO()

{

int blockFlag = 0,pageFlag = 0,resultFlag = 0; //物理块标记,确定该换出的物理块下标 int i = 0,j = 0,noPageCount = 0;

int position = 0; //指示物理块,查找有无空闲

while (pageFlag < pSize)

{

if(Exist(page[pageFlag]) != -1)

resultFlag++;

else

{

if(position < bSize)

{

block[position] = page[pageFlag];

position++;

noPageCount++;

for(i = 0;i <= position;i++)

result[resultFlag][i] = block[i];

resultFlag++;

}

else

{

block[blockFlag] = page[pageFlag]; //blockFlag指示要换出的页面 noPageCount++;

for(i = 0;i < bSize;i++)

result[resultFlag][i] = block[i];

resultFlag++;

blockFlag++;

blockFlag = blockFlag % bSize;

}

}

pageFlag++;

}

cout<<endl<<"先进先出页面置换算法FIFO:"<<endl;

display(noPageCount);

return;

C语言版页面置换算法OPT+FIFO+LRU+clock

}

//最近最久未用算法LRU

void LRU()

{

int i = 0,noPageCount = 0;

int pageFlag = 0,resultFlag = 0,position = 0;

for(i = 0;i < BlockSize;i++) //初始化时间记录数组

blockFlag[i] = 0;

while(pageFlag < pSize)

{

…… 此处隐藏:3502字,全部文档内容请下载后查看。喜欢就下载吧 ……

页面置换算法OPT+FIFO+LRU+clock.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219