操作系统课设——三种存储管理方式的地址换算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目三种存储管理方式的地址换算
姓名:
学号:
专业:
学院:
指导教师:姚若龙
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)段表、页表、段表地址寄存器。
为了进行地址转换,系统为每个作业建立一个段表,并且要为该作业段表中的每一个段建立一个页表。系统中有一个段表地址寄存器来指出作业的段表起始地址和段表长度。
三.程序模块
int settable1(int n,int k);//创建页表
int printTable1(int n,int k);//显示页表
int transt(int n,int k,int add);//分页地址换算
int defSect(int n,int *t);//创建段表
int printSect(int n);//输出段表内容
int transSect(int n,int s,int d);//进行分段地址换算函数
int setSectTable(int n,int k);//创建段页式内容
int printSectTable(int n,int k);//显示段页内容
int transSectPage(int n,int k,int s1,int s2,int s3);//段页式地址换算
//定义页表结构体
typedef struct stable
{
int y1;//页号
int y2;//块号
}stable;
struct stable setst[512];