// VC08---虚拟内存页面置换算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
const int MaxNumber=100;
int PageOrder[MaxNumber];//页面访问序列
int Simulate[MaxNumber][MaxNumber];//访问各个时刻物理块的记录
int PageCount[MaxNumber];//物理块
int PageNum,LackNum,blockNum;//PageNum页面个数,LackNum缺页数
double LackPageRate;//缺页率
bool found;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 初始化 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void initialization(){
cin>>blockNum;
cin>>PageNum;
for(int i=0;i<PageNum;cin>>PageOrder[i++]);
cout<<"初始化的页面访问序列"<<endl;
for(int i=0;i<PageNum;cout<<PageOrder[i++]<<" , ");
cout<<endl;
}
void display(){
int i=0,j=0;
for(i=0;i<PageNum;i++)
{ cout<<"第 "<<i+1<<" 次 : ";
for(j=0;j<blockNum;j++)
cout<<Simulate[i][j]<<" , ";
cout<<endl;
}
cout<<"LackNum : "<<LackNum<<endl;
cout<<"缺页率"<<LackNum<<"/"<<PageNum<<endl;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ FIFO(先进先出) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void FIFO(){
int next=0; LackNum=0;
int page_index=0;//页面在物理块中的存储下标;
int i,j;
for( i=0;i<PageNum;i++){
//判断所要的页面是否在页面中;
found=false;
for( j=0;j<next;j++)
{
if(Simulate[i-1][j]==PageOrder[i])
found=true;
}
//所需要的页面不在内存中;
if(!found){
//内存已满
if(next>=blockNum)
{
LackNum++;
//更新内存空间
for(j=0;j<blockNum;j++)
{if(j==page_index)Simulate[i][j]=PageOrder[i];
else Simulate[i][j]=Simulate[i-1][j];}
//寻找替换的页位置;
page_index=(page_index+1)%blockNum;
}
//内存还有空闲空间
else{
for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
Simulate[i][next++]=PageOrder[i];
}
}
else for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OPTimal(最佳置换) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OPT(){
int next=0; LackNum=0;
int page_index=0;//页面在物理块中的存储下标;
int page_distance=0;//后面第几个页面访问时才需要调度
int i,j,k;
bool zhaodao=false;
for( i=0;i<PageNum;i++){
//判断所要的页面是否在页面中;
found=false;
for( j=0;j<next;j++)
{
if(Simulate[i-1][j]==PageOrder[i])
found=true;
}
//所需要的页面不在内存中;
if(!found){
//内存已满
if(next>=blockNum)
{
LackNum++;
page_index=0; page_distance=0;
//寻找替换的页位置;
for(j=0;j<blockNum;j++){
for( k=i+1;k<PageNum;k++)
{
if(Simulate[i-1][j]==PageOrder[k])
{
if(k>page_distance)
{page_index=j;page_distance=k;}
zhaodao=true;break;
}
}
if(!zhaodao){page_index=j;page_distance=MaxNumber+1;break;}
zhaodao=false;
}
//更新内存空间
for(j=0;j<blockNum;j++)
{if(j==page_index)Simulate[i][j]=PageOrder[i];
else Simulate[i][j]=Simulate[i-1][j];}
}
//内存还有空闲空间
else{
for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
Simulate[i][next++]=PageOrder[i];
}
}
else for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ LRU(least recently used最近最久未使用) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void LRU(){
int next=0; LackNum=0;
int page_index=0;//页面在物理块中的存储下标;
int page_distance=0;//后面第几个页面访问时才需要调度
int i,j,k;
for( i=0;i<PageNum;i++){
//判断所要的页面是否在页面中;
found=false;
for( j=0;j<next;j++)
{
if(Simulate[i-1][j]==PageOrder[i])
found=true;
}
//所需要的页面不在内存中;
if(!found){
//内存已满
if(next>=blockNum)
{
LackNum++;
page_index=0; page_distance=i;
//寻找替换的页位置;
for(j=0;j<blockNum;j++){
for(k=i-1;k>=0;k--)
{
if(Simulate[i-1][j]==PageOrder[k])
{
if(k<page_distance)
{page_index=j;page_distance=k;}
break;
}
}
}
//更新内存空间
for(j=0;j<blockNum;j++)
{if(j==page_index)Simulate[i][j]=PageOrder[i];
else Simulate[i][j]=Simulate[i-1][j];}
}
//内存还有空闲空间
else{
for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
Simulate[i][next++]=PageOrder[i];
}
}
else for(j=0;j<next;j++){Simulate[i][j]=Simulate[i-1][j];}
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ main @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
int _tmain(int argc, _TCHAR* argv[])
{
int choice;
freopen("text.txt","rt",stdin);
initialization();
cout<<"block=== "<<blockNum<<endl;
while(cin>>choice){
if(choice==1){cout<<"FIFO(先进先出)算法"<<endl;FIFO();display();}
else if(choice==2){cout<<"Optimal(最佳置换)算法"<<endl;OPT();display();}
else if(choice==3){cout<<"LRU(least recently used最近最久未使用)算法"<<endl;LRU();display();}
else cout<<"输入选择算法的序号错误"<<endl;
}
return 0;
}
来源:https://www.cnblogs.com/hqu-ye/archive/2012/11/29/2795066.html