存储器管理

  • 格式:doc
  • 大小:185.00 KB
  • 文档页数:6

操作系统实验报告
题目:存储器管理
专业:
班级:
学号:
姓名:
2012年12 月21日
一、实验内容
编程模拟实现存储器页面置换的常用算法,调试分析相关存储器管理程序,加深对存储器页面置换常用算法的理解和实现技巧。

二、实验要求
1、自定义存储器管理有关的数据结构;
2、依据最佳置换算法(OPTIMAL)、先进先出置换算法(FIFO)、最近最久未使用算法(LRU)原理,编写对应函数,模拟系统的存储器页面置换功能;
3、为了更好地模拟和评价算法的性能,允许用户自行指定可用页块数并输入需访问的页面号序列;
4、统计以上算法实际需要的总页面数、缺页中断次数以及它们的缺页率;
5、比较/分析以上算法的置换性能,并作出自己的评价。

三、实验步骤
存储结构及其定义
struct Page{
int num; //页面号
int timer; //计时
};
class pagepro{
public:
pagepro(int pstr[]);
int findspace(); //若内存块中有空,返回该位置
int findhave(int p); //若内存块中已有页,返回内存块中位置
int findreplace(); //找到替换页的位置(for LRU)
int findreplace(int i); //找到替换页的位置(for OPT)
void clear(); //清理内存块
void display(); //打印内存块信息
int LRU(); //最近最久未使用算法
int FIFO(); //先进先出算法
int OPT(); //最佳置换算法
Page *block; //内存块
Page *page; //页面号串
};
pagepro::pagepro(int pstr[]){
int i=0;
block=new Page[Bsize];
for(i=0;i<Bsize;i++){
block[i].num=-1;
block[i].timer=0;
}
page=new Page[Psize];
for(i=0;i<Psize;i++){
page[i].num=pstr[i];
page[i].timer=0;
}
}
int pagepro::findspace(){
for(int i=0;i<Bsize;i++){
if(block[i].num==-1)
return i;
}
return -1;
}
int pagepro::findreplace(int i){
int pos[3]={0};
int postion=0;
for(int j=0;j<Bsize;j++){
for(int k=i;k<Psize;k++){
if(block[j].num==page[k].num)
break;
else
pos[j]++;
}
}
for(j=1;j<Bsize;j++){
if(pos[j] > pos[postion])
postion=j;
}
return postion;
}
int pagepro::findhave(int p){
for(int i=0;i<Bsize;i++){
if(block[i].num==page[p].num)
return i;
}
return -1;
}
void pagepro::display(){
for(int i=0;i<Bsize;i++){
if(block[i].num !=-1)
cout<<block[i].num<<" ";
}
cout<<endl;
}
int pagepro::findreplace(){
int pos=0;
for(int i=1;i<Bsize;i++){
if(block[i].timer > block[pos].timer)
pos = i;
}
return pos;
}
void pagepro::clear(){
for(int i=0;i<Bsize;i++){
block[i].num=-1;
block[i].timer=0;
}
}
int pagepro::LRU(){
int have,space,pos;
int count=0; //不缺页计数
for(int i=0;i<Psize;i++){
have=findhave(i);
if(have != -1){
count++;
block[have].timer=-1;
cout<<"page find in block!"<<endl;
}
else{
space=findspace();
if(space != -1){
block[space]=page[i];
display();
}
else{
pos=findreplace();
block[pos]=page[i];
display();
}
}
for(int i=0;i<Bsize;i++)
block[i].timer++;
}
return count;
}
int pagepro::FIFO(){
int have;
int j=0; //j%3 记录替换位置int count=0;
for(int i=0;i<Psize;i++){
have=findhave(i);
if(have!=-1){
count++;
cout<<"page find in block!"<<endl; }
else{
block[j%3]=page[i];
j++;
display();
}
}
return count;
}
int pagepro::OPT(){
int have,space;
int count=0;
for(int i=0;i<Psize;i++){
have=findhave(i);
if(have!=-1){
cout<<"page find in block!"<<endl;
count++;
}
else{
space=findspace();
if(space!=-1){
block[space]=page[i];
display();
}
else{
block[findreplace(i)]=page[i];
display();
}
}
}
return count;
}
四、实验结果
1、程序执行的主界面
2、LRU
3、FIFO
4、OPT。