页面存储管理系统
2013-12-08 20:58
225 查看
#include<stdlib.h>
#include<time.h>
#include <iostream>
#define Bsize 3 //页面块数
#define Psize 20
using namespace std;
struct pageInfor
{
int ID; //页面号
int visit; //被访问标记
};
pageInfor * block; //物理块
pageInfor * page; //页面号串
class SWM
{
private:
int i;
int count;
public:
//置初值
void BlockClear()
{
for(int i=0; i<Bsize; i++)
{
block[i].ID = -1;
block[i].visit = 0;
}
}
//初始化
void inital()
{
int QString[Psize]={0};
srand(time(0));
for(int i=0;i<20;i++)
{
QString[i]=rand()%10;
printf("%d",QString[i]);
}
cout<<endl;
block = new pageInfor[Bsize];
BlockClear();
page = new pageInfor[Psize];
for(i=0; i<Psize; i++)
{
page[i].ID = QString[i];
page[i].visit = 0;
}
}
//查找是否有空闲内存
int findSpace()
{
for(int i=0; i<Bsize; i++)
if(block[i].ID == -1)
return i;//找到空闲内存,返回BLOCK中位置
return -1;
}
//查找内存中是否有该页面
int findExist(int curpage)
{
for(int i=0; i<Bsize; i++)
if(block[i].ID == page[curpage].ID)
return i;//找到内存中有该页面,返回BLOCK中位置
return -1;
}
//查找应予置换的页面
int findReplace()
{
int pos = 0;
for(int i=0; i<Bsize; i++)
if(block[i].visit >= block[pos].visit)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
}
//显示
void display()
{
cout<<"\n";
for(int i=0; i<Bsize; i++)
if(block[i].ID != -1)
cout<<block[i].ID<<" ";
cout<<endl;
cout<<"\n";
}
//FIFO算法
void FIFO()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
count++;
}
}
for(int j=0; j<Bsize; j++)
block[j].visit++;//BLOCK中所有页面visit++
}
cout<<"\nFIFO算法的缺页率是:"<<(float)count/20<<endl;
}
//LRU算法
void LRU()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;;
block[exist].visit = -1;//恢复存在的并刚访问过的BLOCK中页面visit为-1
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
count++;
}
}
for(int j=0; j<Bsize; j++)
{
block[j].visit++;
}
}
cout<<"\n LRU算法的缺页率是:"<<(float)count/20<<endl;
}
//OPT算法
void OPT()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
for(int k=0; k<Bsize; k++)
for(int j=i; j<Psize; j++)
{
if(block[k].ID != page[j].ID)
{
block[k].visit = 1000;
}
else
{
block[k].visit = j;
break;
}
}
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
}
}
}
}
};
void main()
{
int ch;
SWM test;
printf("\t\t 页面置换算法 \n");
printf("\t\t 虚拟内存 \n");
printf("\t\t 1、产生随机序列 \n");
printf("\t\t 2、最久未使用(LRU) \n");
printf("\t\t 3、先进先出(FIFO) \n");
printf("\t\t 4、最佳置换算法(OPT) \n");
// printf("\t\t 5、三种算法的比较()
// cout<<"计算机随机产生一组种子:";
// test.inital();
while(ch)
{
cin>>ch;
switch(ch)
{
case 1:
cout<<"计算机随机产生一组种子:";
test.inital();
test.BlockClear();
cout<<endl;
cout<<"进程块数是3"<<endl;
cout<<"请选择算法"<<endl;
break;
case 2:
cout<<"LRU:"<<endl;
test.LRU();
test.BlockClear();
cout<<endl;
break;
case 3:
cout<<"FIFO:"<<endl;
test.FIFO();
test.BlockClear();
cout<<endl;
break;
case 4:
cout<<"LRU:"<<endl;
test.OPT();
test.BlockClear();
cout<<endl;
break;
default:
cout<<"ERROR COMMAND!"<<endl;
getchar();
break;
}
}
}
#include<time.h>
#include <iostream>
#define Bsize 3 //页面块数
#define Psize 20
using namespace std;
struct pageInfor
{
int ID; //页面号
int visit; //被访问标记
};
pageInfor * block; //物理块
pageInfor * page; //页面号串
class SWM
{
private:
int i;
int count;
public:
//置初值
void BlockClear()
{
for(int i=0; i<Bsize; i++)
{
block[i].ID = -1;
block[i].visit = 0;
}
}
//初始化
void inital()
{
int QString[Psize]={0};
srand(time(0));
for(int i=0;i<20;i++)
{
QString[i]=rand()%10;
printf("%d",QString[i]);
}
cout<<endl;
block = new pageInfor[Bsize];
BlockClear();
page = new pageInfor[Psize];
for(i=0; i<Psize; i++)
{
page[i].ID = QString[i];
page[i].visit = 0;
}
}
//查找是否有空闲内存
int findSpace()
{
for(int i=0; i<Bsize; i++)
if(block[i].ID == -1)
return i;//找到空闲内存,返回BLOCK中位置
return -1;
}
//查找内存中是否有该页面
int findExist(int curpage)
{
for(int i=0; i<Bsize; i++)
if(block[i].ID == page[curpage].ID)
return i;//找到内存中有该页面,返回BLOCK中位置
return -1;
}
//查找应予置换的页面
int findReplace()
{
int pos = 0;
for(int i=0; i<Bsize; i++)
if(block[i].visit >= block[pos].visit)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
}
//显示
void display()
{
cout<<"\n";
for(int i=0; i<Bsize; i++)
if(block[i].ID != -1)
cout<<block[i].ID<<" ";
cout<<endl;
cout<<"\n";
}
//FIFO算法
void FIFO()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
count++;
}
}
for(int j=0; j<Bsize; j++)
block[j].visit++;//BLOCK中所有页面visit++
}
cout<<"\nFIFO算法的缺页率是:"<<(float)count/20<<endl;
}
//LRU算法
void LRU()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;;
block[exist].visit = -1;//恢复存在的并刚访问过的BLOCK中页面visit为-1
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
count++;
}
}
for(int j=0; j<Bsize; j++)
{
block[j].visit++;
}
}
cout<<"\n LRU算法的缺页率是:"<<(float)count/20<<endl;
}
//OPT算法
void OPT()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
for(int k=0; k<Bsize; k++)
for(int j=i; j<Psize; j++)
{
if(block[k].ID != page[j].ID)
{
block[k].visit = 1000;
}
else
{
block[k].visit = j;
break;
}
}
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
}
}
}
}
};
void main()
{
int ch;
SWM test;
printf("\t\t 页面置换算法 \n");
printf("\t\t 虚拟内存 \n");
printf("\t\t 1、产生随机序列 \n");
printf("\t\t 2、最久未使用(LRU) \n");
printf("\t\t 3、先进先出(FIFO) \n");
printf("\t\t 4、最佳置换算法(OPT) \n");
// printf("\t\t 5、三种算法的比较()
// cout<<"计算机随机产生一组种子:";
// test.inital();
while(ch)
{
cin>>ch;
switch(ch)
{
case 1:
cout<<"计算机随机产生一组种子:";
test.inital();
test.BlockClear();
cout<<endl;
cout<<"进程块数是3"<<endl;
cout<<"请选择算法"<<endl;
break;
case 2:
cout<<"LRU:"<<endl;
test.LRU();
test.BlockClear();
cout<<endl;
break;
case 3:
cout<<"FIFO:"<<endl;
test.FIFO();
test.BlockClear();
cout<<endl;
break;
case 4:
cout<<"LRU:"<<endl;
test.OPT();
test.BlockClear();
cout<<endl;
break;
default:
cout<<"ERROR COMMAND!"<<endl;
getchar();
break;
}
}
}
相关文章推荐
- 操作系统页面存储管理系统
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现高性能的ASP.NET管理页面自动生成
- 用ASP.NET实现简单的超市管理系统-商品主页面
- 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。
- c++ 计算机操作系统虚拟页式存储管理系统仿真实现
- 学生信息管理小系统(以XML为存储方式)
- 关系管理系统:显示所有用户jsp页面
- 初学构建小项目之仓库管理系统数据库及表的创建及登录页面的实现(一)
- 数据结构课程设计-通讯录管理系统c++版(顺序表存储,折半查找,递增排序)
- 管理系统存储
- android各大手机系统打开权限管理页面
- 管理系统存储
- Andorid 源码5.1 调用系统文件管理页面
- C#.NET通用权限管理系统组件中用少数几行代码实现记录页面状态
- 2.9 linux存储管理-页面的换入
- IBM pSeries AIX System Administration -- 存储管理、LVM 和文件系统一
- ASP.NET动态网站开发培训-24.论文管理系统(四、制作Login页面和后台论文管理主页)
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现高性能的ASP.NET管理页面自动生成
- 学生信息管理小系统(以XML为存储方式)
- 文件系统管理 之 在Linux系统中存储设备的两种表示方法