操作系统 请求分页存储管理模拟实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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