操作系统实验2.docx
- 文档编号:9249231
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:21
- 大小:56.88KB
操作系统实验2.docx
《操作系统实验2.docx》由会员分享,可在线阅读,更多相关《操作系统实验2.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统实验2
实验2存储器管理
实验目的
编程模拟实现存储器页面置换的常用算法,调试分析相关存储器管理程序,加深对存储器页面置换常用算法的理解和实现技巧
实验内容
1、自定义存储器管理有关的数据结构;
2、依据最佳置换算法(Optimal)、先进先出置换算法(FIFO)、最近最久未使用算法(LRU)原理,编写对应函数,模拟系统的存储器页面置换功能;
3、为了更好地模拟和评价算法的性能,允许用户自行指定可用页块数并输入需访问的页面号序列;
4、统计以上算法实际需要的总页面数、缺页中断次数以及它们的缺页率;
5、比较/分析以上算法的置换性能,并作出自己的评价。
预备知识
存储器页面置换常用算法的相关知识参考课堂《计算机操作系统》教材
实验指导
1、请求分页存储器管理模拟系统界面
图3.1请求分页存储器管理模拟系统界面
图形界面可以自行设计、也可以使用控制台终端输出信息。
“访问页面号序列”和“页块数”为输入信息,列表框(或编辑框)“具体的页面置换情况”及其统计数据为输出信息。
控制台终端的输出信息可以通过剪贴板复制保存为电子实验记录文件。
图形界面可以通过“保存”按钮保存列表框的输出信息。
采用编辑框显示的输出信息,也可以通过剪贴板复制保存。
Optimal、LRU、FIFIO算法分别由其对应按钮或函数实现。
2、全局变量
intPageSeq[MAXPAGENUM];//用来放置页面号序列的整型数组
CStringpageSeqNum;//带分隔符的访问页面序列字符串备份
inttotalPageCount;//实际输入的总页面数
intfailPageCount;//缺页中断次数
intpageBlock[9],priority[9];//已在内存页面号,及其优先数
boolmetathesis,space;//是否缺页,是否有空页
CStringstr,memo,output;//信息标题,调页记录,输出信息
3、主对话框类声明
classCPageMetathesisDlg:
publicCDialog
{
//Construction
public:
BOOLUpdatePageSeq();
voidOptimal(int*,int);
voidLRU(int*,int);
voidFIFO(int*,int);
CPageMetathesisDlg(CWnd*pParent=NULL);//standardconstructor
//DialogData
//{{AFX_DATA(CPageMetathesisDlg)
enum{IDD=IDD_PAGEMETATHESIS_DIALOG};
CEditm_BlockCount_Control;
CListBoxm_Display;
CEditm_PageSeqNum_Control;
CStringm_Hint;
CStringm_PageSeqNum;
intm_BlockCount;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CPageMetathesisDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
HICONm_hIcon;
//Generatedmessagemapfunctions
//{{AFX_MSG(CPageMetathesisDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnButtonClr();
afx_msgvoidOnButtonExit();
afx_msgvoidOnButtonLru();
afx_msgvoidOnButtonFifo();
afx_msgvoidOnButtonOptimal();
afx_msgvoidOnButtonSave();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
4、参考代码
//实现Optimal算法的函数
voidCPageMetathesisDlg:
:
Optimal(int*addr,intphysical_size)
{
charCSnum[2];
metathesis=true,space=true;
str="\r\n";
output="";
for(intz=1;z<=physical_size;z++)//输出说明提示
{
str+="页块";
itoa(z,CSnum,10);
str+=CSnum;
str+="";
}
str+="有无中断页面置换形式";
m_Display.InsertString(m_Display.GetCount(),str);
for(inti=physical_size-1;i>=0;i--)
{
pageBlock[i]=-1;//设置数组初值为-1
priority[i]=0;//设置数组优先级为0
}
for(i=0;i { metathesis=true; for(intj=0;metathesis&&j { if(addr[i]==pageBlock[j]) { metathesis=false; memo=""; for(z=0;z { if(pageBlock[z]==-1)//无中断且有空页面,空页面处输出空格 memo+=""; else//无中断 { itoa(pageBlock[z],CSnum,10); memo+=CSnum; memo+=""; } } output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } } if(metathesis)//有中断 { if(space)//有空页面,插入页面中断 { intm; for(z=0;z if(priority[z]==0) { priority[z]=1; pageBlock[z]=addr[i]; m=z; z=physical_size; } if(priority[physical_size-1]! =0)space=false;//无空页面 memo=""; for(z=0;z { itoa(pageBlock[z],CSnum,10); if(m elsememo+=CSnum; memo+=""; } memo+="√插入页面"; failPageCount++; output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } else//无空页面,替换页面中断 { intmax=0; for(z=0;z { for(intk=i+1;k { if(pageBlock[z]==addr[k])//查找未来最长时间不再访问的页面 { priority[z]=k; k=totalPageCount+1; if(priority[z]>priority[max])max=z; } } if(k==totalPageCount){max=z;z=physical_size;} } pageBlock[max]=addr[i]; memo=""; for(z=0;z { itoa(pageBlock[z],CSnum,10); memo+=CSnum; memo+=""; } memo+="√替换页面"; failPageCount++; output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } } } memo=""; m_Display.InsertString(0,memo); memo="\r\nOptimal算法总页面数: "; chartemporary[4]; itoa(totalPageCount,temporary,10); memo+=temporary; itoa(failPageCount,temporary,10); memo+="缺页中断次数: "; memo+=temporary; memo+="缺页率为: "; failPageCount=failPageCount*100/totalPageCount; itoa(failPageCount,temporary,10); memo+=temporary; memo+="%"; output+="\r\n\r\n"; output+=memo; m_Display.InsertString(0,memo); } //实现LRU算法的函数 voidCPageMetathesisDlg: : LRU(int*addr,intphysical_size) { charCSnum[2]; metathesis=true,space=true; str="\r\n"; output=""; for(inti=physical_size-1;i>=0;i--) { pageBlock[i]=-1;//设置数组初值为-1 priority[i]=0;//设置数组优先级为0 } for(intz=1;z<=physical_size;z++) { str+="页块"; itoa(z,CSnum,10); str+=CSnum; str+=""; } str+="有无中断页面置换形式"; m_Display.InsertString(m_Display.GetCount(),str); for(i=0;i { metathesis=true; for(intj=0;metathesis&&j { if(addr[i]==pageBlock[j]) { metathesis=false; for(z=0;z if(priority[z]>priority[j]) priority[z]-=1; priority[j]=physical_size; memo=""; for(z=0;z { if(pageBlock[z]==-1)//无中断且有空页面,空页面处输出空格 memo+=""; else//无中断不为空页面 { itoa(pageBlock[z],CSnum,10); memo+=CSnum; memo+=""; } } output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } } if(metathesis)//有中断 { if(space)//有空页面,插入页面中断 { intm; for(z=0;z { if(priority[z]==0) { priority[z]=physical_size; pageBlock[z]=addr[i]; m=z; z=physical_size; } else priority[z]-=1; } if(priority[physical_size-1]! =0)space=false;//无空页面 memo=""; for(z=0;z { itoa(pageBlock[z],CSnum,10); if(m elsememo+=CSnum; memo+=""; } memo+="√插入页面"; failPageCount++; output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } else//无空页面,替换页面中断 { for(z=0;z { if(priority[z]==1) { priority[z]=physical_size; pageBlock[z]=addr[i]; } else priority[z]-=1; } memo=""; for(z=0;z { itoa(pageBlock[z],CSnum,10); memo+=CSnum; memo+=""; } memo+="√替换页面"; failPageCount++; output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } } } …… } //实现FIFO算法的函数 voidCPageMetathesisDlg: : FIFO(int*addr,intphysical_size) { charCSnum[2]; metathesis=true,space=true; str="\r\n"; output=""; for(inti=physical_size-1;i>=0;i--) { pageBlock[i]=-1;//设置数组初值为-1 priority[i]=0;//设置数组优先级为0 } for(intz=1;z<=physical_size;z++) { str+="页块"; itoa(z,CSnum,10); str+=CSnum; str+=""; } str+="有无中断页面置换形式"; m_Display.InsertString(m_Display.GetCount(),str); for(i=0;i { metathesis=true; for(intj=0;metathesis&&j { if(addr[i]==pageBlock[j]) { metathesis=false; memo=""; for(z=0;z { if(pageBlock[z]==-1)//无中断且有空页面,空页面处输出空格 memo+=""; else//无中断 { itoa(pageBlock[z],CSnum,10); memo+=CSnum; memo+=""; } } output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } } if(metathesis)//有中断 { if(space)//有空页面,插入页面中断 { intm; for(z=0;z { if(priority[z]==0) { priority[z]=physical_size; pageBlock[z]=addr[i]; m=z; z=physical_size; } else priority[z]-=1; } if(priority[physical_size-1]! =0)space=false;//无空页面 memo=""; for(z=0;z { itoa(pageBlock[z],CSnum,10); if(m elsememo+=CSnum; memo+=""; } memo+="√插入页面"; failPageCount++; output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } else//无空页面,替换页面中断 { for(z=0;z { if(priority[z]==1) { priority[z]=physical_size; pageBlock[z]=addr[i]; } else priority[z]-=1; } memo=""; for(z=0;z { itoa(pageBlock[z],CSnum,10); memo+=CSnum; memo+=""; } memo+="√替换页面"; failPageCount++; output+="\r\n"; output+=memo; m_Display.InsertString(m_Display.GetCount(),memo); } } } …… } //将输出信息保存到磁盘文件 voidCPageMetathesisDlg: : OnButtonSave() { //TODO: Addyourcontrolnotificationhandlercodehere CFileDialogdlgFile(TRUE); HANDLEhFile; CStringtitle,strFilter,fileName; VERIFY(title.LoadString(AFX_IDS_SAVEFILE)); strFilter+="PageMetathesisDATAFile(*.DAT;*.dat)"; strFilter+=(TCHAR)'\0';//nextstringplease strFilter+=_T("*.DAT"); strFilter+=(TCHAR)'\0';//laststring dlgFile.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_CREATEPROMPT; CStringstrDefault; dlgFile.m_ofn.nMaxCustFilter++; dlgFile.m_ofn.lpstrFilter=strFilter; dlgFile.m_ofn.lpstrTitle=title; dlgFile.m_ofn.lpstrFile=fileName.GetBuffer(_MAX_PATH); if(dlgFile.DoModal()==IDOK) { hFile=CreateFile(fileName,//filename GENERIC_WRITE,//OnlyWritePermission 0,//cannotbeshared NULL,//pointertos
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验