操作系统分页式存储管理课程设计.docx
《操作系统分页式存储管理课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统分页式存储管理课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
![操作系统分页式存储管理课程设计.docx](https://file1.bdocx.com/fileroot1/2022-10/14/9eed9756-f8e7-461a-b03c-37cba9441911/9eed9756-f8e7-461a-b03c-37cba94419111.gif)
操作系统分页式存储管理课程设计
操作系统分页式存储管理课程设计
石家庄经济学院华信学院
操作系统课程设计报告
(学院)系:
华信学院
专业:
计算机科学与技术
姓名:
班级:
09级3班
学号:
40941708032
指导教师:
孟永刚
2012年6月22日
操作系统课程设计报告
姓名
宋攀
学号
409417080324
日期
2012年6月11-21号
实验室
机房2、3
指导教师
孟永刚
设备编号
设计题目
虚拟存储器
一、设计内容
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
二、设计目的
在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。
用这种办法扩充的主存储器称为虚拟存储器。
通过本实习帮助同学们理解在分页式存储管理中怎样实现虚拟存储器。
三、设计过程、
同组人员:
陈秀张德蛟
1.数据结构设计
本设计所用的数据结构包括:
结构体和数组,详细描述如下:
指令结构体如下
typedefstruct
{
intpage_num;//页号
intunit_num;//单元号
}order;
页表结构体如下
typedefstruct{
intpage_num;//页号
intflag;//标志
intmemery_num;//主存储块号
intm_flag;//修改标志
charlocation[4];//在磁盘上的位置
}pageform;
作业页表数组如下
#defineC7
pageforma[C];
主存页表数组如下
#defineC14
pageformp[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所示:
图4地址转换和产生缺页中断模块
(5)先进先出(FIFO)页面调度算法处理缺页中断模块
函数:
order2()
入口参数:
无
出口函数:
无
功能描述:
根据取出的指令的页号查找页表,在该页的标志位=1的前提下,如果是存命令,
就置该页的修改标志位=1并且计算和输出该页的绝对地址,如果不是存命令,就只计算和输
出该页的绝对地址;在该页的标志位=0的前提下,则模拟FIFO算法,k初始化为0,则执行
把p[k]的各个表项分别赋值给j的各个表项,判断j页的修改标志是否为1,如果为1就输出OUTj并且输出INcmd.page_num,否则只输出INcmd.page_num,执行把cmd.page_num赋值给p[k].page_num,再执行k:
=(k+1)modm,然后修改所有由于输入命令所引起的有关的页面各种表项,最后输出所有作业页面的最新表项。
流程图如图5所示:
图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
#include
#defineC7
#defineC14
typedefstruct{
intpage_num;//页号
intflag;//标志
intmemery_num;//主存储块号
intm_flag;//修改标志
charlocation[4];//在磁盘上的位置
}pageform;
pageforma[C];
pageformp[C1];
intk=0;
inti=0;
intselect;
pageformj;
intn;//是否有后继指令
intx;
typedefstruct
{
intpage_num;//页号
intunit_num;//单元号
}order;
voidmemunit_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");
}
voidpage_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");
}
voidrecycle()
{
cout<<"页号"<<"标志"<<"主存块号"<<"修改标志"<<"磁盘位置"<for(inti=0;i{
if(a[i].flag==1)
{
cout<}
else
cout<}
}
voidpageform_print()
{
page_init();
cout<<"当前内存页表如下:
"<recycle();
}
voidorder1()
{
page_init();
ordercmd;
cout<<"请输入新的指令:
"<cout<<"请输入新指令的页号:
"<cin>>cmd.page_num;
if(cmd.page_num>6||cmd.page_num<0)
{do
{
cout<<"请重新输入正确页号(0-6):
"<cin>>cmd.page_num;
}
while(cmd.page_num>6||cmd.page_num<0);
}
cout<<"请输入新指令的单元号:
"<cin>>cmd.unit_num;
cout<<"是否有后继指令(0/1):
"<cin>>n;