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

📄 页面置换dlg.cpp

📁 vc开发的关于操作系统的液面置换的模拟
💻 CPP
字号:
// 页面置换Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "页面置换.h"
#include "页面置换Dlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
	m_Bsize = 0;
	m_Psize = 0;
	m_yemian = _T("");
	m_str = _T("");
	m_i1 = 0;
	m_i2 = 0.0f;
	m_j1 = 0;
	m_j2 = 0.0f;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Text(pDX, IDC_EDIT1, m_Bsize);
	DDX_Text(pDX, IDC_EDIT2, m_Psize);
	DDX_Text(pDX, IDC_EDIT3, m_yemian);
	DDX_Text(pDX, IDC_EDIT4, m_str);
	DDX_Text(pDX, IDC_EDIT5, m_i1);
	DDX_Text(pDX, IDC_EDIT6, m_i2);
	DDX_Text(pDX, IDC_EDIT7, m_j1);
	DDX_Text(pDX, IDC_EDIT8, m_j2);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMyDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

  void CMyDlg::OnButton1()   
{
	


	UpdateData(true);
     int QString[50];
	for(int a=0;a<m_Psize;a++)
	{ 
		int b; b=0;
		b=m_yemian[2*a]-'0';
		QString[a]=b;
	}
	for(a=m_Psize;a<30;a++)
	{
		QString[a]=-1;
	}


	block = new pageInfor[m_Bsize];
      for(int i=0; i<m_Bsize; i++)
	  {
          block[i].content=-1;
          block[i].timer=0;
	  }
 
 page = new pageInfor[m_Psize];
 for(i=0; i<m_Psize; i++)
 {
    page[i].content = QString[i];
    page[i].timer = 0;
 }
 if(m_Psize<=m_Bsize)
	 AfxMessageBox("物理块数大于页面数,不存在页面置换!!");

	
    int exist,space,position;
	int m;m=0;
	m_str="";
	CString string; string="";
    CString str1; str1="";
	CString strm;strm="不缺页";

   for(i=0; i<m_Psize; i++)
   {    
   exist=findExist(i,m_Bsize);
   if(exist!=-1)
   {
	   m++; 
	   m_str=m_str+"\r\n"+strm;
	   UpdateData(false);
   }
   else
   {   
    space=findSpace(m_Bsize);
    if(space!=-1)
    {
     block[space]=page[i]; 
	 for(int n=0; n<m_Bsize; n++)
    if(block[n].content!=-1)
    {
 	   str1+=(block[n].content+'0');
        
		
    }

      m_str=m_str+"\r\n"+str1;
	  str1="";
	  UpdateData(false);
	 
	
    }
    else
    {
      for(int k=0; k<m_Bsize; k++)
      for(int j=i; j<m_Psize; j++)
     {
      if(block[k].content!=page[j].content)
      { block[k].timer=1000; }//将来不会用,设置TIMER为一个很大数
      else
      {
       block[k].timer=j;
       break;
      }
     }
     position=findReplace(m_Bsize);   
     block[position]=page[i];   
     for(int n=0; n<m_Bsize; n++)
    if(block[n].content!=-1)
    {
 	   str1+=(block[n].content+'0');
        
		
    }

      m_str=m_str+"\r\n"+str1;
	  str1="";
	  UpdateData(false);
      
    }
   }
   m_i1=m_Psize-m_Bsize-m;
   m_i2=(float)m_i1/(float)m_Psize;
   m_j1=m_Psize-m;
   m_j2=(float)m_j1/(float)m_Psize;
   UpdateData(false);
}


	// TODO: Add your control notification handler code here
	
}

void CMyDlg::OnButton2() 
{
	
	UpdateData(true);
     int QString[50];
	for(int a=0;a<m_Psize;a++)
	{ 
		int b; b=0;
		b=m_yemian[2*a]-'0';
		QString[a]=b;
	}
	for(a=m_Psize;a<30;a++)
	{
		QString[a]=-1;
	}


	block = new pageInfor[m_Bsize];
      for(int i=0; i<m_Bsize; i++)
	  {
          block[i].content=-1;
          block[i].timer=0;
	  }
 
 page = new pageInfor[m_Psize];
 for(i=0; i<m_Psize; i++)
 {
    page[i].content = QString[i];
    page[i].timer = 0;
 }
 if(m_Psize<=m_Bsize)
	 AfxMessageBox("物理块数大于页面数,不存在页面置换!!");


	int exist,space,position ;
	int h;h=0;
	m_str="";
	CString string; string="";
    CString str1; str1="";
	CString strm; strm="不缺页";
    
for(i=0; i<m_Psize; i++)
{
   exist = findExist(i,m_Bsize);
   if(exist != -1)
    {
	   h++;
	   m_str=m_str+"\r\n"+strm;
	   UpdateData(false);
   }

   else
   {   
    space = findSpace(m_Bsize);
    if(space != -1)
    {
     block[space] = page[i];  
     for(int n=0; n<m_Bsize; n++)
    if(block[n].content!=-1)
    {
 	   str1+=(block[n].content+'0');
        
		
    }

      m_str=m_str+"\r\n"+str1;
	  str1="";
	  UpdateData(false);
    }
    else
    {
     position = findReplace(m_Bsize);
     block[position] = page[i];   
     for(int n=0; n<m_Bsize; n++)
    if(block[n].content!=-1)
    {
 	   str1+=(block[n].content+'0');
        
		
    }

      m_str=m_str+"\r\n"+str1;
	  str1="";
	  UpdateData(false);
    }
   }
   for(int j=0; j<m_Bsize; j++)
    block[j].timer++;//BLOCK中所有页面TIMER++
}
   m_i1=m_Psize-m_Bsize-h;
   m_i2=(float)m_i1/(float)m_Psize;
   m_j1=m_Psize-h;
   m_j2=(float)m_j1/(float)m_Psize;
   UpdateData(false);

	// TODO: Add your control notification handler code here
	
}

