实验目的
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
实验内容
(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
#include
#include
#include
#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;iblock[pos].accessed)
pos = i;//找到应予置换页面,返回BLOCK中位置
}
return pos;
}
//-------------------------------------------------------------
void display()
{
for(int i=0; i>pc;
cout<<"******按照要求产生的320个随机数:*******"<
潭浩强《C++程序设计》清华大学出版社 2004
任满杰等《操作系统原理实用教程》电子工业出版社 2006
汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社 2001