操作系统段表课程设计说明书.docx

上传人:b****8 文档编号:12940221 上传时间:2023-06-09 格式:DOCX 页数:23 大小:326.93KB
下载 相关 举报
操作系统段表课程设计说明书.docx_第1页
第1页 / 共23页
操作系统段表课程设计说明书.docx_第2页
第2页 / 共23页
操作系统段表课程设计说明书.docx_第3页
第3页 / 共23页
操作系统段表课程设计说明书.docx_第4页
第4页 / 共23页
操作系统段表课程设计说明书.docx_第5页
第5页 / 共23页
操作系统段表课程设计说明书.docx_第6页
第6页 / 共23页
操作系统段表课程设计说明书.docx_第7页
第7页 / 共23页
操作系统段表课程设计说明书.docx_第8页
第8页 / 共23页
操作系统段表课程设计说明书.docx_第9页
第9页 / 共23页
操作系统段表课程设计说明书.docx_第10页
第10页 / 共23页
操作系统段表课程设计说明书.docx_第11页
第11页 / 共23页
操作系统段表课程设计说明书.docx_第12页
第12页 / 共23页
操作系统段表课程设计说明书.docx_第13页
第13页 / 共23页
操作系统段表课程设计说明书.docx_第14页
第14页 / 共23页
操作系统段表课程设计说明书.docx_第15页
第15页 / 共23页
操作系统段表课程设计说明书.docx_第16页
第16页 / 共23页
操作系统段表课程设计说明书.docx_第17页
第17页 / 共23页
操作系统段表课程设计说明书.docx_第18页
第18页 / 共23页
操作系统段表课程设计说明书.docx_第19页
第19页 / 共23页
操作系统段表课程设计说明书.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统段表课程设计说明书.docx

《操作系统段表课程设计说明书.docx》由会员分享,可在线阅读,更多相关《操作系统段表课程设计说明书.docx(23页珍藏版)》请在冰点文库上搜索。

操作系统段表课程设计说明书.docx

操作系统段表课程设计说明书

课程设计任务书

学生:

朱东各专业班级:

计算机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();

}

}

}

}

}

}

}

 

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2