您的位置:首页 > 其它

【实验】请求调页存储管理方式的模拟

2013-01-12 13:30 369 查看
实验目的

本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

 

 

实验内容

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

a、50%的指令是顺序执行的。

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

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

 

具体的实施方法是:

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

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

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

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

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

f、 
重复上述步骤,直至执行320次指令

 

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

设:

a、 
页面大小为1K

b、 
用户内存容量为4页到32页

c、 
用户虚存容量为32K

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

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

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

        ……………………

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

按以上方式,用户指令可组成32页。

 

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

     a、先进先出置换算法(FIFO)

     b、最近最少使用置换算法(LRU)

     c、最佳置换算法(OPT)

     

在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。

3.随机数产生办法

关于随机数产生办法,Linux系统提供函数srand()和rand(),分别进行初始化和产生随机数。

例如:

srand();

语句可初始化一个随机数;

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

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

………………………

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

 

 

1.假设每个页面中可存放10条指令,分配给作业的内存块数为4。

2.通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解

3.用C语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需进行页面置换,最后显示其物理地址,并转下一条指令。在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

4.置换算法:最佳置换(OPT)算法。

 

 

实验的运行结果为:

地址流序列:1 4 7 3 3 1 2 1 3 1 7 3 6 6

M=3时FIFO的命中率为:26.6667%  M=3时LRU的命中率为:30%

M=4时FIFO的命中率为:36.6667%  M=4时LRU的命中率为:36.6667%

M=5时FIFO的命中率为:50%  M=3时LRU的命中率为:46.6667%

M=6时FIFO的命中率为:66.6667%  M=6时LRU的命中率为:63.3333%

 

 

 

#include <iostream.h>

#include<stdlib.h>

#include<conio.h>

#include<stdio.h>

#define Bsize 4

typedef struct BLOCK//声明一种新类型——物理块类型

{

int pagenum;//页号

int accessed;//访问字段,其值表示多久未被访问

}BLOCK;

int pc;//程序计数器,用来记录指令的序号

int n;//缺页计数器,用来记录缺页的次数

static int temp[320];//用来存储320条随机数

BLOCK block[Bsize]; //定义一大小为4的物理块数组

//*************************************************************

void init(); //程序初始化函数

int findExist(int curpage);//查找物理块中是否有该页面

int findSpace();//查找是否有空闲物理块

int findReplace();//查找应予置换的页面

void display();//显示

void suijishu();//产生320条随机数,显示并存储到temp[320]

void pagestring();//显示调用的页面队列

void OPT();//OPT算法

//-------------------------------------------------------------

void init()

{

for(int i=0;i<Bsize;i++)

{

block[i].pagenum=-1;

block[i].accessed=0;

pc=n=0;

}

}

//-------------------------------------------------------------

int findExist(int curpage)

{

for(int i=0; i<Bsize; i++)

{

if(block[i].pagenum == curpage )

return i;//检测到内存中有该页面,返回block中的位置

}

return -1;

}

//-------------------------------------------------------------

int findSpace()

{

for(int i=0; i<Bsize; i++)

{

if(block[i].pagenum == -1)

return i;//找到空闲的block,返回block中的位置

}

return -1;

}

//-------------------------------------------------------------

int findReplace()

{

int pos = 0;

for(int i=0; i<Bsize; i++)

{

if(block[i].accessed >block[pos].accessed)

pos = i;//找到应予置换页面,返回BLOCK中位置

}

return pos;

}

//-------------------------------------------------------------

void display()

{

for(int i=0; i<Bsize; i++)

{

if(block[i].pagenum != -1)

{

printf(" %02d",block[i].pagenum);

}

}

cout<<endl;

}

//-------------------------------------------------------------

void suijishu()

{

int flag=0;

cin>>pc;

cout<<"******按照要求产生的320个随机数:*******"<<endl;

for(int i=0;i<320;i++)

{

temp[i]=pc;

if(flag%2==0) pc=++pc%320;

if(flag==1) pc=rand()% (pc-1);

if(flag==3) pc=pc+1+(rand()%(320-(pc+1)));

flag=++flag%4;

printf(" %03d",temp[i]);

if((i+1)%10==0) cout<<endl;

}

}

//-------------------------------------------------------------

void pagestring()

{

for(int i=0;i<320;i++)

{

printf(" %02d",temp[i]/10);

if((i+1)%10==0) cout<<endl;

}

}

//-------------------------------------------------------------

void OPT()

{

int exist,space,position ;

int curpage;

for(int i=0;i<320;i++)

{

//if(i%100==0) getch();

pc=temp[i];

curpage=pc/10;

exist = findExist(curpage);

if(exist==-1)

}

}

void main()

{

int  select;

cout<<"请输入第一条指令号(0~320):";

suijishu();

cout<<"*****对应的调用页面队列*******"<<endl;

pagestring();

cout<<"最佳置换算法OPT:"<<endl;

cout<<"*****************"<<endl;

OPT();

}


 

 

潭浩强《C++程序设计》清华大学出版社   2004

任满杰等《操作系统原理实用教程》电子工业出版社  2006

汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社 2001
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息