⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagemetathesisdlg.cpp

📁 用VC++6.0模拟实现最佳置换算法、最近最久未使用算法、先进先出置换算法。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -