实验四操作系统存储管理实验报告一、实验目的存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二、实验内容(1)通过计算不同算法的命中率比较算法的优劣。
同时也考虑了用户内存容量对命中率的影响。
页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。
在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。
(2)produce_addstream通过随机数产生一个指令序列,共320条指令。
A、指令的地址按下述原则生成:1)50%的指令是顺序执行的2)25%的指令是均匀分布在前地址部分3)25%的指令是均匀分布在后地址部分B、具体的实施方法是:1)在[0,319]的指令地址之间随机选取一起点m;2)顺序执行一条指令,即执行地址为m+1的指令;3)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;4)顺序执行一条指令,地址为m’+1的指令5)在后地址[m’+2,319]中随机选取一条指令并执行;6)重复上述步骤1)~5),直到执行320次指令C、将指令序列变换称为页地址流在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条~第9条指令为第0页<对应虚存地址为[0,9]);第10条~第19条指令为第1页<对应虚存地址为[10,19]);。
第310条~第319条指令为第31页<对应虚存地址为[310,319]);按以上方式,用户指令可组成32页。
(3)计算并输出下属算法在不同内存容量下的命中率。
1)先进先出的算法<FIFO);2)最近最少使用算法<LRU);3)最佳淘汰算法<OPT);4)最少访问页面算法<LFR);其中3)和4)为选择内容三、系统框图五运行结果首先打印出产生的指令信息,第一列为指令序列号,第二列为指令地址,第三列为指令所在的虚页号选择FIFO调度算法,并且内存从3也开始逐渐增加到32页,打印出缺页次数缺页率,命中率选择LRU调度算法,并且内存从3也开始逐渐增加到32页,打印出缺页次数缺页率,命中率选择OPT调度算法,并且内存从3也开始逐渐增加到32页,打印出缺页次数缺页率,命中率六实验程序产生指令流文件produce_addstream.h #ifndef PRODUCE_ADDSTREAM_H #define PRODUCE_ADDSTREAM_H #include<stdio.h>#include<stdlib.h>#include<time.h>#include<iomanip.h>#include<vector>using namespace std。
#define random(x> (rand(>%x>#define MAX_LENGTH 320struct produce{int num。
//指令序号int zhiling。
//指令地址int virtualpage。
//指令虚页号produce *next。
}。
struct produce*creatlist(>。
void insert(struct produce *first,struct produce *s>。
//插入一个节点<尾插法)void print(struct produce *first>。
//打印函数int max(vector<vector<int> >,int >。
struct produce*creatlist(>{srand((int>time(0>>。
struct produce*first=new produce。
first->next=NULL。
int m=0,m1=0。
/*int yanzheng[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1}。
for (int i=0。
i<(MAX_LENGTH/4>。
i++>{struct produce *s0。
s0=new produce。
s0->num=i*4+0。
s0->zhiling=yanzheng[i*4+0]。
s0->virtualpage=s0->zhiling。
insert(first,s0>。
struct produce *s1。
s1=new produce。
s1->num=i*4+1。
s1->zhiling=yanzheng[i*4+1]。
s1->virtualpage=s1->zhiling。
insert(first,s1>。
struct produce *s2。
s2=new produce。
s2->num=i*4+2。
s2->zhiling=yanzheng[i*4+2]。
s2->virtualpage=s2->zhiling。
insert(first,s2>。
struct produce *s3。
s3=new produce。
s3->num=i*4+3。
s3->zhiling=yanzheng[i*4+3]。
s3->virtualpage=s3->zhiling。
insert(first,s3>。
}//*///*for (int i=0。
i<(MAX_LENGTH/4>。
i++>{struct produce *s0。
s0=new produce。
m=random(MAX_LENGTH>。
s0->num=i*4+0。
s0->zhiling=m+1。
s0->virtualpage=s0->zhiling/10。
insert(first,s0>。
m1=random(m+1>。
struct produce *s1。
s1=new produce。
s1->num=i*4+1。
s1->zhiling=m1。
s1->virtualpage=s1->zhiling/10。
insert(first,s1>。
struct produce *s2。
s2=new produce。
s2->num=i*4+2。
s2->zhiling=m1+1。
s2->virtualpage=s2->zhiling/10。
insert(first,s2>。
struct produce *s3。
s3=new produce。
s3->num=i*4+3。
s3->zhiling=random(MAX_LENGTH-m1-2>+m1+2。
s3->virtualpage=s3->zhiling/10。
insert(first,s3>。
}//*/return first。
}void insert(struct produce *first,struct produce *s>{struct produce *r=first。
struct produce *p。
while(r>{p=r。
r=r->next。
}p->next=s。
p=s。
p->next=NULL。
}void print(struct produce *first> //打印函数{struct produce *p。
p =first->next。
cout<<"随机产生的指令的信息如下"<<endl。
cout<<"指令序号 "<<"指令地址 "<<"指令虚页号"<<endl。
while (p>{cout<<p->num<<'\t'<<p->zhiling<<setw(14><<p->virtualpage<<endl。
p=p->next。
}}int max(vector<vector<int> > page,int Maxpage>{int a=0,position=0。
for (int i=0。
i<Maxpage。
i++>{if (page[i][1]>a>{a=page[i][1]。
position=i。
}}return position。
}#endif先来先出调度算法:fifo.h#ifndef FIFO_H#define FIFO_Hvoid fifo(struct produce *first,int Maxpage>{vector<int> page(Maxpage>。
//for (int i=0。
i<Maxpage。
i++>page[i]=-1。
int rear=0。
//定义一个变量,指向要被替换的位置int pages。
//定义变量保存当前指令的所在的地址int count1=0。
//int count2=0。
//缺页次数int find=1。
struct produce *p=first->next。
while (p>{pages=p->virtualpage。
for(int i=0。
i<Maxpage。
i++>{if (page[i]==-1||count1<Maxpage>{page[i]=pages。
count1 ++。
count2 ++。
find =1。
break。
}else if (page[i]==pages>{find =1。
break。
}find=0。
}if (find==0>{page[rear]=pages。
rear ++。
rear=rear%Maxpage。
count2 ++。
}p=p->next。
}cout<<"FIFO调度算法缺页次数缺页率命中率"<<endl。
cout<<count2<<setw(25><<double(count2>/MAX_LENGTH<<setw(10><<1 -double(count2>/MAX_LENGTH<<endl。