操作系统试验六

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六虚拟存储管理

一.实验目的:

存储管理的主要功能之一是合理的分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换方法。二.实验内容及要求:

(1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:

①、50%的指令是顺序执行的;

②、25%的指令是均匀分布在前地址部分;

③、25%的指令是均匀分布在后地址部分。

具体的实施方法是:

①在[0,319]的指令地址之间随机选取一起点m;

②顺序执行一条指令,即执行地址为m+1的指令;

③在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;

④顺序执行一条指令,其地址为m’+1;

⑤在后地址[m’+2,319]中随机选取一条指令并执行;

⑥重复上述步骤,直至执行320次指令。

(2)将指令序列变换成页地址流

设:①页面大小为1K;

②用户内存容量为4页;

③用户虚存容量为32K;

在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:

第0条~第9条指令为第0页(对应的虚存地址为[0,9]);

第10条~第19条指令为第1页(对应的虚存地址为[10,19]);

第310条~第319条指令为第31页(对应的虚存地址为[310,319]);

按以上方式,用户指令可组成32页。模拟该作业的执行过程。目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。

(3)计算并输出下述各种算法在不同的内存容量下的缺页率。

①先进先出的算法(FIFO);

②最近最少使用算法(LRR);

③最佳淘汰法(OPT):先淘汰最不常用的页地址;

④最少访问页面算法(LFR);

⑤最近不经常使用算法(NUR)。

其中③和④为选做内容。

缺页率=(页面失效次数)/(页地址流长度)

在本实验中,页地址流的长度为320,页面失效次数为每次访问相

应指令时,该指令所对应的页不在内存的次数。

(4) 随机数产生办法

关于随机数产生办法,可以使用系统提供函数rand(),分别进行初始化

和产生随机数。例如:rand();语句可初始化的一个随机数;

a[0]=10*rand()/32767*319+1;

a[1]=10*rand()/32767*a[0];

语句可用来产生a[0]与a[1]中的随机数。

三.实验主要步骤:

关于随机数的产生办法。首先要初始化设置随机数,产生序列的开始点,例如,通过下列语句实现:srand ( 400 ) ;

(1) 计算随机数,产生320条指令序列

m=160;

for (i=0;i<80;i++=

{

j=i﹡4;a[j]=m;a[j+1]=m+1;

a[j+2]=a[j] ﹡1.0﹡rand( )/32767;

a[j+3]=a[j+2]+1

m=a[j+3]+(319-a[j+3]) ﹡1.0﹡rand( )/32767;

}

(2) 将指令序列变换成为页地址流

for ( k=0;k<320;k++)

{ pt=a[k]/10;

pd= a[k]%10;…

}

(3) 计算不同算法的命中率

rate=1-1.0﹡U/320 ;

其中U为缺页中断次数,320是页地址流长度。

(4) 输出格式

k fifo 1ru

4 0.23 0.25

32 1.0 1.0

四.实验的主要代码:

int* build()

{

printf("随机产生一个进程序列号为:\n");

srand(time(NULL)); for(int i=0; i

{

pro[i] = rand()%10; printf("%d ",pro[i]);

}

printf("\n"); return(pro);

}

//*****//查找空闲物理

int searchpb()

{

for(j=0; j

{if(phb[j] == 0)

{ m = j; return m; break;

}

}return -1;

}

//************//查找相同进程

int searchpro()

{for(j = 0; j < bsize; j++)

{

if(phb[j] == pro[i])

{

n = j;

return j;

}

}

return -1;

}

//****************//初始化内存

void empty()

{

for(i=0;i

}

//先进先出页面置换算法

void FIFO()

{ for(i = 0; i

{

m=searchpb(); n=searchpro();//找flag值最大的

for(j = 0; j < bsize;j++)

{ if(flag[j]>maxflag)

{

maxflag = flag[j]; max = j;

} }

if(n == -1) //不存在相同进程

{

if(m != -1) //存在空闲物理块

{

phb[m] = pro[i]; //进程号填入该空闲物理块

count++;flag[m] = 0; for(j = 0;j <= m; j++)

{ flag[j]++;

}

m = -1;

}

else //不存在空闲物理块

{

phb[max] = pro[i]; flag[max] = 0; for(j = 0;j < bsize; j++)

{ flag[j]++;

}

max = -1;

相关文档
最新文档