📄 pagemetathesisdlg.cpp
字号:
// PageMetathesisDlg.cpp : implementation file
#include "stdafx.h"
#include "PageMetathesis.h"
#include "PageMetathesisDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#define max_num 30
int num_array[max_num]; //用来放置页面号序列的整型数组
int point_array; //实际输入的总页面数
int num_fail,phi[9],priority[9];
bool metathesis,space;
CString str,memo,sernum;
char CSnum[2];
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
BOOL CPageMetathesisDlg::apart()
{
int inte=0;
num_fail=0;
UpdateData(TRUE);
sernum=m_sernum;
for(int i=0;i<max_num;i++) num_array[i]=-1;
point_array=0;
i=0;
while(i<max_num && m_sernum!="") //将输入的页面号序列转换为整型放入数组num_array里
{
while(m_sernum.Left(1)==" " || m_sernum.Left(1)==",")
m_sernum=m_sernum.Right(m_sernum.GetLength()-1);
if(m_sernum=="") continue;
inte=atoi(m_sernum.Left(1)); //校验输入的页面号序列
itoa(inte,CSnum,10);
if(CSnum!=m_sernum.Left(1)) //输入页面号序列序列中含有非数字字符
{
MessageBox("页面号序列输入非法(页面号含非数字字符)","提示",MB_OK+MB_ICONINFORMATION);
m_sernum_control.SetFocus();
return false;
}
point_array++;
num_array[i++]=inte;
m_sernum=m_sernum.Right(m_sernum.GetLength()-1);
if(m_sernum.Left(1)!=" " && m_sernum.Left(1)!="," && m_sernum.Left(1)!="")//页面号间没用分隔符隔开
{
MessageBox("页面号序列输入非法(页面号间未插入分隔符' '或',')","提示",MB_OK+MB_ICONINFORMATION);
m_sernum_control.SetFocus();
return false;
}
m_sernum=m_sernum.Right(m_sernum.GetLength()-1);
}
if(point_array==0) //输入页面号序列中未含页面号
{
MessageBox("请输入含页面号的序列!","提示",MB_OK+MB_ICONWARNING);
m_sernum_control.SetFocus();
return false;
}
return true;
}
void CPageMetathesisDlg::Optimal(int *addr,int phisical_size) //实现Optimal算法的函数
{
metathesis=true,space=true;
str="";
for(int z=1;z<=phisical_size;z++) //输出说明提示
{
str+="页块";
itoa(z,CSnum,10);
str+=CSnum;
str+=" ";
}
str+="有无中断 页面置换形式";
m_display.InsertString(m_display.GetCount(),str);
for(int i=phisical_size-1;i>=0;i--)
{
phi[i]=-1; //设置数组初值为-1
priority[i]=0; //设置数组优先级为0
}
for(i=0;i<point_array;i++)
{
metathesis=true;
for(int j=0;metathesis && j<phisical_size;j++)
{
if(addr[i]==phi[j])
{
metathesis=false;
memo=" ";
for(z=0;z<phisical_size;z++)
{
if(phi[z]==-1) //无中断且有空页面,空页面处输出空格
memo+=" ";
else //无中断
{
itoa(phi[z],CSnum,10);
memo+=CSnum;
memo+=" ";
}
}
m_display.InsertString(m_display.GetCount(),memo);
}
}
if(metathesis) //有中断
{
if(space) //有空页面,插入页面中断
{
int m;
for(z=0;z<phisical_size;z++)
if(priority[z]==0)
{
priority[z]=1;
phi[z]=addr[i];
m=z;
z=phisical_size;
}
if(priority[phisical_size-1]!=0) space=false; //最后一个页面不空,则无空页面
memo=" ";
for(z=0;z<phisical_size;z++)
{
itoa(phi[z],CSnum,10);
if(m<z) memo+=" ";
else memo+=CSnum;
memo+=" ";
}
memo+=" √ 插入页面";
num_fail++;
m_display.InsertString(m_display.GetCount(),memo);
}
else //无空页面,替换页面中断
{
int max=0;
for(z=0;z<phisical_size;z++)
{
for(int k=i+1;k<point_array;k++)
{
if(phi[z]==addr[k])
{
priority[z]=k;
k=point_array+1;
if(priority[z]>priority[max]) max=z;
}
}
if(k==point_array) {max=z;z=phisical_size;}
}
phi[max]=addr[i];
memo=" ";
for(z=0;z<phisical_size;z++)
{
itoa(phi[z],CSnum,10);
memo+=CSnum;
memo+=" ";
}
memo+=" √ 替换页面";
num_fail++;
m_display.InsertString(m_display.GetCount(),memo);
}
}
}
CString output="Optimal算法 总页面数:";
char temporary[4];
itoa(point_array,temporary,10);
output+=temporary;
itoa(num_fail,temporary,10);
output+=" 缺页中断次数:";
output+=temporary;
output+=" 缺页率为:";
num_fail=num_fail*100/point_array;
itoa(num_fail,temporary,10);
output+=temporary;
output+="%";
m_display.InsertString(0,output);
output="";
m_display.InsertString(1,output);
}
void CPageMetathesisDlg::LRU(int *addr,int phisical_size) //实现LRU算法的函数
{
metathesis=true,space=true;
str="";
for(int i=phisical_size-1;i>=0;i--)
{
phi[i]=-1; //设置数组初值为-1
priority[i]=0; //设置数组优先级为0
}
for(int z=1;z<=phisical_size;z++)
{
str+="页块";
itoa(z,CSnum,10);
str+=CSnum;
str+=" ";
}
str+="有无中断 页面置换形式";
m_display.InsertString(m_display.GetCount(),str);
for(i=0;i<point_array;i++)
{
metathesis=true;
for(int j=0;metathesis && j<phisical_size;j++)
{
if(addr[i]==phi[j])
{
metathesis=false;
for(z=0;z<phisical_size;z++)
if(priority[z]>priority[j])
priority[z]-=1;
priority[j]=phisical_size;
memo=" ";
for(z=0;z<phisical_size;z++)
{
if(phi[z]==-1) //无中断且有空页面,空页面处输出空格
memo+=" ";
else //无中断不为空页面
{
itoa(phi[z],CSnum,10);
memo+=CSnum;
memo+=" ";
}
}
m_display.InsertString(m_display.GetCount(),memo);
}
}
if(metathesis) //有中断
{
if(space) //有空页面,插入页面中断
{
int m;
for(z=0;z<phisical_size;z++)
{
if(priority[z]==0)
{
priority[z]=phisical_size;
phi[z]=addr[i];
m=z;
z=phisical_size;
}
else
priority[z]-=1;
}
if(priority[phisical_size-1]!=0) space=false; //最后一个页面不空,则无空页面
memo=" ";
for(z=0;z<phisical_size;z++)
{
itoa(phi[z],CSnum,10);
if(m<z) memo+=" ";
else memo+=CSnum;
memo+=" ";
}
memo+=" √ 插入页面";
num_fail++;
m_display.InsertString(m_display.GetCount(),memo);
}
else //无空页面,替换页面中断
{
for(z=0;z<phisical_size;z++)
{
if(priority[z]==1)
{
priority[z]=phisical_size;
phi[z]=addr[i];
}
else
priority[z]-=1;
}
memo=" ";
for(z=0;z<phisical_size;z++)
{
itoa(phi[z],CSnum,10);
memo+=CSnum;
memo+=" ";
}
memo+=" √ 替换页面";
num_fail++;
m_display.InsertString(m_display.GetCount(),memo);
}
}
}
CString output="LRU算法 总页面数:";
char temporary[4];
itoa(point_array,temporary,10);
output+=temporary;
itoa(num_fail,temporary,10);
output+=" 缺页中断次数:";
output+=temporary;
output+=" 缺页率为:";
num_fail=num_fail*100/point_array;
itoa(num_fail,temporary,10);
output+=temporary;
output+="%";
m_display.InsertString(0,output);
output="";
m_display.InsertString(1,output);
}
void CPageMetathesisDlg::FIFO(int *addr,int phisical_size) //实现FIFO算法的函数
{
metathesis=true,space=true;
str="";
for(int i=phisical_size-1;i>=0;i--)
{
phi[i]=-1; //设置数组初值为-1
priority[i]=0; //设置数组优先级为0
}
for(int z=1;z<=phisical_size;z++)
{
str+="页块";
itoa(z,CSnum,10);
str+=CSnum;
str+=" ";
}
str+="有无中断 页面置换形式";
m_display.InsertString(m_display.GetCount(),str);
for(i=0;i<point_array;i++)
{
metathesis=true;
for(int j=0;metathesis && j<phisical_size;j++)
{
if(addr[i]==phi[j])
{
metathesis=false;
memo=" ";
for(z=0;z<phisical_size;z++)
{
if(phi[z]==-1) //无中断且有空页面,空页面处输出空格
memo+=" ";
else //无中断
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -