操作系统-请求页式存储管理实验报告分析解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统
实验三
存储管理实验
班级:
学号:
姓名:
目录
1. 实验目的 (2)
2. 实验内容 (2)
(1) 通过随机数产生一个指令序列,共320条指令 (2)
(2) 将指令序列变换成为页地址流 (2)
(3) 计算并输出下述各种算法在不同内存容量下的命中率 (2)
3. 随机数产生办法 (3)
环境说明 (3)
4. 程序设计说明 (3)
4.1.全局变量 (3)
4.2.随机指令序列的产生 (4)
4.3.FIFO算法 (4)
4.4.LRU算法 (4)
4.5.OPT算法 (5)
5. 编程实现(源程序): (5)
6. 运行结果及分析 (11)
6.1.运行(以某两次运行结果为例,列表如下:) (11)
6.2.Belady’s anomaly (11)
1.实验目的
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2.实验内容
(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) 重复上述步骤a)~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);
命中率=1-页面失效次数/页地址流长度
在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
3.随机数产生办法
关于随机数产生办法,可以采用操作系统提供的函数,如Linux或UNIX系统提供函数srand()和rand(),分别进行初始化和产生随机数。例如:
srand();
语句可以初始化一个随机数;
a[0]=10*rand()/32767*319+1;
a[1]=10*rand()/32767*a[0];
…
语句可以用来产生a[0]与a[1]中的随机数。
环境说明
此实验采用的是Win7下Code::blocks 10.05编译器编程。
此word实验文档中采用notepad++的语法高亮。
4.程序设计说明
4.1.全局变量
const int maxn =320;//序列个数
const int max = maxn +20;//数组大小
const int maxp = max/10;//最大页数
int inst[max];//指令序列
int page[max];//页地址流
int size;//内存能容纳的页数
bool in[maxp];//该页是否在内存里,提高效率
int pin[maxp];//现在在内存里的页
其中in[]数组是为了方便直接判断该页是否在内存里,而不用遍历内存里所有页来判断。
fault_n用来记录缺页次数。
4.2.随机指令序列的产生
按照实验要求的写了,但是由于没有考虑细节,开始时出了点问题。
(1)当m=319时,我们顺序执行m+1会产生第32页的页地址,从而使页地址没能按要求限制在[0, 31]之间。
解决方法:采用循环模加来避免超出范围。
(2)但是这样之后有可能出现模0的问题。所以我索性将等于0的模数都赋值为160.
最后的程序如下。
void produce_inst()
{
int m, n;
int num =0;
while(num < maxn)
{
m = rand()% maxn;
inst[num++]=(m+1)%maxn;
if(num == maxn)break;
m =(m+2)% maxn;
if(m ==0) m =160;
n = rand()% m;
inst[num++]=(n+1)%maxn;
if(num == maxn)break;
n =(n+2)% maxn;
m = maxn - n;
if(m ==0) m =160;
m = rand()% m + n;
inst[num++]= m;
}
}
4.3.FIFO算法
定义变量ptr。
一开始先预调页填满内存。在这一部分,ptr指向下一个要存放的位置。
之后继续执行剩下的指令。此时,ptr表示队列最前面的位置,即最先进来的位置,也就是下一个要被替换的位置。ptr用循环加,即模拟循环队列。
4.4.LRU算法
定义数组ltu[],即last_time_use来记录该页最近被使用的时间。
定义变量ti模拟时间的变化,每执行一次加一。