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

📄 wall_osdlg.cpp

📁 程序功能主要分为3个部分
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}
// 清除显示按钮函数
void CWALL_OSDlg::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	CListBox * pList = (CListBox *) (GetDlgItem(IDC_LIST_RESULT));
	ASSERT(pList != NULL);
	// 清除之前的所有显示
	pList->ResetContent();
}
// OPT算法函数
void CWALL_OSDlg::Optimal(int *questSequence)
{
	CListBox * pList = (CListBox *) (GetDlgItem(IDC_LIST_RESULT));
	ASSERT(pList != NULL);
	// OPT算法列表头部显示
	pList->AddString("");	
	pList->AddString("");	
	pList->AddString("");	
	pList->AddString("---------------------------------------------------------------------------------");	
	pList->AddString("最佳(Optimal)页面置换算法:");
	pList->AddString("---------------------------------------------------------------------------------");	

	CString str = "";
	CString str1 = "";
	int i=0;
	str = "|请求|缺页|换页|" ;
	for(i=0 ; i<m_pageGot ; i++)
	{
		str1.Format(" P%d |",i);
		str += str1;
	}
	pList->AddString(str);
	str = "|" ;
	for(i=0 ; i<m_pageGot+3 ; i++)
	{
		str1.Format("----|",i);
		str += str1;
	}
	pList->AddString(str);

	// 设置页面请求序列的权值为当前位置到下一次出现之间的间隔页数
	int *questPower = new int[m_questLength];
	for(i=0;i<m_questLength;i++)
	{
		for(int j=i+1;j<m_questLength;j++)
		{
			if(questSequence[i] == questSequence[j]) break;
		}
		questPower[i] = j-i;
	}

	int fault = 0;
	int swap = 0;
	PageQueue pq(m_pageGot);
	int *page = pq.GetQueue();
	int pos=0;
	// OPT页面置换算法循环
	for(i=0;i<m_questLength;i++)
	{
		str = "|";
		str1.Format(" %.2d |",questSequence[i]);
		str += str1;
		// 在页面队列中查找请求页的位置
		pos = pq.Find(questSequence[i]);
		if(pos < 0)
		{
			str += "  * |";
			fault++ ;
			if(i >= m_pageGot)
			{
				str += "  * |";
				swap++ ;
			}
			else str += "  - |";
			// 未找到则产生缺页中断,替换页面队列中的某一页
			pq.EnQueue(questSequence[i],questPower[i]);
		}
		else
		{
			str += "  - |  - |";
			// 找到了则修改该页的权值为当前请求页的权值
			pq.setPower(pos,questPower[i]);
		}
		// 显示当前页面队列的情况
		for(int j=0;j<m_pageGot;j++)
		{
			if(page[j] < 0) str1 = "  - |";
			else str1.Format(" %.2d |",page[j]);
			str += str1;
		}
		pList->AddString(str);
		// 页面队列权值减1
		pq.decPower();
	}
	pList->AddString("---------------------------------------------------------------------------------");	

	// OPT算法缺页率与换页率等统计信息的显示
	pList->AddString("OPT算法统计:");
	str.Format("页面请求个数:%d",m_questLength);
	pList->AddString(str);

	str.Format("缺页次数:%d",fault);
	pList->AddString(str);
	str.Format("缺页率:%.2f",100.0 * fault / m_questLength);
	str += "%" ;
	pList->AddString(str);

	str.Format("换页次数:%d",swap);
	pList->AddString(str);
	str.Format("换页率:%.2f",100.0 * swap / m_questLength);
	str += "%" ;
	pList->AddString(str); 

	str.Format("命中次数:%d",m_questLength - fault);
	pList->AddString(str);
	str.Format("命中率:%.2f",100 - 100.0 * fault / m_questLength);
	str += "%" ;
	pList->AddString(str); 
	
	pList->AddString("---------------------------------------------------------------------------------");	

	// 释放权值数组空间
	delete [] questPower;
}
// FIFO算法函数
void CWALL_OSDlg::FIFO(int *questSequence)
{
	CListBox * pList = (CListBox *) (GetDlgItem(IDC_LIST_RESULT));
	ASSERT(pList != NULL);

	// FIFO算法列表头部显示
	CString str = "";
	CString str1 = "";
	pList->AddString("");	
	pList->AddString("");	
	pList->AddString("");	
	pList->AddString("---------------------------------------------------------------------------------");	
	pList->AddString("先进先出(FIFO)页面置换算法:");
	pList->AddString("---------------------------------------------------------------------------------");	

	str = "|请求|缺页|换页|" ;
	int i=0;
	for(i=0 ; i<m_pageGot ; i++)
	{
		str1.Format(" P%d |",i);
		str += str1;
	}
	pList->AddString(str);
	str = "|" ;
	for(i=0 ; i<m_pageGot+3 ; i++)
	{
		str1.Format("----|",i);
		str += str1;
	}
	pList->AddString(str);

	PageQueue pq(m_pageGot);
	int *page = pq.GetQueue();
	int fault = 0;
	int swap = 0;
	int pos = 0;
	// FIFO页面置换算法循环
	for(i=0;i<m_questLength;i++)
	{
		str = "|";
		str1.Format(" %.2d |",questSequence[i]);
		str += str1;
		// 在页面队列中查找请求页的位置
		pos = pq.Find(questSequence[i]);
		if(pos < 0)
		{
			str += "  * |";
			fault++ ;
			if(i >= m_pageGot)
			{
				str += "  * |";
				swap++ ;
			}
			else str += "  - |";
			// 未找到则产生缺页中断,替换页面队列中的某一页,
			// 当前页的权值设置为随序号的增大而减小,
			// 从而先到的页权值大,会首先被置换出页面队列
			pq.EnQueue(questSequence[i],m_questLength-i);
		}
		else
		{
			str += "  - |  - |";
		}
		// 显示当前页面队列的情况
		for(int j=0;j<m_pageGot;j++)
		{
			if(page[j] < 0) str1 = "  - |";
			else str1.Format(" %.2d |",page[j]);
			str += str1;
		}
		pList->AddString(str);
	}
	pList->AddString("---------------------------------------------------------------------------------");	

	// FIFO算法缺页率与换页率等统计信息的显示
	pList->AddString("FIFO算法统计:");
	str.Format("页面请求个数:%d",m_questLength);
	pList->AddString(str);

	str.Format("缺页次数:%d",fault);
	pList->AddString(str);
	str.Format("缺页率:%.2f",100.0 * fault / m_questLength);
	str += "%" ;
	pList->AddString(str);

	str.Format("换页次数:%d",swap);
	pList->AddString(str);
	str.Format("换页率:%.2f",100.0 * swap / m_questLength);
	str += "%" ;
	pList->AddString(str); 

	str.Format("命中次数:%d",m_questLength - fault);
	pList->AddString(str);
	str.Format("命中率:%.2f",100 - 100.0 * fault / m_questLength);
	str += "%" ;
	pList->AddString(str); 
	
	pList->AddString("---------------------------------------------------------------------------------");	
}
// LRU算法函数
void CWALL_OSDlg::LRU(int *questSequence)
{
	CListBox * pList = (CListBox *) (GetDlgItem(IDC_LIST_RESULT));
	ASSERT(pList != NULL);

	// LRU算法列表头部显示
	pList->AddString("");	
	pList->AddString("");	
	pList->AddString("");	
	pList->AddString("---------------------------------------------------------------------------------");	
	pList->AddString("最近最久未使用(LRU)页面置换算法:");
	pList->AddString("---------------------------------------------------------------------------------");	

	CString str = "";
	CString str1 = "";
	int i=0;
	str = "|请求|缺页|换页|" ;
	for(i=0 ; i<m_pageGot ; i++)
	{
		str1.Format(" P%d |",i);
		str += str1;
	}
	pList->AddString(str);
	str = "|" ;
	for(i=0 ; i<m_pageGot+3 ; i++)
	{
		str1.Format("----|",i);
		str += str1;
	}
	pList->AddString(str);

	PageQueue pq(m_pageGot);
	int *page = pq.GetQueue();
	int pos=0;
	int fault = 0;
	int swap = 0;
	// LRU页面置换算法循环
	for(i=0;i<m_questLength;i++)
	{
		str = "|";
		str1.Format(" %.2d |",questSequence[i]);
		str += str1;
		// 在页面队列中查找请求页的位置
		pos = pq.Find(questSequence[i]);
		if(pos < 0)
		{
			str += "  * |";
			fault++ ;
			if(i >= m_pageGot)
			{
				str += "  * |";
				swap++ ;
			}
			else str += "  - |";
			// 未找到则产生缺页中断,替换页面队列中的某一页,
			// 权值设置与FIFO算法相同
			pq.EnQueue(questSequence[i],m_questLength-i);
		}
		else
		{
			str += "  - |  - |";
			// 找到时要更新原来页面的权值,从而让后进入队列的页面有较小的权值,
			// 这样就可以实现后进后出,先进先出,也就是FIFO
			pq.setPower(pos,m_questLength-i);
		}
		// 显示当前页面队列的情况
		for(int j=0;j<m_pageGot;j++)
		{
			if(page[j] < 0) str1 = "  - |";
			else str1.Format(" %.2d |",page[j]);
			str += str1;
		}
		pList->AddString(str);
	}	
	pList->AddString("---------------------------------------------------------------------------------");	

	// LRU算法缺页率与换页率等统计信息的显示
	pList->AddString("LRU算法统计:");
	str.Format("页面请求个数:%d",m_questLength);
	pList->AddString(str);

	str.Format("缺页次数:%d",fault);
	pList->AddString(str);
	str.Format("缺页率:%.2f",100.0 * fault / m_questLength);
	str += "%" ;
	pList->AddString(str);

	str.Format("换页次数:%d",swap);
	pList->AddString(str);
	str.Format("换页率:%.2f",100.0 * swap / m_questLength);
	str += "%" ;
	pList->AddString(str); 

	str.Format("命中次数:%d",m_questLength - fault);
	pList->AddString(str);
	str.Format("命中率:%.2f",100 - 100.0 * fault / m_questLength);
	str += "%" ;
	pList->AddString(str); 
	
	pList->AddString("---------------------------------------------------------------------------------");
}

void CWALL_OSDlg::OnSelchangeListResult() 
{
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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