操作系统课设——三种存储管理方式的地址换算.doc
- 文档编号:30803186
- 上传时间:2024-01-28
- 格式:DOC
- 页数:17
- 大小:266KB
操作系统课设——三种存储管理方式的地址换算.doc
《操作系统课设——三种存储管理方式的地址换算.doc》由会员分享,可在线阅读,更多相关《操作系统课设——三种存储管理方式的地址换算.doc(17页珍藏版)》请在冰豆网上搜索。
题目三种存储管理方式的地址换算
姓名:
学号:
专业:
学院:
指导教师:
姚若龙
2018年11月27日
【目录】
摘要…………………………………………………………………01
引言…………………………………………………………………02
算法设计……………………………………………………………02
程序分析……………………………………………………………04
算法分析……………………………………………………………09
调试结果……………………………………………………………11
个人总结……………………………………………………………15
参考文献……………………………………………………………15
摘要:
操作系统(Operating System,OS)是方便用户、管理和控制计算机软硬件资源的系统软件(或程序集合)。
从用户角度看,操作系统可以看成是对计算机硬件的扩充;
从人机交互方式来看,操作系统是用户与机器的接口;从计算机的系统结构看,操作系统是一种层次、模块结构的程序集合,属于有序分层法,是无序模块的有序层次调用。
操作系统在设计方面体现了计算机技术和管理技术的结合。
操作系统是系统软件的核心,、它控制程序的执行和提供资源分配、调度、输入/输出控制和数据管理等任务。
如DOS、UNIX、OS/2和Windows NT都是得到广泛使用的操作的系统。
三种管理方式中,分页系统能有效地提高内存利用率,分段系统则能很好地满足用户需要,而段页式系统则是把前两种结合起来形成的系统。
这种新系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,有能像分页系统那样很好地解决内存的外部碎片问题,以及可为各个分段离散地分配内存等问题。
关键字:
分页方式,分段方式,段页式方式,操作系统。
一.引言
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页。
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
段的长度由相应的逻辑信息组的长度决定,因而个段长度不等。
段页式存储管理方式是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
三种存储管理都有其相应的段表、页表和地址变换机构。
二.三种存储管理方式地址换算描述
(1)分页存储管理方式
在页式存储管理方式中地址结构由两部构成,前一部分是页号,后一部分为页内地址w(位移量),如图
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了页表寄存器,用于存放页表在内存中的始址和页表的长度。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。
查找操作由硬件执行。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。
于是,这一错误将被系统发现并产生一地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
这样便完成了从逻辑地址到物理地址的变换。
(2)分段存储管理方式
程序通过分段划分为多个模块,如代码段、数据段、共享段:
–可以分别编写和编译
–可以针对不同类型的段采取不同的保护
–可以按段为单位来进行共享,包括通过动态链接进行代码共享
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。
若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。
若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址d
相加,即可得到要访问的内存物理地址。
(3)段页存储管理方式
在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL。
进行地址变换时,首先利用段号S,将它与段表长TL进行比较。
若S>TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表址,并利用逻辑地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
(4)段表、页表、段表地址寄存器。
为了进行地址转换,系统为每个作业建立一个段表,并且要为该作业段表中的每一个段建立一个页表。
系统中有一个段表地址寄存器来指出作业的段表起始地址和段表长度。
三.程序模块
intsettable1(intn,intk);//创建页表
intprintTable1(intn,intk);//显示页表
inttranst(intn,intk,intadd);//分页地址换算
intdefSect(intn,int*t);//创建段表
intprintSect(intn);//输出段表内容
inttransSect(intn,ints,intd);//进行分段地址换算函数
intsetSectTable(intn,intk);//创建段页式内容
intprintSectTable(intn,intk);//显示段页内容
inttransSectPage(intn,intk,ints1,ints2,ints3);//段页式地址换算
//定义页表结构体
typedefstructstable
{
inty1;//页号
inty2;//块号
}stable;
structstablesetst[512];
//建立段表的结构体
typedefstructsetsect
{
intd1;//段号
intd2;//段长
intd3;//基址
}setsect;
structsetsectsets[512];//定义段表的总长度
//建立段页式内的页表的结构体
typedefstructtable
{
intdy1;//页号
intdy2;//块号
}table;
//建立段页式的结构体
typedefstructsetAll
{
structtablec1[512];//定义段内页表的结构体
intc2;//段号
intc3;//段长
intc4;//起始地址
}setAll;
structsetAllset[512];//定义段页式的总长度
1.分页系统
intpage(intA,intL)
{
intd,P,kd,i;
intWD;
intPT[256];
for(i=1;i<256;i++)
{
PT[i]=rand()%512;//定义随机产生的快号在到之间
}
P=A/L;//页号等于逻辑地址/页面大小
d=A%L;//页内地址=逻辑地址%页面大小
if(P>L)printf("页号大于页表长度,越界中断\n\n");//如果页号大于页表长度,输出越界中段
else{
printf("页号=逻辑地址/页面大小=%d,页内地址=逻辑地址%页面大小=%d\n",P,d);//输出页号和页内地址
kd=PT[P];//根据页号随机产生快号
printf("根据页号%d得到块号%d\n",P,kd);
WD=kd*L+d;//计算物理地址的公式
printf("物理地址=块号%d*页面大小%d+页内地址%d\n",kd,L,d);//输出物理地址=块号*页面大小+页内地址
printf("逻辑地址%d换算后的物理地址为%d\n\n",A,WD);//输出物理地址的结果
return(0);
}
}
2.分段系统
intSegment(intsn,intsd)
{
inti,wd;
for(i=0;i<255;i++)
{
st.segf[i]=rand()%255;//定义随机产生段首地址为到之间
st.segl[i]=rand()%2048;//定义随机产生段长度为到之间
}
if(sn>256)printf("段号%d大于段表长度,越界中断\n\n",sn);//如果段号大于段表长度,输出越界中断
elseif(sd>st.segl[sn])printf("段内地址%d大于段长度%d,越界中断\n",sd,st.segl[sn]);//如果段内地址大于段长度,输出越界中断
else{
printf("根据段号找到段首地址%d\n",st.segf[sn]);
printf("物理地址=段首地址%d+段内地址%d\n",st.segf[sn],sd);//输出物理地址=段首地址+段内地址
wd=st.segf[sn]+sd;//计算物理地址的算法
printf("换算得到的物理地址为:
%d\n\n",wd);//输出物理地址
}
return(0);
}
3.段页系统
intSegPagt(intsn,intpn,intpd)
{
inti,wd;
sp.pl=256;
for(i=0;i<255;i++)
{
sp.pf[i]=sp.segf[i]=rand()%26624;//定义随机产生的数在到之间
sp.ptl[i]=sp.segl[i]=rand()%512;//定义随机产生的数在到之间
sp.pt[i]=rand()%256;//定义随机产生的数在到之间
}
if(sn>256)printf("段号%d大于段表长度,越界中断\n\n",sn);//如果段号大于段表长度,输出越界中断
elseif(pn>sp.ptl[pn])printf("页号%d大于页表长度%d,越界中断\n",pn,sp.ptl[pn]);//如果页号大于页表长度,输出越界中断
elseif(pd>sp.pl)printf("页内地址%d大于页面长度%d,中断\n",pd,sp.pl);//如果页内地址大于页面长度,输出中断
else{
printf("通过段号%d找到页表首地址%d\n通过页号%d找到块号%d\n",sn,sp.pf[sn],pn,sp.pt[pn]);//输出页表首地址和块号
printf("物理地址=页表首地址%d+快号%d*页面长度%d+页内地址%d\n",sp.pf[sn],sp.pt[pn],sp.pl,pd);//输出物理地址=页表首地址+快号*页面长度+页内地址
wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;//计算物理地址的公式
printf("物理地址为:
%d\n\n",wd);//输出物理地址的最好结果
}return(0);
}
4.主函数
intmain()
{
intcode;
intpl,pa,sn,sd,pd,pn;
//constintptl;
inttemp;
do{
printf("----------------地址换算过程----------------------------\n\n");
printf("1.分页式地址换算\n");
printf("2.分段式地址换算\n");
printf("3.段页式地址换算\n");
printf("4.结束运行\n\n");
printf("----------------------------------------------------------\n");
printf("请输入您的选择:
");
scanf("%d",&code);
switch(code)
{
case1:
{
printf("注意:
请演示设定页表长度小于\n");
printf("请输入换算的逻辑地址:
\n");
scanf("%d",&pa);
printf("页面大小(B):
\n");
scanf("%d",&pl);
page(pa,pl);
}break;
case2:
{
printf("请演示设定段表长度小于\n");
printf("请输入逻辑地址的段号:
\n");
scanf("%d",&sn);
printf("段内地址:
\n");
scanf("%d",&sd);
Segment(sn,sd);
}break;
case3:
{
printf("预设定段表长为,页面大小为\n");
printf("请输入逻辑地址的段号:
\n");
scanf("%d",&sn);
printf("页号:
\n");
scanf("%d",&pn);
printf("页内地址:
\n");
scanf("%d",&pd);
SegPagt(sn,pn,pd);
}break;
case4:
{}break;
}
}while(code<4);
}
四.三种存储管理方式的地址变换机构
(1)分页系统的地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了页表寄存器,用于存放页表在内存中的始址和页表的长度。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。
查找操作由硬件执行。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。
于是,这一错误将被系统发现并产生一地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
这样便完成了从逻辑地址到物理地址的变换。
页表始址
页表长度
>
页号(3)
页内地址
1
b
页表
物理地址
逻辑地址L
越界中断
页表寄存器
页号
块号
0
1
2
3
(2)分段系统的地址变换机构
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。
1.若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;
2.若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。
若超过,即d>SL,同样发出越界中断信号;
3.若未越界,则将该段的基址与段内地址d相加,即可得到要访问的内存物理地址。
段表始址
段表长度
>
2
100
越界
有效地址
段号
段长
基址
0
1
2
3
物理地址
(3) 段页式系统中的地址变换机构
在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL。
进行地址变换时,首先利用段号S,将它与段表长TL进行比较。
若S>TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
段表始址
段表长度
段表寄存器
>
段超长
页号P
段号S
页内地址
0
1
2
3
段表长度
页表始址
0
1
2
3
b
块号b
块内地址
页表
段表
五.结果分析
1)主菜单页面
2)页式页面
选择1
输入:
换算的逻辑地址:
120
页面大小:
100
输出:
页号=1
页内地址=20
块号=41
物理地址=4120
3)段式页面
选择2
输入:
换算的逻辑地址的段号:
230
段内地址:
180
输出:
段首地址=68
物理地址=248
4)段页式页面
选择3
输入:
逻辑地址的段号:
230
页号:
5
页内地址:
10
输出:
页表首地址==5447
块号=166
物理地址=47953
六.个人总结
为期一周的操作系统课程设计很快就结束了,做为每个学期末的一项必修课,课程设计的目的就是要让我们能够更加深刻的理解课堂上所学的知识,并能够将它们应用到实践中去,让知识能为实践服务。
这次操作系统的课程设计,我是通过编程演示三种存储管理方式的地址换算过程。
通过这次课程设计,加深了我对课堂上所学的三种存储管理方式的地址换算的概念的理解,了解了操作系统的工作原理已经平时遇到的一些状况是怎么样产生的,通过这次操作系统的课程设计,另我学到了很多在课堂上学不到的知识,以及动手能力,这次课程设计老师不限开发工具,因此也锻炼了我们对新的开发工具的掌握能力。
对于我们计算机专业的学生来说,在软件更新如此之快的今天,对新的开发工具的快速掌握能力也是一项必不可少的能力。
当然,在这次课程设计中,也暴露出来了一些问题,就是我对开发工具的使用,虽然大学三年基本是用C编写程序比较多,但是还是感到了力不从心的感觉,就是自己对一些C函数库的了解不够,导致自己在用的时候走了很多弯路,这也从间接让我了解了许多平时学习不到的知识。
课程设计不仅能锻炼我们把知识应用于实践的能力,还锻炼了我们思维的逻辑性。
编写一个BUG尽可能少的程序,需要考虑很多方面的问题,包括给别人试用,这就锻炼了我们逻辑思维的能力,为今后走上工作岗位打下了坚实的基础。
参考文献 :
《计算机操作系统第2版》清华大学出版社
《Cprimerplus》(第5版)人民邮电出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 存储 管理 方式 地址 换算