关于页面置换算法的理论知识:
C++代码实现(未优化)
#include
#include
#include
using namespace std;
int frame_length;//帧个数
int string_length;
char *st;//串
int Max(int *st,int length)
{
int max = st[0];
int max_index=0;
for(int i=1;i
{
if(max
{
max = st[i];
max_index = i;
}
}
return max_index;
}
int Far(char *frame,char *st,int i,int string_length)
{
int len1 = strlen(frame);
int len2 = string_length;
int *distances;
distances = new int[len1];//储存各帧到下一个相同字符的距离
for(int j=0;j
distances[j]=65535;
for(int k=0;k
{
for(int j=i+1;j
{
if(st[j]==frame[k])
distances[k]=j-i;
}
}
return Max(distances,len1);
}
int Past(char *frame,char *st,int i,int string_length)
{
int len1 = strlen(frame);
int len2 = string_length;
int *distances;
distances = new int[len1];//储存各帧到下一个相同字符的距离
for(int j=0;j
distances[j]=65535;
for(int k=0;k
{
for(int j=i-1;j>=0&&(distances[k]==65535);j--)
{
if(st[j]==frame[k])
distances[k]=i-j;
}
}
return Max(distances,len1);
}
void FIFO(char *st,int frame_length,int string_length)
{
int len=string_length;
char *frame;
int *life;
int misno = 0; //错误次数
frame = new char[frame_length+1];//页帧
life = new int[frame_length];//各帧的占用时间
for(int i=0;i
life[i] = 0;
cout<
for(int i=0;i
{
misno++;
frame[i] = st[i];
cout<
for(int j=0;j
{
if(j<=i)
{
cout<
life[j]++;
}
else
cout<
}
cout<
}
int flag;
for(int i=frame_length;i
{
flag = 0;//flag判断引用字符是否在内存中
for(int j=0;j
{
if(st[i]==frame[j])
flag=1;//引用已经在内存中,结束循环
}
if(!flag)//引用字符不在内存中
{
int max = Max(life,frame_length);//选出最旧的帧
frame[max] = st[i];
life[max] = 0;
for(int j=0;j
life[j]++;
misno++;
cout<
for(int j=0;j
cout<
cout<
}
else
{
for(int j=0;j
life[j]++;
flag = 0;
cout<
}
}
cout<
}
void OPT(char *st,int frame_length,int string_length)
{
int len=string_length;
char *frame;
int *life;
int misno = 0; //错误次数
frame = new char[frame_length+1];//页帧
cout<
for(int i=0;i
{
misno++;
frame[i] = st[i];
cout<
for(int j=0;j
{
if(j<=i)
{
cout<
}
else
cout<
}
cout<
}
int flag;
for(int i=frame_length;i
{
flag = 0;//flag判断引用字符是否在内存中
for(int j=0;j
{
if(st[i]==frame[j])
flag=1;//引用已经在内存中,结束循环
}
if(!flag)//引用字符不在内存中
{
int max = Far(frame,st,i,string_length);//选出离得最远的帧
frame[max] = st[i];
misno++;
cout<
for(int j=0;j
cout<
cout<
}
else
{
flag = 0;
cout<
}
}
cout<
}
void LRU(char *st,int frame_length,int string_length)
{
int len=string_length;
char *frame;
int misno = 0; //错误次数
frame = new char[frame_length+1];//页帧
cout<
for(int i=0;i
{
misno++;
frame[i] = st[i];
cout<
for(int j=0;j
{
if(j<=i)
{
cout<
}
else
cout<
}
cout<
}
int flag;
for(int i=frame_length;i
{
flag = 0;//flag判断引用字符是否在内存中
for(int j=0;j
{
if(st[i]==frame[j])
flag=1;//引用已经在内存中,结束循环
}
if(!flag)//引用字符不在内存中
{
int max = Past(frame,st,i,string_length);//选出离得最远的帧
frame[max] = st[i];
misno++;
cout<
for(int j=0;j
cout<
cout<
}
else
{
flag = 0;
cout<
}
}
cout<
}
int main()
{
ifstream infile("page.txt");
infile>>frame_length;
infile>>string_length;
st = new char[string_length+1];
for(int i=0;i
{
infile>>st[i];
}
cout<
FIFO(st,frame_length,string_length);
cout<
LRU(st,frame_length,string_length);
cout<
OPT(st,frame_length,string_length);
cout<
return 0;
}
原文:https://www.cnblogs.com/Yindehao/p/13034636.html