void CMyDlg::OnButton3() 
{
	
	UpdateData(true);
    int QString[50];
	for(int a=0;a<m_Psize;a++)
	{ 
		int b; b=0;
		b=m_yemian[2*a]-'0';
		QString[a]=b;
	}
	for(a=m_Psize;a<30;a++)
	{
		QString[a]=-1;
	}

	block = new pageInfor[m_Bsize];
      for(int i=0; i<m_Bsize; i++)
	  {
          block[i].content=-1;
          block[i].timer=0;
	  }
 
 page = new pageInfor[m_Psize];
 for(i=0; i<m_Psize; i++)
 {
    page[i].content = QString[i];
    page[i].timer = 0;
 }
 if(m_Psize<=m_Bsize)
	 AfxMessageBox("物理块数大于页面数,不存在页面置换!!");

	int exist,space,position ;
	int m;m=0;
	CString string;
    CString str1;
	CString strm;strm="不缺页";
	str1="";
	string="";
	m_str="";

for(i=0; i<m_Psize; i++)
{
   exist = findExist(i,m_Bsize);
   if(exist!=-1)
    {
	   m++;
	   m_str=m_str+"\r\n"+strm;
	   UpdateData(false);
	   block[exist].timer=-1;
   }

   else
   {   
    space = findSpace(m_Bsize);
    if(space!=-1)
    {
     block[space]=page[i];  
     for(int n=0; n<m_Bsize; n++)
    if(block[n].content!=-1)
    {
 	   str1+=(block[n].content+'0');
        
		
    }

      m_str=m_str+"\r\n"+str1;
	  str1="";
	  UpdateData(false);
    
    }
    else
    {
     position=findReplace(m_Bsize);
     block[position]=page[i];   
     for(int n=0; n<m_Bsize; n++)
    if(block[n].content!=-1)
    {
 	   str1+=(block[n].content+'0');
        
		
    }

      m_str=m_str+"\r\n"+str1;
	  str1="";
	  UpdateData(false);
    
    }
   }
   for(int j=0; j<m_Bsize; j++)
    block[j].timer++;//BLOCK中所有页面TIMER++
}
   m_i1=m_Psize-m_Bsize-m;
   m_i2=(float)m_i1/(float)m_Psize;
   m_j1=m_Psize-m;
   m_j2=(float)m_j1/(float)m_Psize;
   UpdateData(false);
}



	// TODO: Add your control notification handler code here
	


void CMyDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	CDialog::OnCancel();
}

void CMyDlg::OnOK() 
{
	m_Psize=0;
	m_Bsize=0;
	m_str="";
	m_i1=0;
	m_i2=0;
	m_j1=0;
	m_j2=0;
	m_yemian="";
	UpdateData(false);
	
	
	
}


//DEL void CMyDlg::PRA(int Bsize, int Psize)
//DEL {
//DEL 	
//DEL 	UpdateData(true);
//DEL     int QString[Psize];
//DEL 	for(int a=0;a<Psize;a++)
//DEL 	{
//DEL 		QString[a]=m_yemian[2*a];
//DEL 	}
//DEL 
//DEL 	block = new pageInfor[Bsize];
//DEL       for(int i=0; i<Bsize; i++)
//DEL 	  {
//DEL           block[i].content=-1;
//DEL           block[i].timer=0;
//DEL 	  }
//DEL  
//DEL  page = new pageInfor[Psize];
//DEL  for(i=0; i<Psize; i++)
//DEL  {
//DEL     page[i].content = QString[i];
//DEL     page[i].timer = 0;
//DEL  }
//DEL 
//DEL }

int CMyDlg::findSpace(int Bsize)
{
	for(int i=0; i<Bsize; i++)
    if(block[i].content==-1)
    return i;//找到空闲内存,返回BLOCK中位置
    return -1;


}

int CMyDlg::findExist(int curpage, int Bsize)
{
	for(int i=0; i<Bsize; i++)
    if(block[i].content==page[curpage].content)
    return i;//找到内存中有该页面,返回BLOCK中位置

    return -1;


}

int CMyDlg::findReplace(int Bsize)
{
	int pos=0;

    for(int i=0; i<Bsize; i++)
    if(block[i].timer>=block[pos].timer)
    pos = i;//找到应予置换页面,返回BLOCK中位置
    return pos;


}

//DEL void CMyDlg::display(CString str1, CString str2)
//DEL {
//DEL 	for(int i=0; i<Bsize; i++)
//DEL    if(block[i].content != -1)
//DEL    {
//DEL 	   str1=block[i].content;
//DEL        str2=str2+" "+str1+"\r\t";
//DEL    }
//DEL     
//DEL }

void CMyDlg::BlockClear(int Bsize)
{
	for(int i=0; i<Bsize; i++)
	{
       block[i].content = -1;
       block[i].timer = 0;

	}
}

//DEL void CMyDlg::display(int Bsize, CString str1, CString str2)
//DEL {
//DEL 	
//DEL 	for(int i=0; i<Bsize; i++)
//DEL     if(block[i].content!=-1)
//DEL     {
//DEL  	   str1+=(block[i].content+'0');
//DEL         
//DEL 		
//DEL     }
//DEL 
//DEL       str2=str2+"\r\n"+str1;
//DEL 	  str1="";
//DEL 	  UpdateData(false);
//DEL }

⌨️ 快捷键说明

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