操作系统 请求分页存储管理模拟实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统请求分页存储管理模拟实现

#include

#include

#include"windows.h"

#include"os.h"

#define n 64//实验中假定主存的长度

#define m 4//实验中假定每个作业分得主存块块数

int p[m];//定义页

struct

{

short int lnumber;//页号

short int flag;//表示该页是否在主存,“1”表示在主存,“0”表示不在主存 short int pnumber;//该页所在主存块的块号

short int write;//该页是否被修改过,“1”表示修改过,“0”表示没有修改过 short int dnumber;//该页存放在磁盘上的位置,即磁盘块号

short int times;//被访问的次数,用于LRU算法

}page[n];//定义页表

//各个函数的实现如下:

computer::computer()

{

int i;

for(i=0;i

{

page[i].lnumber = i;

page[i].flag = 0;

page[i].pnumber = 10000;//用10000表示为空

page[i].write = 0;

page[i].dnumber = i;

page[i].times = 0;

}//初始化页表

for(i=0;i

{

page[i].pnumber = i;

}

for(i=0;i

{

p[i] = i;

page[i].flag = 1;

}//初始化页

}

void computer::showpagelist()

{

int i;

cout<<"页号"<<"\t"<<"是否在主存中"<<"\t"<<"块号"<<"\t"<<"是否被修改过"<<"\t"<<"磁盘块号"<<"\t"<<"访问次数"<

for(i=0;i

{

cout<

"<

"<

}

}

void computer::showpage()

{

int i;

for(i=0;i

{

cout<<"\t"<

}

cout<

}

void computer::transformation()

{

unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber; int i,head=0,fail = 0;

int method,temppage=0;

short int times = 10000;

cout<<"请输入一个逻辑地址(四位十六进制数):";

cin>>hex>>logicAddress;//读入逻辑地址

logicNumber = logicAddress >> 10;//得到页号

cout<<"页号为:"<

innerAddress = logicAddress & 0x03ff;//得到页内地址

cout<<"页内地址为:"<

for(i=0;i

{

if(logicNumber==(unsigned)page[i].lnumber)

{

if(page[i].flag == 1)

{

cout<<"请求的页面在主存中!"<

page[i].times++;

physicsNumber = page[i].pnumber;//由页号得到块号

cout<<"请求的主存块号为:"<

physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址

cout<<"请求的物理地址为:"<

break;

}

else

{

cout<<"请求的页面不在主存中! 将进行缺页中断处理!"<

cout<<"1.先进先出"<

cin>>method;

if(method == 1) //采用先进先出算法

{

cout<<"采用先进先出算法!"<

fail = p[head];

cout<<"第"<

p[head] = logicNumber;

head = (head+1) % m;

if(page[fail].write == 1)

cout<<"第"<

page[fail].flag = 0;

page[logicNumber].flag = 1;

page[logicNumber].write = 0;

page[logicNumber].pnumber = page[fail].pnumber;

page[fail].pnumber = 10000;

page[logicNumber].times++;

break;

}

else if(method == 2) //采用最近最少用算法

{

cout<<"采用最近最少用算法!"<

for(i=0;i

{

if(page[i].flag == 1)

{

if(page[i].times

{

times = page[i].times;

temppage = page[i].lnumber;

}

}

}

cout<<"第"<

for(i=0;i

相关文档
最新文档