您的位置:首页 > 其它

页面存储管理系统

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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: