ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:139.67KB ,
资源ID:26408614      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26408614.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(段页式虚拟存储管理.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

段页式虚拟存储管理.docx

1、段页式虚拟存储管理学 号:课程设计题目段页式虚拟存储管理学院计算机科学与技术专业班级姓名指导教师吴利军2013年 1 月 16 日课程设计任务书学生姓名: 指导教师: 吴利军 工作单位: 计算机科学与技术学院题目:模拟设计段页式虚拟存储管理中地址转换初始条件:1预备内容:阅读操作系统的内存管理章节内容,理解段页式存储管理的思想及相应的分配主存的过程。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求, 以及说明书撰写等具体要求)1实现段页式存储管理中逻辑地址到物理地址的转换。能够处理以下的情形: 能指定内存的大小,内存块的大小,进程的个数,每个进程的

2、段数及段内页的个数;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。2设计报告内容应说明:需求分析;功能设计(数据结构及模块说明); 开发平台及源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:i) 你认为你完成的设计哪些地方做得比较好或比较出色;ii) 什么地方做得不太好,以后如何改正;iii) 从本设计得到的收获(在编写,调试,执行过程中的经验和教训) ;iv) 完成本题是否有其他方法(如果有,简要说明该方法) ;时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄

3、袭,一旦发现,一律按 0分记)指导教师签名:系主任(或责任教师)签名:一、需求分析:页式管理基本原理:各个进程的虚拟空间被划分成若干个长度相等的页。 页长的划分和内存与外存之间的数据传 输速度及内存大小等有关。一般每个页长大约为 1-4K,经过页划分之后,进程的虚拟地址变为页号p与页内地址w所组成。除了将进程的虚拟空间划分为大小相等的页之外, 页式管理还把内存空间也按页的大小划分为片或者页面。这些页面为系统中的任一进程所共享。 从而与分区管理不一样,分页管理时,用户进程在内存空间内除了在每个页面内地址连续之外, 每个页面之间不再连续。 第一是实现了内存中碎片的减少, 因为任意碎片都会小于一个页

4、面。第二是实现了由连续存储到非连续存储的这个飞跃, 为在内存中局部地、 动态地存储那些反复执行或即将执行的程序 和数据段打下了基础。怎样由页式虚拟地址转变为内存页面物理地址?页式管理把页式虚拟地址与内存页面 物理地址建立 对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。静态页面管理:静态页面管理方法是在作业或进程开始执行之前, 把该作业或进程的程序段和数据全部装入内存的各个页面,并通过页表和硬件地址变换机构实现虚拟地址到内存物理地址的地址 映射。1、 内存页面的分配与回收静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。 系统依靠存储页面表、请求页面表以及页表来完成内存

5、的分配。(1) 页表最简单的页表由页号与页面号组成, 页表在内存中占有一块固定的存储区。 页表的大小有进程或作业的长度决定。每个进程至少要拥有一个页表。(2) 请求表用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置。 系统必须知道每个作业或进程的页表起始地址和长度, 以进行内存的分配和地址变换, 另外请求表中还 应包括每个作业或进程所要求的页面数。(3) 存储页面存储页面表也是整个系统一张,存储页面表指出内存各个页面是否已被分配出去,以及未被分配页面总数。存储页面表也有两种构成方法, 一种是在内存中划分一块固定区域,每个单元的每个比特代表一个页面, 如果该页面已被分配, 则对应比特位置

6、置 1,否则置0。另一种方法空闲页面链,不占内存空间。2、 分配算法3、 地址变换在程序执行过程中,执行的是虚拟空间中的代码, 代码中的指令是相对于虚拟空间的,需要到内存的实际空间中寻找对应的要执行的指令。静态页式管理的缺陷:虽然解决了分区管理时的碎片问题,但是由于静态页式管理要求进程或作业在执行前全 部装入内存,如果可用页面数小于用户要求时,改作业或进程只好等待。而且,作业或进程 的大小仍受内存可用空间的限制。动态页式管理:动态页式管理是在静态页式管理的基础上发展起来的。 它分为请求页式管理和与调入页式管理(调入方式上)。请求页式管理和预调入页式管理在作业或进程开始执行之前都不把作业或进程的

