操作系统段表课程设计说明书.docx
- 文档编号:25532590
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:23
- 大小:326.93KB
操作系统段表课程设计说明书.docx
《操作系统段表课程设计说明书.docx》由会员分享,可在线阅读,更多相关《操作系统段表课程设计说明书.docx(23页珍藏版)》请在冰豆网上搜索。
操作系统段表课程设计说明书
课程设计任务书
学生:
朱东各专业班级:
计算机0604
指导教师:
蔡菁工作单位:
计算机科学与技术学院
题目:
模拟设计段页式虚拟存储管理中地址转换
初始条件:
1.预备容:
阅读操作系统的存管理章节容,理解段页式存储管理的思想及相应的分配主存的过程。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.实现段页式存储管理中逻辑地址到物理地址的转换。
能够处理以下的情形:
⑴能指定存的大小,存块的大小,进程的个数,每个进程的段数及段页的个数;
⑵能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。
2.设计报告容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
模拟段页式虚拟存储管理中
地址转换
1需求分析
1.1段页式管理的基本思想
1.1.1基本思想
段式和页式存储管理各有优缺点,段页式存储管理系统,用分段的方法来分配和管理虚拟存储器,而用分页的方法来分配和管理主存。
既有段式系统便于实现段的共享,段的保护,动态和段的动态增长等一系列优点,又能像页式系统那样,很好地解决存的外碎片问题。
具体来说,把整个存分成大小相等存块,存块从0开始依次编号。
把用户程序分成若干段,每段有个段名。
页面的大小和存块相同,每段的各个页面都分别从0开始依次编号。
虚空间的最小单位是页而不是段,存就被分为若干个页,且每段所拥有的程序和数据在存中可以分开存放,分段大小也不再受存可用区的限制。
1.2段页式存储的原理
1.2.1虚地址的构成
逻辑地址有三部分构成:
V=(S,P,d)即段号s,页号p和页相对地址d,如下所示:
s
p
d
存分配:
以块为单位进行存分配,为了实现从逻辑地址到物理地址的转换,为每个作业或进程建立一段表:
段表中的段长即是页表长度,段表中的段始址即是页表地址,每个段拥有一页表,段的页号映射为物理地址中的物理块号。
1.2.2段表和页表的构成
在段页式存储管理系统中,段表包含这样几个基本项:
段号,状态,该段的页表长度,页表始址;页表包含的基本项是:
页号,状态,块号。
段页式管理中段表,页表以及存的关系如下图:
1.2.3动态地址变换过程
在段页式存储管理系统中,要对存中的指令或数据进行一次存取操作至少需要访问3次存。
第一次是由段表寄存器得到段表始址去访问段表,然后取出对应段的页表地址。
第二次则是访问页表得到所要访问的物理地址。
只有在访问了段表和页表之后,,第三次才能访问真正要访问的物理单元。
段页式存储管理系统地址变换如下所示:
2功能设计(数据结构及模块说明)
2.1存储结构说明
在此段页式存储管理系统中,我们采用以下数据结构来存储数据,存储结构用结构体和结构体数组来实现:
2.1.1段表
段号s
状态flag
页表长度plen
页表始址psta
//段表
typedefstructStack
{
intnum;//段号
intflag;//段状态
intplen;//页表长度
intpsta;//页表始址
}Stack;
其中状态为1代表在存,为0代表不在存。
2.1.2页表
页号pnum
状态位(是否在存中)
块号block
//页表
typedefstructPage
{
intnum;//页号
intflag;//页状态,即是否在存。
intblock;//该页对应的块号
}Page;
2.1.3数据区
块号block
作业容
简单起见,我们没有把容初始化到每一个存地址,只给出每个作业块的容,并且用一串字符代替。
typedefstructData
{
intnum;//存的块数
stringstr;//对应数据块的作业容,简化起见说明容为一串字符。
}Data;
2.1.4快表
段号
段页号
块号
//快表
typedefstructQuick
{
intqs;//快表段号
intqp;//快表页号
intqb;//快表段号
}Quick;
2.1.5段表寄存器
段表始址
段表长度
//段表寄存器
typedefstructStare
{
intssta;//段表始址
intslen;//段表长度
}Stare;
2.2程序流程图
3程序设计
3.1本程序平台
本实验使用VC++6.0平台,使用基本的控制台应用程序,单文档结构,主要数据结构是结构体间的关系。
打开VC++6.0建立一个空工程,然后简历C++源文件,根据数据结构编写代码。
3.2变量和函数说明
3.2.1变量说明
Stackss[10];//全局变量,用来存放所有进程的段,数组下标就是段号。
Starest;///////全局变量,用来存放段表寄存器表。
Datawork[20];//全局变量,主存每一块的容,下标是块号。
Quickqu;//////全局变量,存放快表。
Pagepage[5][5];//存放每个块对应的页表。
boolmenuflag=0;//菜单函数标志位,首次使用初始化表。
intbbs;//存块大小
intbs;//存大小
3.2.2函数说明
voidmenu();//为用户提供菜单,详情见第四部分截图。
voidstart();//初始化表项。
详情见第四部分截图。
函数实现部分见附录。
voidchange();//地址转换函数。
详情见第四部分截图。
函数实现部分见附录。
3.2.3菜单设计
进入界面必须先对段表数据进行初始化,然后可以多次进行地址转换。
4结果与运行情况分析
运行程序,测试程序运行情况:
本次程序设计中,进入界面必须先对段表数据进行初始化,然后可以多次进行地址转换,其中会出现段页越界,缺(段)页。
其中有一点和实际并不相同:
由于C++里面单限制,不能实现快表和段表的同时查询,故模拟时采用先查询快表然后再查询段表的模式,另外,为每一段创建的页表,直接有页表二维数组组成,第一纬代表段号,第二维代表段页号。
整体数据和用例见下图:
4.1段表初始化
按照上图,进入程序后进行段表初始化
4.2段号越界中断测试
从上图中可以看到段号只有5个,0-4,所以越界中断。
逻辑地址不合法。
4.3缺段中断测试
第二段不在存,逻辑地址无法转化,需要把该段调入主存。
4.4缺页中断测试
第三段第0页不在存,逻辑地址无法转化,需要调入页面。
4.5页表越界测试
第三段没有第五页,页表越界,访问非法。
4.6在段表中成功访问数据测试
成功测试数据,第四段第0页对应块号为10,故物理地址是10*1024+500=10740
第十块作业数据是:
k
5自我评价与总结
本次系统中,主要是利用简单的数据结构和VC的简单的控制台程序,采用自己定义数据模拟段页式存储管理的方式,简单明快的是给用户一个功能菜单,进入菜单必须进行段表数据初始化,然后只要不退出就可以进行各种地址转化测试,也可以重新初始化段表。
而数据结构部分,采用结构体数组比较容易掌握的格式,是的查询过程简单化。
总的来说,利用简单的思想较为完整的模拟了段页式存储的各个步骤,甚至把快表也考虑了进去。
对于各种非法访问非常直观的指出非法原因。
为了体现数据访问的真实性,我还简单的为存中每一个作业快初始化了作业数据,找到物理块号后可以直接读出块的作业容。
体现的本程序的根本目的。
当然,程序也有很多不足,例如可以考虑采用MFC窗口应用程序,结合C++自带的部模板函数MAP函数,这样也可以较好的模拟段页式系统,本程序中对于段表的初始化过于繁琐,可以采取文本数据库的形式,利用读取TXT的方式给段表链表结构进行初始化,会增加程序的可视性,和简便性。
本次实验中,总体还算比较顺利,但是测试过程中还是出现了一些问题,主要是对段页式存储的理解不够深入照成的,每一个段都有一个页表,而这些段和自己的页表是要靠段表里的页表始址定位的,这个在程序中没有完整的表现出来,另外第一次程序中没有考虑页表越界中断,这是没有完整的把握模拟系统中的各个环节造成的,为此要以自己写好的程序流程图为基础,考虑到每一步分支程序,尽量用简单的方式把系统的各种功能模拟出来。
上图就是错把35521当成缺页中断,应该是页表越界,这个在第四部分已经改正。
当然,完成本题还有其他的方式,可以借用VC的置数据结构和模板,可以使用结构体指针来存取段表,可以吧段表存到文本文件里,这些都是可行的。
通过本次课程设计,加深了自己对书本知识的理解,通过亲自把模拟系统做成数据结构,更加直观真切的体会到段页式存储的基本思想,当然同时也对其他的存储知识加深了理解,同时锻炼了自己把所学知识应用的实际视图里面的能力,做到学以致用,对计算机硬件里面的微观世界有了进一步的剖析。
7附录
完整的程序代码:
#include
#include
usingnamespacestd;
//数据结构
//快表
typedefstructQuick
{
intqs;//快表段号
intqp;//快表页号
intqb;//快表段号
}Quick;
//数据区,简单起见,只为每一个储块写入容,不具体到每一物理地址。
typedefstructData
{
intnum;//存的块数
stringstr;//对应数据块的作业容,简化起见说明容为一串字符。
}Data;
//页表
typedefstructPage
{
intnum;//页号
intflag;//页状态,即是否在存。
intblock;//该页对应的块号
}Page;
//段表
typedefstructStack
{
intnum;//段号
intflag;//段状态
intplen;//页表长度
intpsta;//页表始址
}Stack;
//段表寄存器
typedefstructStare
{
intssta;//段表始址
intslen;//段表长度
}Stare;
Stackss[10];////全局变量
Starest;///////全局变量
Datawork[20];//全局变量
Quickqu;//////全局变量
Pagepage[5][5];
boolmenuflag=0;
intbbs;//存块大小
intbs;//存大小
voidmenu();
voidstart();
voidchange();
intmain()
{
menu();
return0;
}
voidmenu()
{
cout<<"*************请选择**************"< cout< cout<<"**1、初始化表*****"< cout<<"**2、物理地址转换*****"< cout<<"**3、退出*****"< intmenu1; cin>>menu1; if(menu1! =1&&menu1! =2&&menu1! =3) { cout<<"请输入正确的选项"< menu(); } switch(menu1) { case1: { menuflag=1; start(); break;} case2: { if(menuflag==0) { cout<<"请初始化表"< menu(); } change(); break; } case3: return; }//switch } voidstart() { cout<<"请输入存大小(K)"< cin>>bs; cout<<"请输入存块的大小(k)"< cin>>bbs; intblocknum; blocknum=bs/bbs; cout<<"存一共被分为"< cout<<"请输入进程个数"< intpn;cin>>pn; //下面求所有进程的总段数和段表,并为每段创建页表 intsums=0; for(intpn1=0;pn1 { cout<<"请输入第"< intppn;cin>>ppn; sums+=ppn; } for(intss1=0;ss1 { cout<<"请输入第"< 段号,状态,页表长度,页表始址"< cin>>ss[ss1].num>>ss[ss1].flag>>ss[ss1].plen>>ss[ss1].psta; cout<<"请初始化第"< for(intsss1=0;sss1 { page[ss1][sss1].num=sss1; cout<<"请输入该段第"< cin>>page[ss1][sss1].flag>>page[ss1][sss1].block; } } //初始化段表寄存器 cout<<"初始化段表寄存器的段表始址"< cin>>st.ssta; st.slen=sums; //初始化存中物理地址每一块的数据区 cout<<"简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址"< for(intbn=0;bn { work[bn].num=bn; cout<<"请输入第"< cin>>work[bn].str; } //初始化快表 cout<<"简单起见,我们初始化快表只有一个"< cout<<"请输入要作为快表的段号和页号"< cin>>qu.qb>>qu.qp; while(ss[qu.qb].flag! =1||page[qu.qb][qu.qp].flag! =1) { cout<<"该页不在存请输入一页在存中的作为快表,请输入要作为快表的段号和页号"< cin>>qu.qb>>qu.qp; } qu.qs=page[qu.qb][qu.qp].block; menu(); } voidchange() { cout<<"请输入要转化的逻辑地址,段号s,段页号p,页偏移地址d(B)"< intsnum,pnum,dnum; cin>>snum>>pnum>>dnum; //首先查快表 if(snum==qu.qb&&pnum==qu.qp) { cout<<"快表命中"<<"对应块号是"< cout<<"该块中作业数据是"< cout<<"物理地址是"< menu(); } //访问段表寄存器 else { cout<<"快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址"< intssnum; ssnum=st.ssta+snum; if(ssnum>st.slen-1) { cout<<"越界中断"< menu(); } //访问段表 else { if(ssnum>=0&&ssnum<=st.slen-1) { //是否缺段 cout<<"段表有效"< if(ss[ssnum].flag==0) { cout<<"缺段中断"< menu(); } else { //查询页表,根据段号查出页表始址,加上段偏移页数,即得到页表项。 //缺页中断测试 if(pnum>ss[ssnum].plen-1) { cout<<"缺页中断"< menu(); } else { if(pnum>=0&&pnum<=ss[ssnum].plen-1) { if(page[ssnum][pnum].flag==0) { cout<<"缺页中断"< menu(); } else { cout<<"找到该页"<<"查询页表后对应块号"< cout<<"该块存的数据是"< cout<<"转化得到的物理地址是: "< menu(); } } } } } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 说明书