操作系统实验报告3虚拟存储.docx
- 文档编号:3849497
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:13
- 大小:76.67KB
操作系统实验报告3虚拟存储.docx
《操作系统实验报告3虚拟存储.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告3虚拟存储.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验报告3虚拟存储
计师101徐翼飞1013012015
虚拟存储器管理
1.实验目的
模拟请求分页虚拟存储器管理技术中的硬件地址变换。
缺页中断以及页式淘汰算法,处理缺页中断。
2.实验内容
1.模拟请求分页存储管理中的硬件地址变换的过程
2. 采用先进先出算法实现分页管理的缺页调度
3.1数据结构设计
1)创建结构体page为进程的页表
structpage
{
inti;//页号
intflag;//有效位
intnumber;//主存块号
longaddress;//外存地址
intchange;//修改位
};
2)定义结构体order为存储指令
structorder
{
charp[10];
inti1;//页号
intoffset;//偏移量
};、
3)定义数组p用来存放空闲进程块的信息
int*p=newint[n];
4)定义类process
classprocess
{
private:
page*a;
intM;//数组的长度
int*p;
intN;//页表的长度
inthead;
int*spare;
public:
process()//构造函数
{}
~process()//析构函数
{}
voidoperate(order*s)//分页存储管理
{}
intFIFO(inti)//先进先出算法
{}
voidshow()//输出显示
{}
}
3.3算法设计
i)构造函数对所有变量初始化
step1:
:
输入进程的页数
cin>>n;
a=newpage[n];//定义为该进程存储的页表
N=n;//页表的长度
step2:
初始化页表项
a[i].i=i;
a[i].flag=0;
a[i].number=-1;
a[i].address=11+i;
a[i].change=0;
step3:
输入进程空闲块的数目
cin>>n;
M=n;//主存中空闲的块的数量
p=newint[n];
spare=newint[n];//定义空闲块的块号
head=0;
cout<<"请输入"< "< for(i=0;i { cin>>k;//空闲的块号 spare[i]=k; p[head]=-1;//初始的时候-1表示内存当前的块为空 head=(head+1)%M; } head=0; for(intj=0;j { p[head]=head; a[head].flag=1; a[head].number=spare[head]; } ii).模拟请求分页存储管理 step1: 输入指令 s=neworder;//定义一个结构体变量。 cout<<"请输入操作: "< cin>>s->p; cout<<"请输入页号: "< cin>>s->i1; cout<<"请输入偏移量: "< cin>>s->offset; Step2: 调用模拟请求分页存储管理函数 Step1: 看a[s->i1].flag是否为1,为1说明要操作的块在内存之中在判断操作是否为存操作,为存操作的话则置修改位为1. if(a[s->i1].flag==1) { cout<<"主存物理地址为: "<<(a[s->i1].number*64+s->offset)< if(strcmp(s->p,"存")==0) a[s->i1].change=1; } Step2: 如果当前要操作的块不在内存之中则发生缺页调用先进先出算法来进行调度 else { cout<<"发生了缺页中断,运行中断处理程序。 "< if(FIFO(s->i1)==1) operate(s); else cout<<"出错。 "< } iii)先进先出算法实现分页管理的缺页调度 step1: 看看内存中没无空闲的块,有的话将块请入内存并且设置相应的参数。 if(p[head]==-1)//head指针指向空闲的块将其请入内存 { p[head]=i;//将要操作的进程块的块号存入存放空闲进程块的表 a[i].flag=1;//有效位为1 a[i].number=spare[head];//主存块表号修改 head=(head+1)%M; return1;//返回成功。 } step2: 内存没有空闲的块则将内存最先进入内存的块请出到兑换区再将进程请入到内存中。 并且修改相应的信息。 else { a[p[head]].flag=0;请出兑换区 a[p[head]].number=-1; if(a[p[head]].change==1) cout<<"将本页面写入交换区"< a[p[head]].change=0; p[head]=i;//请入内存。 a[i].flag=1; a[i].number=spare[head]; cout<<"装入"< head=(head+1)%M; return1;//返回成功。 } 4.运行结果 源程序: #include #include #include usingnamespacestd; structpage { inti; intflag; intnumber; longaddress; intchange; }; structorder { charp[10]; inti1;//页号 intoffset;//偏移量 }; classprocess { private: page*a; intM;//数组的长度 int*p; intN;//页表的长度 inthead; int*spare; public: process() { intn; intk; cout<<"请输入进程的页数"< cin>>n; a=newpage[n]; N=n; for(inti=0;i { a[i].i=i; a[i].flag=0; a[i].number=-1; a[i].address=11+i; a[i].change=0; } cout<<"请输入进程空闲块的数目: "< cin>>n; M=n;//主存中空闲的块的数量 p=newint[n]; spare=newint[n]; head=0; cout<<"请输入"< "< for(i=0;i { cin>>k; spare[i]=k; p[head]=-1; head=(head+1)%M; } head=0; for(intj=0;j { p[head]=head; a[head].flag=1; a[head].number=spare[head]; } } ~process() { deletea; deletep; deletespare; } voidoperate(order*s) { if(a[s->i1].flag==1) { cout<<"主存物理地址为: "<<(a[s->i1].number*64+s->offset)< if(strcmp(s->p,"存")==0) a[s->i1].change=1; } else { cout<<"发生了缺页中断,运行中断处理程序。 "< if(FIFO(s->i1)==1) operate(s); else cout<<"出错。 "< } } intFIFO(inti) { if(p[head]==-1) { p[head]=i; a[i].flag=1; a[i].number=spare[head]; head=(head+1)%M; return1; } else { a[p[head]].flag=0; a[p[head]].number=-1; if(a[p[head]].change==1) cout<<"将本页面写入交换区"< a[p[head]].change=0; p[head]=i; a[i].flag=1; a[i].number=spare[head]; cout<<"装入"< head=(head+1)%M; return1; } return0; } voidshow() { cout<<"进程的页表: "< cout<<"-----------------------------------------------------------------"< cout<<"页号\t"<<"有效位\t"<<"主存块号\t"<<"外存地址\t"<<"修改位"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 虚拟 存储