7、 程序段和数据段一次性的调入内存,而是只装入被认为是经常反复执行和调用的工作区 部分。其他部分都在执行过程中动态的装入。请求式页式管理:当需要执行某条指令或某些数据时而又发现他不在内存中时, 从而发生缺页中断,系统将相应的页面调入内存。预调入:系统对于那些在外存中的页进行调入顺序计算, 估计出这些页中指令和数据的执行和被访问的顺序,并按此顺序将他们顺次调入和调出内存。请求页式管理的地址变换与静态页式相同, 也是通过页表查出相应的页面号, 由页面号与页内相对地址相加而得到实际物理地址。 由于只有进程或程序的部分存在内存中因此怎样发现这些不在内存中的虚页以及怎样处理这种情况是必须解决的两个基本问

8、题。怎样发现这些不在内存中的虚页:扩充页表的方法。即与每个虚页号相对应, 除了页面号之外,再增设该页是否在内存中的中断位以及 该页在外存中的副本起始地址。(1 )采用何种方法将所缺的页调入内存。(2)如果内存中没有空闲页面时,把调进来的页面放在什么地方。即采用什么策 略淘汰已占据内存的页。 还有就是如果内存中的也被淘汰, 但该页被修改过,显然该页应当被重新写到外存加以保存。所以还要增加一项记录是否该页已经被改变。常见的置换算法:(1) 随机淘汰(2) 轮转法和先进先出法(3) 最近最久未使用内存保护:页式管理提供两种方式的内存保护: 一是:地址越界保护。二是: 通过页表控制对内存信息的存取操作

9、方式以提供保护。地址越界保护:由地址变换机构中的控制存储器的值一一页表长度和所要访问的虚地址 相比较来完成。存取控制保护的实现则是在页表中增加相应的保护位即可。段式管理:分区式管理和页式管理时的进程的地址空间结构都是线性的, 这要求对源程序进行编译连接时,把源程序中的主程序、 子程序、数据区等按线性空间的一维地址顺序排列起来。共享子程序和数据变得很困难, 再者从链接的角度来看, 分区管理和页式管理只能采用静态链接。段式存储管理是基于为用户提供一个方便的灵活的程序设计环境而提出来的。 段式管理的基本思想是:把程序按内容或过程(函数)关系分成段,每段都有自己的名字。一个用户 进程或作业所包含的段对

10、应于一个二维线性虚拟空间, 也就是二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存, 而把那些在将来一段时间内不被访问的段放在外存,待需要时自动调入的方法实现二维虚拟存储器。段式管理把一个进程的虚拟空间设计成二维结构, 即段号s与段内相对地址 w。与页式管理不一样的是,页式管理中, 被划分的页号按顺序编号递增排列,属一维空间, 而段式管理中段号与段号之间无顺序关系。 另外段的划分也不像页的划分那样具有相同的页长, 段的长度是不固定的。每个段定义一组逻辑上完整的程序或数据。 例如

11、,一个进程中的程序和数据可划分为主程序段、子程序段、数据段与工作区段。每个段是一个首地址为零的、 连续的一维线性空间。 根据需要段长可以动态的增长。 对端式虚拟空间地址的访问包括两个部分:段名和段内地址。段式管理中以端为单位分配内存, 每段分配一个连续的内存区, 由于各段长度不等, 所以这些存储区的大小不一,而且统一进程所包含的各段之间不要求连续。段式管理的内存分配与释放在作业或进程的执行过程中动态进行。 首先,段式管理程序为一个准备进入内存准备执行的进程或作业分配部分内存, 以作为该进程的工作区和放置即将执行的程序段。随着进程的执行,进程根据需要随时申请调入新段和释放老段。 进程对于内存区的

12、申请和释放可分为两种情况。 一种是当进程要求调入某一段时, 内存中有足够的空闲区满足该段的内存要求。 另一种是内存中没有足够的空闲区。 对于第一种情况,系统要用相应的表格或数据结构来管理内存空闲区, 以便对用户进程或作业的有关程序段进行内存分配和回收。事实上,可以采用和动态分区式管理相同的空闲区管理方式。 即把内存各空闲区按物理地址从低到高排列或按空闲区的大小从小到大或从大到小排列。 与这几种空闲区自由链相对应,分区式管理时所用的几种分配算法:最先适应算法、最佳适应算法、最坏适应法 都可以用来进行空闲区分配。 当然分区式内存管理时用到的内存回收方法也可以用在段式管 理中。另一种内存管理的分配与

13、回收方法是在内存中没有足够的空闲区满足调入段的内存时 使用的。这时段式管理程序根据给定的置换算法淘汰内存中在今后一段时间内不再被 CPU访问的段,也就是淘汰那些访问率最低的段。 不过任何一个段的长度都不允许超过内存的可用区长度。除了段的初始分配之外,段的动态分配是在 CPU所要访问的指令和数据不在内存时产生缺页中断的情况下发生的。因此段的淘汰或置换算法实际上是缺页中断处理过程的一部 分。段式管理的地址变换:由于段式管理只存放部分用户信息副本在内存,而大部分信息在外存中,这必然引起 CPU访问内存时发成所访问的段不在内存中的情况, CPU如何感知所要访问的段不在内存中而启动中断处理程序呢?还有,

14、 段式虚拟地址属于一个二维的虚拟空间。 一个二维空间虚拟地址怎样变为一个一维的线性物理地址呢。(1) 段表(2) 段式管理程序在进行初始内存分配之前,首先根据用户要求的内存大小为一个作业或一个进程建立一个段表,以实现动态地址变换和缺页中断处理及存储保护等。 段式管理是通过段表来进行内存管理的。(3 )段号与用户指定的段名一一对应,始址和长度分别表示该段在内存或外存的物理地址 和实际长度。存取方式是用来对该段进行存取保护的。 只有处理机状态字中的存取控制位与段表中的存取方式一致时才能访问该段。 内外栏是指该段现在存储在外存还是内存中。 如果如果该栏目指出所访问段在外存的话, 则发生缺页中断。而访

15、问位则是根据淘汰算法的需要而设的。(4)(5)动态地址变换一般在内存中给出一块固定的区域放置段表。 当某进程开始执行的时候, 管理程序首先把该进程的段表始址放入段表地址寄存器。 通过访问段表寄存器,管理程序得到该进程段表始址从而可以开始访问段表。 然后由虚拟地址中的段号 s为索引,查段表。若该段在内存中, 则判断其存取方式是否有错。 如果存取方式正确,则从段表相应表目中查出该段在内存中的 起始地址,并将其和段内相对地址 w相加,从而得到实际内存地址。如果该段不在内存,则产生缺页中断将 CPU控制权交给内存分配程序。内存分配程序首先检查空闲区链, 以找到足够长度的空闲区来装入所需要的段。 如果可

16、用的空闲区总数小于所要求的段长,检查段表中的访问位,以淘汰那些访问概率低的段并将所需要的段调入。 段页式:页式管理和段式管理各有特长。段式管理为用户提供了一个二维的虚拟空间地址, 反映了程序的逻辑结构有利于段的动态增长以及共享和内存保护, 方便了用户,而分页式管理则有效地克服了碎片问题,提高了存储器的利用率。段页式则是将段式管理与页式管理相结合, 取长补短。段页式管理一般只用在大型系统中。段页式管理的实现原理:一个进程任然拥有一个自己的二维空间地址, 这与段式管理相同。 首先一个进程中所包含的具有独立逻辑功能的程序或数据仍被划分为段,并有各自段号 s。这反映了段式管理的特征。其次,对于段 s中

