存储器管理.docx
《存储器管理.docx》由会员分享,可在线阅读,更多相关《存储器管理.docx(13页珍藏版)》请在冰豆网上搜索。
存储器管理
信息科学与技术学院实验报告
课程名称:
操作系统实验项目:
存储器管理
实验地点:
博西105指导教师:
乌兰图雅
日期:
2014.12.4实验类型:
综合性实验(验证性实验综合性实验设计性实验)专业:
12计算机
班级:
12计算机姓名:
王晓佳学号:
1214490030
一、实验目的及要求
1、实验目的:
1、设计模拟算法,调试程序,运行并分析结果,理解内存的动态存储管理方法和特点。
2、按照要求书写实验报告。
2、实验要求:
编写程序实现动态分区存储管理方式的主存分配与回收。
具体内容包括:
首先确定主存空间分配表;然后采用最先适应算法完成主存空间的分配与回收;最后编写主函数对所做工作进行测试
二、实验仪器、设备或软件
Windows7专业版SQLserver2008
三、实验内容及原理
#include"stdio.h"
#include"iostream.h"
typedefstruct{
intusetime;//该页从最近使用那一刻,到现在的时间
inttime;//进入内存块的时间
intfutime;//该页到将来最近一次使用的时间
intnumber;//页号
intsign;//0为空,1为有
}page;
typedefstruct{
pageR[10];//内存块儿
intn;
}RM;
voidgetdate(RM*p)
{
inti;
cout<<"输入内存块数:
";
cin>>p->n;
cout<<"页面个数为20\n";
for(i=0;in;i++)
{
p->R[i].sign=0;
}
}
voidFIFO(RM*p,intpagego[],intn)
{
inti,j,k=-2,max=0,m;
doublesum=0;
cout<<"是否缺页\t页面走向\t";
for(j=0;jn;j++)
cout<<"内存块"<for(i=0;i{
cout<<"\n\n";
for(j=0;jn;j++)
{
if(p->R[j].sign==0)
{
k=j;
}
elseif(p->R[j].number==pagego[i])
{
k=-1;
p->R[j].usetime--;
break;
}
}
if(k!
=-1&&k!
=-2)
{
p->R[k].number=pagego[i];
p->R[k].sign=1;
p->R[k].usetime=0;
cout<<"是\t";
sum=sum+1;
}
if(k==-1)
cout<<"否\t";
if(k==-2)
{
for(j=0;jn;j++)
if(max<=p->R[j].usetime)
{
max=p->R[j].usetime;
m=j;
}
p->R[m].number=pagego[i];
p->R[m].usetime=0;
cout<<"是\t";
sum=sum+1;
}
cout<<"\t"<for(j=0;jn;j++)
{
if(p->R[j].sign!
=0)
{
p->R[j].usetime++;
cout<<"\t"<R[j].number;
}
else
cout<<"\t*";
}
k=(-2);
max=0;
}
cout<<"\n\n缺页次数为:
"<sum=sum/n*100;
cout<<"缺页率为:
"<}
voidOPT(RM*p,intpagego[],intn)
{
inti,j,k=-2,max=0,m,a;
doublesum=0;
cout<<"是否缺页\t页面走向\t";
for(j=0;jn;j++)
cout<<"内存块"<for(i=0;i{
cout<<"\n\n";
for(j=0;jn;j++)
{
if(p->R[j].sign==0)
{
k=j;
}
elseif(p->R[j].number==pagego[i])
{
k=-1;
break;
}
}
if(k!
=-1&&k!
=-2)
{
p->R[k].number=pagego[i];
p->R[k].sign=1;
cout<<"是\t";
sum=sum+1;
}
if(k==-1)
cout<<"否\t";
if(k==-2)
{
for(j=n-1;j>i;j--)
for(a=0;an;a++)
{
if(pagego[j]==p->R[a].number)
p->R[a].futime=0;
p->R[a].futime++;
}
for(j=0;jn;j++)
if(max<=p->R[j].futime)
{
max=p->R[j].futime;
m=j;
}
p->R[m].number=pagego[i];
cout<<"是\t";
sum=sum+1;
}
cout<<"\t"<for(j=0;jn;j++)
{
if(p->R[j].sign!
=0)
{
cout<<"\t"<R[j].number;
}
else
cout<<"\t*";
}
k=(-2);
max=0;
}
cout<<"\n\n缺页次数为:
"<sum=sum/n*100;
cout<<"缺页率为:
"<}
voidLRU(RM*p,intpagego[],intn)//该算法与先进先出类似
{
inti,j,k=-2,max=0,m;
doublesum=0;
cout<<"是否缺页\t页面走向\t";
for(j=0;jn;j++)
cout<<"内存块"<for(i=0;i{
cout<<"\n\n";
for(j=0;jn;j++)
{
if(p->R[j].sign==0)
{
k=j;
}
elseif(p->R[j].number==pagego[i])
{
k=-1;
p->R[j].usetime=0;
break;
}
}
if(k!
=-1&&k!
=-2)
{
p->R[k].number=pagego[i];
p->R[k].sign=1;
p->R[k].usetime=0;
cout<<"是\t";
sum=sum+1;
}
if(k==-1)
cout<<"否\t";
if(k==-2)
{
for(j=0;jn;j++)
if(max<=p->R[j].usetime)
{
max=p->R[j].usetime;
m=j;
}
p->R[m].number=pagego[i];
p->R[m].usetime=0;
cout<<"是\t";
sum=sum+1;
}
cout<<"\t"<for(j=0;jn;j++)
{
if(p->R[j].sign!
=0)
{
p->R[j].usetime++;
cout<<"\t"<R[j].number;
}
else
cout<<"\t*";
}
k=(-2);
max=0;
}
cout<<"\n\n缺页次数为:
"<sum=sum/n*100;
cout<<"缺页率为:
"<}
intmain()
{
RMp;
intk,i;
intpagego[20];//页面走向
getdate(&p);
cout<<"输入页面调度总次数:
";
cin>>k;
cout<<"输入页面走向\n";
for(i=0;icin>>pagego[i];
cout<<"先进先出(FIFO)\n";
cout<<"---------\n";
FIFO(&p,pagego,k);
for(i=0;i
{
p.R[i].sign=0;
}
cout<<"最佳置换算法(OPT)\n";
cout<<"---------\n";
OPT(&p,pagego,k);
for(i=0;i
{
p.R[i].sign=0;
}
cout<<"最近最少使用算法(LRU)\n";
cout<<"---------\n";
LRU(&p,pagego,k);
return0;
}
四、实验步骤(或过程)
五、实验结论
分析讨论:
由于时间轮转法规定由各个准备就绪进程顺次轮流使用CPU,而且每一次使用时间一般规定为一定值当时间片结束时就强迫一个现行进程让出CPU,轮转法实现较简单,而可以保证不会有进程长期得不到响应,缺点是无法照顾一些特殊进程,最先优先数算法为一个进程设置一个优先数CPU调度时每次选择就绪队列里优先数最大的,让他占用CPU。
这种算法保证了不会有进程长期等待,
也能照顾到特殊进程,缺点是每次需重新计算进程优先级数,占用较多资源,适用性能较好的分时系统。
六、指导教师评语及成绩