操作系统实验页面置换.docx
《操作系统实验页面置换.docx》由会员分享,可在线阅读,更多相关《操作系统实验页面置换.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统实验页面置换
院系:
计算机学院
实验课程:
操作系统实验
实验项目:
进程调度的设计与实现
指导老师:
伊传勇
开课时间:
2009~2010年度第2学期
专业:
计算机科学与技术(师范)
班级:
2班
华南师范大学教务处
一、实验名称
模拟操作系统的页面置换
二、实验目的
1、掌握操作系统的页面置换过程,加深理解页式虚拟存储器的实现原理。
2、掌握用随机数生成满足一定条件的指令地址流的方法。
3、掌握页面置换的模拟方法。
三、实验要求与提示
采用一种熟悉的语言,如C、PASCAL或C++等,编制程序。
模拟操作系统采用OPT、FIFO和LRU算法进行页面置换的过程。
设程序中地址范围为0到32767,采用随机数生成256个指令地址,满足50%的地址是顺序执行,25%向前跳,25%向后跳。
为满足上述条件,可采取下列方法:
设d0=10000,第n个指令地址为dn,第n+1个指令地址为dn+1,n的取值范围为0到255。
每次生成一个1到1024范围内的随机数a,如果a落在1到512范围内,则dn+1=dn+1。
如果a落在513到768范围内,则设置dn+1为1到dn范围内一个随机数。
如果a落在769到1024范围内,则设置dn+1为dn到32767范围内一个随机数。
页面大小的取值范围为1K,2K,4K,8K,16K。
按照页面大小将指令地址转化为页号。
对于相邻相同的页号,合并为一个。
分配给程序的内存块数取值范围为1块,2块,直到程序的页面数。
分别采用OPT、FIFO和LRU算法对页号序列进行调度,计算出对应的缺页中断率。
打印出页面大小、分配给程序的内存块数、算法名、对应的缺页中断率。
四、程序的主要流程图
1、先进先出算法流程图
2、最佳算法流程图
3最近最久未使用算法流程图
五、实验心得
通过这次页面置换模拟实验,我对操作系统这门课程有了更加深刻的了解,自己的编程能力有了一定的提高。
把书中的理论知识和实践相结合,使我的知识水平在原有的基础上有了一定的进步。
这次实验大大提高了我的分析能力、编程能力和综合能力,找出并改正了自己的许多错误与不足之处,为在毕业后在就业市场上提高自己的竞争力打下了坚实的基础。
使我体会最深的是:
任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效。
通过实验使我感觉编程就是一门艺术。
六、主要源程序清单
classCPageReplaceDlg:
publicCDialogEx
{
//。
。
。
。
。
。
。
。
。
。
。
。
。
private:
intMaxAddress;
intMinAddress;
intSize;
intMaxMemory;
intd[256];
intchange[256];
public:
intCreatAddress();
intGetMaxMin();
intGetMaxMemory();
intGetChange();
intFIFO(inta[],intm,intp[],intcount);
intLRU(intb[],intm,intp[],intcount);
intOPT(intc[],intm,intp[],intcount);
CStringoutput;
intm_size;
afx_msgvoidOnBnClickedButton1();
};
CPageReplaceDlg:
:
CPageReplaceDlg(CWnd*pParent/*=NULL*/)
:
CDialogEx(CPageReplaceDlg:
:
IDD,pParent)
MaxAddress(0)
MinAddress(32768)
Size(1024)
MaxMemory
(1)
output(_T(""))
m_size(0)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
intCPageReplaceDlg:
:
CreatAddress()
{
d[0]=10000;
inta,i;
for(i=1;i<256;i++)
{
a=rand()%1024+1;
if(a>0&&a<513)
d[i]=d[i-1]+1;
elseif(a>512&&a<769)
d[i]=rand()%(d[i-1])+1;
elseif(a>768&&a<1025)
d[i]=d[i-1]+1+rand()%(32767-d[i-1]);
}
return0;
}
intCPageReplaceDlg:
:
GetMaxMin()
{
for(inti=0;i<256;i++)
{
if(MaxAddressMaxAddress=d[i];
if(MinAddress>d[i])
MinAddress=d[i];
}
return1;
}
intCPageReplaceDlg:
:
GetMaxMemory()
{
intH=MaxAddress/Size;
if(MaxAddress%Size!
=0)H++;
intL=MinAddress/Size;
if(MinAddress%Size!
=0)L++;
MaxMemory=H-L+1;
returnMaxMemory;
}
intCPageReplaceDlg:
:
GetChange()
{
intcount=1;
change[0]=d[0]/Size;
if(d[0]%Size!
=0)
change[0]++;
inti,j=1;
inttemp;
for(i=1;i<256;i++)
{
temp=d[i]/Size;
if(d[i]%Size!
=0)
temp++;
if(temp!
=change[j-1])
{
change[j]=temp;count++;j++;
}
}
returncount;
}
intCPageReplaceDlg:
:
FIFO(inta[],intm,intp[],intcount)
{
intk=0;
intcountF=0;
inti,j;
for(j=m;j{
for(i=0;iif(a[i]==p[j])break;
if(i==m)
{
a[k]=p[j];
k=(k+1)%m;
countF++;
}
}
returncountF;
}
intCPageReplaceDlg:
:
LRU(intb[],intm,intp[],intcount)
{
intcountL=0;
inti,j,ii;
for(j=m;j{
for(i=0;iif(b[i]==p[j])break;
if(i==m)
{
for(ii=0;iib[ii]=b[ii+1];
b[ii]=p[j];
countL++;
}
else
{
inttemp=b[i];
for(ii=i;iib[ii]=b[ii+1];
b[ii]=temp;
}
}
returncountL;
}
intCPageReplaceDlg:
:
OPT(intc[],intm,intp[],intcount)
{
intcountO=0;
inti,j,ii,jj;
intmincount;
intoutpage;
inttempcount;
for(j=m;j{
for(i=0;iif(c[i]==p[j])break;
if(i==m)
{
mincount=count;
tempcount=0;
for(ii=0;ii{
for(jj=j;jjif(c[ii]==p[jj])
tempcount++;
if(mincount>tempcount)
{
mincount=tempcount;
outpage=c[ii];
tempcount=0;
}
tempcount=0;
}
for(ii=0;iiif(c[ii]==outpage)break;
c[ii]=p[j];
countO++;
}
}
returncountO;
}
voidCPageReplaceDlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData();
CreatAddress();
Size=1024*m_size;
CStringtemp;
output=_T("");
intcount=GetChange();
temp=_T("该作业依次要访问的页号的总数是:
");
output+=temp;
temp.Format(_T("%d"),count);
output+=temp;
int*pFIFO=newint[count];
int*pLRU=newint[count];
int*pOPT=newint[count];
inti;
for(i=0;ipFIFO[i]=pLRU[i]=pOPT[i]=change[i];
GetMaxMin();
intM=GetMaxMemory();
intm;
temp=_T("\r\n该作业所需的最大内存块数是:
");
output+=temp;
temp.Format(_T("%d"),M);
output+=temp;
temp=_T("\r\n下面给出的是[1,");
output+=temp;
temp.Format(_T("%d"),M);
output+=temp;
temp=_T("]的各个数作为分配给该作业的内存块数的情况!
");
output+=temp;
temp=_T("\r\n结论如下:
\r\n");
output+=temp;
for(m=1;m<=M;m++)
{
int*a=newint[m];
int*b=newint[m];
int*c=newint[m];
a[0]=b[0]=c[0]=change[0];
intj,ii;
for(i=1;i{
for(j=i;j{
for(ii=0;ii
if(a[ii]==change[j])break;
if(ii==i)
{
a[i]=b[i]=c[i]=change[j];break;
}
}
if(j==count)break;
}
intCountF=FIFO(a,m,pFIFO,count);
intCountL=LRU(b,m,pLRU,count);
intCountO=OPT(c,m,pOPT,count);
deletea;deleteb;deletec;
temp=_T("\r\n页面大小为:
");
output+=temp;
temp.Format(_T("%d"),Size/1024);
output+=temp;
temp=_T("K,分配给程序的内存块数是:
");
output+=temp;
temp.Format(_T("%d"),m);
output+=temp;
temp=_T("\r\nOPT算法的缺页率为:
");
output+=temp;
temp.Format(_T("%f"),CountO/(float)count);
output+=temp;
temp=_T("\r\nFIFO算法的缺页率为:
");
output+=temp;
temp.Format(_T("%f"),CountF/(float)count);
output+=temp;
temp=_T("\r\nLRU算法的缺页率为:
");
output+=temp;
temp.Format(_T("%f"),CountL/(float)count);
output+=temp;
}
UpdateData(FALSE);
}