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

📄 虚存页替换模拟view.cpp

📁 实现了几种内存页面置换算法
💻 CPP
字号:
// 虚存页替换模拟View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "虚存页替换模拟.h"

#include "虚存页替换模拟Doc.h"
#include "虚存页替换模拟View.h"
#include "WRITE.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
ON_COMMAND(ID_Read, OnRead)
	ON_WM_CHAR()
	ON_COMMAND(ID_SELECT_FIFU, OnSelectFifu)
	ON_COMMAND(ID_SELECT_LRU, OnSelectLru)
	ON_COMMAND(ID_SELECT_OPT, OnSelectOpt)
	ON_COMMAND(ID_SELECT_ALL, OnSelectAll)
	ON_COMMAND(ID_WRITE, OnWrite)
	//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here
//	a=100;
//	b=100;
	length=0;
	pos=0;
	temp=0;
	number=0;
	for(int i=0;i<N;i++)
		array[i]=' ';
}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{

	int j=0;
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	while(j<100&&pDoc->str[j]!=' '&&j<pos)
	{
		pDC->TextOut(j*10,0,pDoc->str[j]);
		j++;
	}
	if(temp==1)
	{
		FIFO(array,number,length);

	}
	if(temp==2)
	{
		LRU(array,number,length);
	}
	if(temp==3)
	{
		OPT(array,number,length);
	}
	if(temp==4)
	{
/*		OPT(array,number,length);
//		LRU(array,number,length);
		FIFO(array,number,length);
		LRU(array,number,length);
		OPT(array,number,length);*/
		//OnSelectAll();
		CMyDoc*pDoc=GetDocument();
		ASSERT_VALID(pDoc);
		if(length==0)
		{
			for(int i=0;i<pos;i++)
				array[i]=pDoc->str[i];
			length=pos-1;
		}
		
		x=100;
		y=100;
		//	OPT(array,number,length);
		//	LRU(array,number,length);
		FIFO(array,number,length);
		x=100;
		y=100+(number+2)*20;
		LRU(array,number,length);
		x=100;
		y=100+(number+2)*40;
		OPT(array,number,length);
		temp=4;
	}
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

void CMyView::OnRead() 
{
	temp=0;
	length=0;
	pos=0;
	Invalidate();
	// TODO: Add your command handler code here
	CFileDialog dlg(TRUE);	//定义一个对话框变量 获取文件
	
	int i=0;	//
	
	if (dlg.DoModal()==IDOK)
	{
		CString FilePath=dlg.GetPathName();
		
		CStdioFile File;
		
		File.Open(FilePath,CFile::modeRead,NULL);	//以读模式打开文件
		
		CString FileData;
		
		while (File.ReadString(FileData))	//每次读一行数据
		{
			
			//可读入数字 大小写字母 ,中间用空格隔开
			int j=0;
			
			while(j<FileData.GetLength())
			{
				if ((FileData[j]>=48 && FileData[j]<=57) || 
					(FileData[j]>=65 && FileData[j]<=90) ||
					(FileData[j]>=97 && FileData[j]<=122))
				{
					array[i]=FileData[j];
					
					i++;	
				}
				
				j++;
				
			}
		}
		
		length=i-1;
}
}

void CMyView::FIFO(char *s,int num,int len)
{
	
	int a=x;
	int b=y;
	CDC* PDC=GetDC();
	int n=0;//记录命中的次数
	int flag=0;//记录用不用替换,要是不用的话记为1,否则记为0
	int position=0;//记录现在该考察的位置
	char *str=new char[num];//申请空间来保存
	for (int q=0;q<num;q++)
	{
		str[q]=' ';//把每个空间赋值为空
	}
	for(int i=0;i<=len;i++)//执行替换
	{
		flag=0;//没替换一个,把他的标志位赋为零
		for(int j=0;j<num;j++)//查找在所有的页里面有没有要插入的页
		{
			if(str[j]==s[i])//用要插入的页码给所装入的页码比较,看存不存在
			{
				n++;//要是存在的话就命中,把命中的次数加1
				flag=1;//标志位设置为1
			}
		}
		if(flag==1)//如果标志位为1,那么说明该页已经在内存中
			position=(position+num-1)%num;//把位置减1
		if(flag==0)//如果没命中把该页调入内存
		{
			str[position]=s[i];//把它放在标志位处
		}
		position=(position+1)%num;//标志位往后放
		for(int p=0;p<num;p++)//输出
		{
			
			if(str[p]!=' '&&p==position)//判断光标所在的位置,标记下一个替换位置,用*号表示。
			{
				PDC->TextOut(a,b,str[p]);
			//	b+=10;
				PDC->TextOut(a+10,b,"*");
				b+=20;
			}
			
			else
			{
				PDC->TextOut(a,b,str[p]);
				b+=20;
			}			
		}
		if(flag==1)
			PDC->TextOut(a-10,b,"命中");
		a+=40;
		b=y;
	}
	
}

void CMyView::LRU(char* yml,int m,int n)
{
	CDC *pDC=GetDC();
	n+=1;
	char* ncy=new char[m];
	int* count=new int[m];
	int i=0,j=0,k=0;
	int sign1,sign2;
	double countmingz=0;
	int a=x,b=y;//输出坐标表示
	for(i=0;i<m;i++)
	{
		count[i]=0;
		ncy[i]='$';
	}
	for(i=0;i<n;i++)
	{
		sign1=0;
		sign2=0;
		int sign3=0;
		if(ncy[m-1]=='$')//前m页状况
		{
			for(j=0;j<m&&ncy[j]!='$';j++)//命中时的情况
			{
				if(ncy[j]==yml[i])
				{
					for(k=0;k<m&&ncy[k]!='$';k++)
						//	cout<<ncy[k]<<" ";
						pDC->TextOut(a,b+k*20,ncy[k]);
					//cout<<"命中"<<endl;
					pDC->TextOut(a-10,b+m*20,"命中");
					a+=40;
					sign1=1;
					count[j]=0;
					for(int c=0;c<m&&ncy[c]!='$';c++)
						if(c!=j)
							count[c]=count[c]+1;
						countmingz=countmingz+1;
						break;
				}
			}
			if(sign1==0)
			{
				for(j=0;j<m;j++)
				{
					if(ncy[j]=='$')
					{
						ncy[j]=yml[i];
						break;
					}
				}
				k=j;
				for(j=0;j<k;j++)
				{
					count[j]=count[j]+1;
					//cout<<ncy[j]<<" ";
					pDC->TextOut(a,b+j*20,ncy[j]);
				}
				count[k]=0;
				//cout<<ncy[k]<<endl;
				pDC->TextOut(a,b+j*20,ncy[k]);
				a+=40;
			}
		}
		else//其它页状况
		{
			for(j=0;j<m;j++)//命中时的情况
			{
				if(ncy[j]==yml[i])
				{
					for(k=0;k<m;k++)
						//cout<<ncy[k]<<" ";
						pDC->TextOut(a,b+k*20,ncy[k]);
					//cout<<"命中"<<endl;
					pDC->TextOut(a-10,b+k*20,"命中");
					sign2=1;
					count[j]=0;
					for(int c=0;c<m;c++)
						if(c!=j)
							count[c]=count[c]+1;
					countmingz=countmingz+1;
					//////////////////////////////////////
					int max1=count[0];//标记下一次要换出的页
					int	remen1=0;
					for(int d=1;d<m;d++)
					{
						if(count[d]>max1)
						{
							max1=count[d];
							remen1=d;
						}
					}
					pDC->SetTextColor(RGB(255,0,0));
					pDC->TextOut(a,b+remen1*20,ncy[remen1]);
					pDC->TextOut(a+10,b+remen1*20,"*");
					pDC->SetTextColor(RGB(0,0,0));
					///////////////////////////////////////
					a+=40;
						break;
				}
			}
			if(sign2==0)//不命中时的情况
			{
				int max=count[0];
				int remen=0;
				char remenchar;
				for(j=1;j<m;j++)//查找被替换的页面
				{
					if(count[j]>max)
					{
						max=count[j];
						remen=j;
					}
				}
				for(j=0;j<m;j++)
					if(j!=remen)
						count[j]=count[j]+1;
				remenchar=ncy[remen];
				ncy[remen]=yml[i];
				count[remen]=0;

				for(j=0;j<m;j++)
						//	cout<<ncy[j]<<" ";
					pDC->TextOut(a,b+j*20,ncy[j]);
				//////////////////////////////
				max=count[0];//标记下一次要换出的页
				remen=0;
				for(int d=1;d<m;d++)
				{
					if(count[d]>max)
					{
						max=count[d];
						remen=d;
					}
				}
				pDC->SetTextColor(RGB(255,0,0));
				pDC->TextOut(a,b+remen*20,ncy[remen]);
				pDC->TextOut(a+10,b+remen*20,"*");
				pDC->SetTextColor(RGB(0,0,0));
				//////////////////////////////////////////
				a+=40;
					//cout<<"未命中  "<<remenchar<<"被"<<ncy[remen]<<"替换掉"<<endl;
			}
		}
	}
	//cout<<"命中率为:"<<countmingz/(double)n<<endl;
//	delete []ncy;
//	delete []count;
}


void CMyView::OPT(char address[],int page,int virpage)//page是所给的实页数,virpage是所要替换的页码数
{
	CDC *pDC=GetDC();
	int a=x;
	int b=y;
	int hit=0;
    int k=0;
	int i,i1,t,tem;
	int s1=0;int s2=0;int s3=0,s4=-1;bool tag=false;int tag1=1;
	char *realpage=new char[page];
	
	
	
	for(i=0;i<page;i++)//初始化实业
	{
	       realpage[i]=' ';
	}
	
	for(i=0;i<page;)    //检查是否命中
	{  
		for(int j=0;j<page;j++)
		{
	           if(realpage[j]==address[k])
			   {
				   
				   for(tem=0;tem<page;tem++)
				   {
//					   cout<<realpage[tem]<<"  ";
						pDC->TextOut(a,b+tem*20,realpage[tem]);
				   }
//				   cout<<"命中"<<endl;
				   pDC->TextOut(a-10,b+page*20,"命中");
					a+=40;				   
				   hit++;
				   tag1=0;   //状态
				   k++;
			   }
			   
		}
		if(tag1)
		{
			realpage[i]=address[k];i++;
	           for(tem=0;tem<page;tem++)
			   {
//				   cout<<realpage[tem]<<"  ";
				   pDC->TextOut(a,b+tem*20,realpage[tem]);
			   }
			   k++;
//			   cout<<endl;
			   a+=40;
		}
		tag1=1;
	}
	////////////
     int i2=0;
	for(i=k;i<=virpage;i++)
	{  
		tag=false;
		for(i1=0;i1<page;i1++)
		{   
			if(realpage[i1]==address[i])
			{   
              s2=0;
				for(i2=0;i2<page;i2++)
				{
				for(t=i;t<virpage;t++)
				{
					if(realpage[i2]==address[t])
					
					break;
				}
				if(t<virpage)
				{
					s1=t;
					if(s1>s2)
					{
						s2=s1;
						s3=i2;
					}
				} 
				else
					s4=i2;
				
			}
			if(s4!=-1)
			{
				s3=s4;
				s4=-1;
			} 
			    //int numble =realpage[s3];
				pDC->SetTextColor(RGB(255,0,0));
				pDC->TextOut(a-40,b+s3*20,realpage[s3]);
                pDC->TextOut(a-30,b+s3*20,"*");
				pDC->SetTextColor(RGB(0,0,0));
				for(tem=0;tem<page;tem++)
				{
//					cout<<realpage[tem]<<"  ";
					pDC->TextOut(a,b+tem*20,realpage[tem]);
				}
//				cout<<""<<endl;
				pDC->TextOut(a-10,b+page*20,"命中");
				///////////////////////////////////////////////
			
				////////////////////////////////////*/
				a+=40;
				tag=true;
				hit++;
			}
		}
		
		if(!tag)
		{
			for(i1=0;i1<page;i1++)
			{
				for(t=i;t<virpage;t++)
				{
					if(realpage[i1]==address[t])
						break;
				}
				if(t<virpage)
				{
					s1=t;
					if(s1>s2)
					{
						s2=s1;
						s3=i1;
					}
				} 
				else
					s4=i1;
				
			}
			if(s4!=-1)
			{
				s3=s4;
				s4=-1;
			} 
			    //int numble =realpage[s3];
				pDC->SetTextColor(RGB(255,0,0));
				pDC->TextOut(a-40,b+s3*20,realpage[s3]);
                pDC->TextOut(a-30,b+s3*20,"*");
				realpage[s3]=address[i];
				pDC->SetTextColor(RGB(0,0,0));
			for(tem=0;tem<page;tem++)
			{
//				cout<<realpage[tem]<<"  ";
				pDC->TextOut(a,b+tem*20,realpage[tem]);
			}
			
			    
//			cout<<endl;
			a+=40;
		}
	}	
//	cout<<<<hit<<endl;
//	pDC->TextOut(a,b,"命中的总次数为:");
	double q=double(hit)/virpage;
//	cout<<"命中率为:"<<q<<endl;
	
	
}

void CMyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	CMyDoc*pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	length=0;
	temp=0;
	if(nChar==8)
	{

		pos--;
		if(pos<0)
			pos=0;
	}
	else
	{
		pDoc->str[pos]=nChar;
		pos++;
	}
	CView::OnChar(nChar, nRepCnt, nFlags);
	Invalidate();
}

