📄 虚存页替换模拟view.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 + -