17、的程序或数据,则按照一定的大小将其划分为不同的页。和页式系 统一样最后不足一页的部分仍然占一页。 这反映了页式特征。从而段页式管理时的进程的虚拟空间中的虚拟地址由三部分组成即段号 s,页号p和页内相对地址 d,如图1所示: w PsPd图1程序员可见的仍是段号 s和段内相对地址 w。P和d是由地址变换机构把 w高几位解释 成页号p,以及把剩下的低位解释成页内地址 d。由于虚拟空间的最小单位是页而不是段, 从而内存可用区也就被划分为若干个大小相等的页面,且每段所拥有的程序和数据在内存中可以分开存放。 分段的大小也不受内存可用区的限制。段表和页表:为了实现段页式管理,系统必须为每个作业或进程建立一

18、张段表, 管理内存分配与释放、缺段处理、存储保护和地址变换等。另外,由于一个段又被划分成了若干页,每个段又必须 建立一张页表,把段中虚页转变成内存中的实际页面。 显然与页式管理相同, 页表中也要有实现缺页中断处理和页面保护等功能的表项。 另外由于在段页式管理中, 页表不再是属于进程而是属于某个段,因此段表中应该有指出该段所对应的页表始址和页表长度。动态地址变换过程:在一般使用段页式存储管理的计算机系统中, 都在内存中辟出一块固定的区域存放进程 的段表和页表。因此,在段页式管理系统中, 要对内存中指令或数据进行一次存取的话,至 少需要访问3次以上的内存。二、功能设计定义一个数组来表示一个内存空间

19、。 只做一个数组来管理内存空间, 应当能够显示当前可用的内存,管理内存的表应当占据空间最小,由于是段页式管理,所以将内存划分为页, 最理想的方式是用一位来表示内存的一个页面,当内存页面在使用时,将其置为 1,不使用时,将其置为0,这样内存管理所占用的空间才是最小。由于使用位来管理内存空间页面在程序 的处理方面比较麻烦,所以采用 char类型来表示内存空间的一个页面, char类型只占一个字节,并且内存空间的大小是定长的。所以可用内存表即为:char mmemMax; /memMaX表示最大的内存空间设计一张段表结构体数组,由于在内存空间中段表通常都是存放在内存的一块固定的区域,所以段表很适合用

20、结构体数组来表示段式管理的段表:段号始址长度存取方式内外访问位所以将段页是管理中的段表也这样类似设计, 只不过要再加一个字段表示该段所管理的页表的起始地址,设计如下:段号始址页表长度存取方式内外访问位页表始址struct segme ntL/段表int segNum;/段号int length;/段长,即多少页int rw;/访存控制int ioflg;/内外标识符int count;/访问位pageL* startAddr;/页表起始位置,pageL* :页表类型的指针int segmentFlag;;设计页表(结构体数组)在设计段页式管理的页表的时候, 他跟页式管理的页表很相近, 页表也是

21、在内存空间中划分一块固定的区域,所以页表的设计和段表有些类似, 但是要简单许多,只要显示页号和页面号即可。但是有一点区别就是, 段表在内存中的存放顺序是非连续的、 随机的,但是页表不同,每一个段所对应的页表, 在内存中应当是连续的, 任意两段所对应的页表的顺序是非连续的。页式管理的页表:页号页面号段页式管理的页表:页号页面号页面使用标识符typedef struct pageL / 页表int pageNum; / 页号int MemPgnum; / 页面号int pageFlag; /页表标识符用来标识该内存是否在使用中。pageL;段表和页表之间通过段表中的一个叫 startAddr的指针

22、进行联系,每个段的这个指针指向该 段所建立的页表,而页表由通过它的页面号与内存联系。他们之间相互关联。段表和页表在内存中都是线性结构, 他们的大小有固定的限制,所以在段表或者页表被填满的时候,要调度一定的算法进行对页表和者段表和内存页的置换。 页表的控制要稍微复杂一些,因为每一个段都对应这一张页表, 并且页表的每一项都是连续的, 还有就是页表的长度是由程序的长度来决定的,而且所有的页表在一起组成了一张大页表。段表、页表、内存之间的关系图,如图三、开发平台及源程序的主要部分:本次设计采用 C+混合C语言编程,采用 Visual Studio 2010作为开发平台。 源码如下:#in elude