void CMyView::OnSelectFifu() 
{
	// TODO: Add your command handler code here
	CMyDoc*pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	if(length==0)
	{
		for(int i=0;i<pos;i++)
			array[i]=pDoc->str[i];
		length=pos-1;
	}
	
	x=100;
	y=100;
	FIFO(array,number,length);
	temp=1;
	Invalidate();
	
}

void CMyView::OnSelectLru() 
{
	// TODO: Add your command handler code here
	CMyDoc*pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	if(length==0)
	{
		for(int i=0;i<pos;i++)
			array[i]=pDoc->str[i];
		length=pos-1;
	}
	
	x=100;
	y=100;
	LRU(array,number,length);
	temp=2;
	Invalidate();
}

void CMyView::OnSelectOpt() 
{
	// TODO: Add your command handler code here
	CMyDoc*pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	if(length==0)
	{
		for(int i=0;i<pos;i++)
			array[i]=pDoc->str[i];
		length=pos-1;
	}
	
	x=100;
	y=100;
	OPT(array,number,length);
	temp=3;
	Invalidate();
}

void CMyView::OnSelectAll() 
{
	// TODO: Add your command handler code here
//	CDC* pDoc=GetCD();
/*	CMyDoc*pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	if(length==0)
	{
		for(int i=0;i<pos;i++)
			array[i]=pDoc->str[i];
		length=pos-1;
	}
	
	x=100;
	y=100;
//	OPT(array,number,length);
//	LRU(array,number,length);
	FIFO(array,number,length);
	x=100;
	y=100+(number+2)*20;
	LRU(array,number,length);
	x=100;
	y=100+(number+2)*40;
	OPT(array,number,length);*/
	temp=4;
	Invalidate();
}

void CMyView::OnWrite() 
{
	// TODO: Add your command handler code here
	CWRITE write;
	if(IDOK==write.DoModal())
	{
		number=write.m_NUM;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -