资源描述
操作系统分页式存储管理课程设计
19
2020年4月19日
文档仅供参考,不当之处,请联系改正。
石家庄经济学院华信学院
操作系统课程设计报告
(学 院)系: 华信学院
专 业: 计算机科学与技术
姓 名:
班 级: 09级3班
学 号:
指导教师: 孟永刚
6 月 22 日
操作系统课程设计报告
姓名
宋攀
学号
日期
6月11-21号
实验室
机房2、3
指导教师
孟永刚
设备编号
设计题目
虚拟存储器
一、设计内容
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
二、设计目的
在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和能够超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。经过本实习帮助同学们理解在分页式存储管理中怎样实现虚拟存储器。
三、设计过程、
同组人员:陈秀 张德蛟
1. 数据结构设计
本设计所用的数据结构包括:结构体和数组,详细描述如下:
指令结构体如下
typedef struct
{
int page_num;//页号
int unit_num;//单元号
}order;
页表结构体如下
typedef struct{
int page_num;//页号
int flag;//标志
int memery_num;//主存储块号
int m_flag;//修改标志
char location[4];//在磁盘上的位置
}pageform;
作业页表数组如下
#define C 7
pageform a[C];
主存页表数组如下
#define C1 4
pageform p[C1];
2. 算法设计
1)
该源程序分为以下几个模块:
(1)主存初始化模块
(2)页表初始化模块
(3)打印初始化后的页表信息模块
(4)地址转换和产生缺页中断模块
(5)先进先出(FIFO)页面调度算法处理缺页中断模块
2)
对各模块进行详细说明:
(1)主存初始化模块
函数:memunit_init()
入口参数:无
出口参数:无
功能描述:调入4个页面对4个空闲主存进行页面初始化,调入页面包括a[0],a[1],a[2],a[3];空闲主存包括 p[0],p[1],p[2],p[3]。
流程图如图1所示:开始
初始化内存各页表项
结束
图1主存初始化模块
(2)页表初始化模块
函数:page_init()
入口参数:无
出口参数:无
功能描述:对作业页表表项初始化,包括对页面a[0],a[1],a[2],a[3],a[4],a[5],a[6]的初始化。
流程图如下:
开始
初始化作业各页表项
结束
图2
(3)打印页表信息
函数:pageform_print()
入口参数:无
出口参数:无
开始
功能描述:打印初始化后的作业页表表项,对作业页表表项初始化,包括对页面a[0],a[1],a[2],a[3],a[4],a[5],a[6]的初始化;然后打印a[0],a[1],a[2],a[3],a[4],a[5],a[6]各页表项。
流程图如图3所示:
初始化作业各页表项
打印作业表各表项
结束
图3打印页表信息模块
(4)地址转换和产生缺页中断模块
函数:order1()
入口参数:无
出口参数:无
功能描述:根据取出的指令的页号查找页表,如果该页的标志位=1就输出该页的绝对地址,否则发生缺页中断打印 * 页号。
流程图如图4所示:是
否
是
否
取一条指令
取指令中的访问的页号
查页表
形成绝对地址
输出绝对地址
输出“*”页号表
示发生缺页中断
取下一条指令
开始
该页标志=1
有后继指令
结束
图 4地址转换和产生缺页中断模块
(5)先进先出(FIFO)页面调度算法处理缺页中断模块
函数:order2()
入口参数:无
出口函数:无
功能描述:根据取出的指令的页号查找页表,在该页的标志位=1的前提下,如果是存命令,
就置该页的修改标志位=1而且计算和输出该页的绝对地址,如果不是存命令,就只计算和输
出该页的绝对地址;在该页的标志位=0的前提下,则模拟FIFO算法,k初始化为0,则执行
把p[k]的各个表项分别赋值给j的各个表项,判断j页的修改标志是否为1 ,如果为1就输出 OUT j而且输出IN cmd.page_num,否则只输出 IN cmd.page_num,执行把cmd.page_num赋值给p[k].page_num,再执行k:=(k+1)mod m,然后修改所有由于输入命令所引起的有关的页面各种表项,最后输出所有作业页面的最新表项。
流程图如图5所示: 开始
取一条指令 cmd
取指令中的页号 cmd.page_num
查页表
是
否
页表标志位=1
是存指令
形成绝对地址
否
是
置cmd.page_num页修改标志=1
修改页表及p[k]并输出更新后的页表,k:=(k+1)modC1
取下一条指令
是
否
结束
有后继指令
否
是
输出 "IN" cmd.page_num
输出 "OUT" j.page_num
j的修改标志
位=1
j:=p[k]
输出绝对地址
图5 先进先出(FIFO)页面调度算法处理缺页中断模块
四、 程序运行结果
源程序代码链接:虚拟存储器.cpp
1.执行程序后初始化的窗口截屏如图6:
图 6 初始化的窗口
2.输入 1后的窗口截屏如图7所示:
图7 输入1后的窗口
3.输入的页号为0,输入的单元号为70,输入有后继指令,结果截屏如图8所示:
图 8 输入已在主存中的作业
4. 输入的页号为4,输入的单元号为53,输入无后继指令,结果截屏如图9所示:
图 9 输入未在主存中的作业
5. 输入 2后的初始窗口截屏如图10所示:
图10 输入 题目2的初始化窗口
6. 输入的页号为0,输入的单元号为70,输入存指令,输入无后继指令,结果截屏如图11所示:
图 11 输入新指令
7. 输入的页号为4,输入的单元号为53,输入存指令,输入有后继指令,结果截屏如图12所示:
图 12 输入新指令
8. 输入的页号=5,输入的单元号=23,输入非存指令,输入无后继指令,结果截屏如图13所示:
图 13 输入新指令
五、 设计总结
此次试验,全部程序及全部模块均参与研究,现在均已熟悉,对各个模块都详细的说明了它们的功能等等,两周的课程设计结束了,在这次的课程设计中不但检验了我所学习的知识,而且更正了我的一个误区,让我对所学的知识有了更深刻的认识。
六、指导教师评语及成绩
评语:
成绩:
年 月 日
源代码
#include<iostream.h>
#include<string.h>
#define C 7
#define C1 4
typedef struct{
int page_num;//页号
int flag;//标志
int memery_num;//主存储块号
int m_flag;//修改标志
char location[4];//在磁盘上的位置
}pageform;
pageform a[C];
pageform p[C1];
int k=0;
int i=0;
int select;
pageform j;
int n;//是否有后继指令
int x;
typedef struct
{
int page_num;//页号
int unit_num;//单元号
}order;
void memunit_init()
{
p[0].page_num=0;
p[0].flag=1;
p[0].memery_num=5;
p[0].m_flag=0;
strcpy(p[0].location,"011");
p[1].page_num=1;
p[1].flag=0;
p[1].memery_num=8;
p[1].m_flag=0;
strcpy(p[1].location,"012");
p[2].page_num=2;
p[2].flag=1;
p[2].memery_num=9;
a[2].m_flag=0;
strcpy(p[2].location,"013");
p[3].page_num=3;
p[3].flag=1;
p[3].memery_num=1;
p[3].m_flag=0;
strcpy(p[3].location,"021");
}
void page_init()
{
a[0].page_num=0;
a[0].flag=1;
a[0].memery_num=5;
a[0].m_flag=0;
strcpy(a[0].location,"011");
a[1].page_num=1;
a[1].flag=1;
a[1].memery_num=8;
a[1].m_flag=0;
strcpy(a[1].location,"012");
a[2].page_num=2;
a[2].flag=1;
a[2].memery_num=9;
a[2].m_flag=0;
strcpy(a[2].location,"013");
a[3].page_num=3;
a[3].flag=1;
a[3].memery_num=1;
a[3].m_flag=0;
strcpy(a[3].location,"021");
a[4].page_num=4;
a[4].flag=0;
a[4].m_flag=0;
strcpy(a[4].location,"022");
a[5].page_num=5;
a[5].flag=0;
a[5].m_flag=0;
strcpy(a[5].location,"023");
a[6].page_num=6;
a[6].flag=0;
a[6].m_flag=0;
strcpy(a[6].location,"121");
}
void recycle()
{
cout<<"页号 "<<"标志 "<<"主存块号 "<<"修改标志 "<<"磁盘位置"<<endl;
for(int i=0;i<C;i++)
{
if(a[i].flag==1)
{
cout<<a[i].page_num<<" "<<a[i].flag<<" "<<a[i].memery_num<<" "<<a[i].m_flag<<" "<<a[i].location<<endl;
}
else
cout<<a[i].page_num<<" "<<a[i].flag<<" "<<" "<<a[i].m_flag<<" "<<a[i].location<<endl;
}
}
void pageform_print()
{
page_init();
cout<<"当前内存页表如下:"<<endl;
recycle();
}
void order1()
{
page_init();
order cmd;
cout<<"请输入新的指令:"<<endl;
cout<<"请输入新指令的页号:"<<endl;
cin>>cmd.page_num;
if(cmd.page_num>6||cmd.page_num<0)
{ do
{
cout<<"请重新输入正确页号(0-6):"<<endl;
cin>>cmd.page_num;
}
while(cmd.page_num>6||cmd.page_num<0);
}
cout<<"请输入新指令的单元号:"<<endl;
cin>>cmd.unit_num;
cout<<"是否有后继指令(0/1):"<<endl;
cin>>n;
if(a[cmd.page_num].flag==1)
{
x=128*a[cmd.page_num].memery_num+cmd.unit_num;
cout<<"绝对地址为:"<<x<<endl;
}
else
{
cout<<"* "<<cmd.page_num<<endl;
}
}
void order2()
{
memunit_init();
char r;
order cmd;
cout<<"请输入新的指令:"<<endl;
cout<<"请输入新指令的页号:"<<endl;
cin>>cmd.page_num;
if(cmd.page_num>6||cmd.page_num<0)
{
do
{
cout<<"请重新输入正确页号(0-6):"<<endl;
cin>>cmd.page_num;
}
while(cmd.page_num>6||cmd.page_num<0);
}
cout<<"请输入新指令的单元号:";
cin>>cmd.unit_num;
cout<<"是否存指令(y/n):"<<endl;
cin>>r;
cout<<"是否有后继指令(0/1):"<<endl;
cin>>n;
if(a[cmd.page_num].flag==1)
{
x=128*a[cmd.page_num].memery_num+cmd.unit_num;
if(r=='y')
{
a[cmd.page_num].m_flag=1;
}
else
{}
cout<<"绝对地址为:"<<x<<endl;
}
else
{
j.flag=p[k].flag;
j.m_flag=p[k].m_flag;
j.memery_num=p[k].memery_num;
j.page_num=p[k].page_num;
strcpy(j.location,p[k].location);
if(j.m_flag==1)
{
cout<<"OUT "<<j.page_num<<endl;
}
else
{}
cout<<"IN "<<cmd.page_num<<endl;
//内存重新分配
p[k].page_num=cmd.page_num;
p[k].flag=1;
p[k].memery_num=j.memery_num;
strcpy(p[k].location,a[cmd.page_num].location);
a[cmd.page_num].flag=1;
a[cmd.page_num].memery_num=j.memery_num;
a[j.page_num].flag=0;
if(r=='y')
{
a[cmd.page_num].m_flag=1;
}
else{}
recycle();
k=(k+1)%C1;
}
}
void select1()
{
if(select==1)
{
do
{
order1();
}
while(n==1);
}
}
void select2()
{
if(select==2)
{
do
{
order2();
}
while(n==1);
}
}
void main()
{
cout<<"请输入题号(1/2):"<<endl;
cin>>select;
page_init();
pageform_print();
if(select==1)
{
select1();
}
if(select==2)
{
select2();
}
}
展开阅读全文