📄 wall_osdlg.cpp
字号:
}
// 清除显示按钮函数
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 + -