23、#in clude #i nclude #define memMax 10240; 最大内存,10Musing n amespace std;void prspm();/* 一般在内存中给出一块固定的区域放置段表 */int memLe n; /内存大小int pageLe n; 页的大小typedef struct pageL 页表int pageNum; /页号int MemPg num; 页面号(内存页面号)int pageFlag;pageL;struct pageLHint len gth;pageL pageList1024; pageLH;struct segme ntL /段的

24、大小与划分不归我管,而且段表的大小是一开始就建立好的,页表在内存中有一块固定的存储区。页表的大小由进程或作业的长度决定int segNum; / 段号int len gth; /段长,即多少页int rw; /访存控制int ioflg; 内外标识int count; 访问位pageL* startAddr; 起始位置int segme ntFlag; 段表,因为段表是固定的内存区,所以直接设为数组。segPagList100;struct segme ntLHint len gth;segme ntL segPagList200;段表,因为段表是固定的内存区,所以直接设为数组。200差不多了

25、 1024页,每段5页segme ntLH;char m10240; 无法使用链表法,char类型是一个字节,节省空间,值表示页是否被使用。int fin dldlePage() 返回找到空闲内存页的第一个位置int j=1;for(i nt i=0;imemLe n*1024/pageLe n;i+)if(mi=0)mi=1;return i; j+;if(j=memLe n*1024/pageLe n)printf(所有的内存已经使用完了 !请输入数字已选择相应的置换算法! !);int totalldlePage()int n=0;for(i nt i=0;imemLe n*1024/p

26、ageLe n;i+)if(mi=0) n+;return n;int fin dIdleSegA ndWrite(i nt segNum,i nt segLe n)int i;for(i=0;i200;i+)if(segme ntLH.segPagListi.segme ntFlag=0)segme ntLH.segPagListi.segNum=segNum;segme ntLH.segPagListi.le ngth=segLe n; / 段长,即分多少页segme ntLH.segPagListi.segme ntFlag=1;return i;printf(段表没有可以填写的段! ”

27、);return -1; /没有可以填写的段就返回 -1int findSeriesldlePageList(int q) /参数q表示需要连续空间的页数 ,返回值为分配数组起始标号。int t,n=O;L1:for(t=0;tq;t+)if(pageLH.pageList n+t.pageFlag!=O)n+;if(n 1024-q)goto L1;printf(没有可用的连续页表空间! );for(t=0;tq;t+) 将已分配到的页表,标记为正在使用pageLH.pageListt+ n.pageFlag=1;return n;void si ngle()怎样判断内存区有没有空闲int

28、flag=1;i nt q=0;i nt N=0;i nt p;int segNum,le ngth;printf(请输入要输入的段的个数:n);scan f(%d,&N);printf(请依次输入段长:n);for(i nt z=1;z=q) 内存够分int i=fin dIdleSegA ndWrite(z,q); 找到可以填写的段,填写段长,段号int n=findSeriesldlePageList(q); 查找页表寻找连续 q个页表空间,返回首地址p=p-q; /在上面的函数中已经将页面数减过了,只是没有反映到 p中segme ntLH.segPagListi.startAddr=

29、&pageLH.pageList n; / 填写段的页的开始地址,页表的第 n项for(i nt j=n ;jq+n;j+) 填写页表的时候,页表的填写是连续的pageLH.pageListj.pageNu m=j-n+1;pageLH.pageListj.MemPg nu m=fi ndldlePage(); 返回找到空闲内存页 的第一个位置,并将使用位置1while(flag)/ in t p=0;/ printf(请输入一个段:段号,段长(KB)n); /段的划分不是由我来进行的,实际上段的名字来标识段,在这里用段号来取代。/ getchar();/ scan f(%d,%d, &segNum, &le ngth);/ p=totalldlePage();/ /*先看内存有没有足够的页进行分配,有:就先查找可用段,填写段表 */ q=(le ngth%pageLe n=O)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1