1、1,计算机操作系统,第5章 内存管理,2,目 录,5.1 概述 5.2 地址重定位 5.3 分区存储管理 5.4 页式存储管理 5.5 段式与段页式存储管理 5.6 内存扩充技术 5.7 虚拟存储管理,3,学习目标,了解存储管理的目的与功能,熟悉各种存储器管理的方式及其实现方法。 了解重定位、虚拟存储器的概念以及其技术。 掌握分区、页式、段式与段页式存储管理的实现原理和实现方法。 掌握虚拟存储器中的页面置换算法及请求分页系统性能分析。,4,5.1.1 存储层次结构,第一层次是高速、昂贵而容量很小的高速缓冲存储器(Cache)和寄存器; 第二层次是速度快、价格高而数据易丢失的内存和磁盘缓存; 第
2、三层次是速度较低、价格低廉、容量极大而存储内容不易丢失的外存和可移动磁盘介质,如硬盘、光盘、U盘等。,5,图 5.1 存储层次结构,5.1.1 存储层次结构,6,5.1.1 存储层次结构,1内存 主存储器简称内存或主存,是计算机系统中的主要部件,用于保存进程运行时的程序和数据,也称可执行存储器。 2寄存器 寄存器具有与处理机相同的速度,故对寄存器的访问速度最快,完全能与CPU协调工作,但价格却十分昂贵,因此容量不可能做得很大。,7,5.1.1 存储层次结构,3高速缓冲存储器 高速缓存是现代计算机结构中的一个重要部件,它是介于寄存器和存储器之间的存储器,主要用于备份主存中较常用的数据,以减少处理
3、机对主存储器的访问次数,这样可大幅度地提高程序执行速度。高速缓存容量远大于寄存器,而比内存约小两到三个数量级左右,从几十KB到几MB,访问速度快于主存储器。,8,5.1.1 存储层次结构,4磁盘缓存 由于目前磁盘的I/O速度远低于对主存的访问速度,为了缓和两者之间在速度上的不匹配,而设置了磁盘缓存,主要用于暂时存放频繁使用的一部分磁盘数据和信息,以减少访问磁盘的次数。但磁盘缓存与高速缓存不同,它本身并不是一种实际存在的存储器,而是利用主存中的部分存储空间暂时存放从磁盘中读出(或写入)的信息。主存也可以看作是辅存的高速缓存,因为,辅存中的数据必须复制到主存方能使用,反之,数据也必须先存在主存中,
4、才能输出到辅存。,9,5.1.2 存储管理目的和任务,操作系统的存储管理机构必须尽可能方便用户和提高内存的使用效率,使内存在成本、速度和规模之间获得较好的权衡 1内存分配 2地址映射 3内存共享与保护 4内存扩充,10,5.1.2 存储管理目的和任务,1内存分配 各个作业装入内存时,必须按照规定的方式向操作系统提出申请,由存储管理进行统一分配。 存储管理设置一张表格记录存储空间的分配情况,根据申请的要求按一定的策略分析存储空间的使用情况,找出足够的空闲区域进行分配。 当内存中某个作业撤离或主动归还内存资源时,存储管理要收回它所占用的全部或部分存储空间,使它们成为空闲区域,同时还要修改表格的相关
5、项。 收回存储区域的工作也称释放存储空间。,11,5.1.2 存储管理目的和任务,2地址映射 内存中往往同时存放多个作业程序,而这些程序在内存中的位置是不能预先知道的,所以用户在编写程序时不能使用绝对地址。 计算机的指令中地址部分所指示的地址通常是逻辑地址,用户按逻辑地址编写程序。当要把程序装入运行时,操作系统要为其分配一个合适的内存空间,必须把逻辑地址转换成物理地址才能得到信息的真实存放处。把逻辑地址转换成物理地址的工作称为地址转换。,12,5.1.2 存储管理目的和任务,3内存共享与保护 所谓内存空间共享,一方面是指采用多道程序设计技术使若干个程序同时进入内存,各自占用一定数量的存储空间,
6、即共享内存资源,共同使用一个内存; 另一方面是指若干个作业有共同的程序段或数据段时,可将这些共同的程序段或数据段存放在某个存储区域内,各作业执行时都可访问它们,即共享内存的某些区域。 内存共享使得内存中不仅有系统程序,而且还有若干道用户程序。为了避免内存中的多道程序相互干扰,必须对内存中的程序和数据进行保护。,13,5.1.2 存储管理目的和任务,3内存共享与保护 最基本的保护措施是规定各道程序只能访问属于自己的那些存储区域内的信息,对公共区域的访问可以加以限制,一般地说,一个程序执行时可能有以下三种情况: 对属于自己的内存区域内的数据既可读又可写; 对公共区域中允许共享的信息或可使用的别的用
7、户的信息可读而不可写; 对未获得授权的信息,既不可读又不可写。,14,5.1.2 存储管理目的和任务,4内存扩充 为方便用户编写程序,使用户编写程序时不受内存实际容量的限制,可以采用一定的技术扩充内存容量,得到比实际容量更大的内存空间。 这里的扩充不是对物理内存容量的扩充,而是指利用存储管理技术为程序的运行提供一个比实际内存更大的逻辑存储空间,即所谓的虚拟存储管理技术。 当一个大型的程序要装入内存时,可先把其中的一部分装入内存,其余部分存放在磁盘上,如果程序执行中需要用到不在内存中的信息时,则由操作系统采用覆盖技术将其调入内存。,15,5.2 地址重定位,一个逻辑地址空间的程序装入到物理地址空
8、间时,由于两个空间不一致,需要进行地址变换,称为地址重定位。 此时,相对地址空间(也称为逻辑地址空间)通过地址重定位机构转换到绝对地址空间(也称为物理地址空间)。,16,5.2 地址重定位,地址空间是逻辑地址的集合,存储空间是物理地址的集合。名字空间、地址空间和存储空间的关系如图5.2所示,图 5.2 名字空间、地址空间和存储空间,程序的装入和链接,用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:(1) 编译,由编译程序(Compiler)对用户源程序进行编译,形成若干个目标模块(Object Module);(2) 链接,由链接程序(
9、Linker)将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);(3) 装入,由装入程序(Loader)将装入模块装入内存。图a给出了这样的三步过程,程序的装入和链接,图a对用户程序的处理步骤,程序的装入,1. 绝对装入方式(Absolute Loading Mode)编译时,若知道程序将驻留在内存的某位置,则编译程序将产生绝对地址的目标代码,绝对装入程序按照装入模块的地址,将程序和数据直接装入指定内存。该地址既可在编译和汇编时给出,也可以由程序员直接赋予。程序员直接给出绝对地址,使得程序修改时很可能要修改所有地址。因此宁可在程序中采
10、用符号地址,在编译时再去转换成绝对地址。单道程序环境下,可用此种方式。 而在多道程序环境下,目标模块的起始地址通常从0开始,程序中的其他地址,都相对于起始地址计算。这样的模块称为相对装入模块。,程序 JUMP i LOAD j DATA,JUMP 400 LOAD 1200,JUMP 1424 LOAD 2224,符号地址,绝对地址,相对地址,i,j,1024,1424,2224,0,400,1200,绝对和可重定位装入模块,(a)目标模块,(b)绝对装入模块,(c)相对装入模块,程序的装入,2. 可重定位装入方式(Relocation Loading Mode) 把在装入时对目标程序中的指令
11、和数据地址的修改过程称为重定位。 对于相对装入模块,应采用可重定位装入方式来把装入模块装入内存。 装入相对装入模块时,装入程序要将模块的起始地址与内存某位置的地址相加,才能将模块定位到正确的物理地址,同样,模块中的指令地址和数据地址都要相应修改。 因地址变换只是在装入时一次完成,以后不再改变,故称为静态重定位。,LOAD 1,2500,365,0,1000,2500,5000,作业地址空间,LOAD 1,12500,365,11000,12500,15000,内存空间,作业装入内存时的情况,10000,程序的装入,3. 动态运行时的装入方式(Dynamic Run-time Loading)多
12、道程序环境下,程序在内存的位置可能要经常改变,如进程的换入换出,每次换入到内存的位置一般是不同的,这样,就应采用动态运行时的装入方式。 动态运行时的装入程序,把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是等到程序真正要执行时才进行地址转换(转换时机的把握)。因此,装入内存后的所有地址仍是相对地址。为使地址转换不影响指令的执行速度,这种方式需要一定的特殊硬件的支持。,程序的链接,实现链接的方法有三种:静态链接、装入时动态链接和运行时动态链接。 1、静态链接:,模块A CALL B: RETURN,模块B CALL C: RETURN,模块C RETURN,模块A JSR
13、 “L” RETURN,模块B JSR “L+M” RETURN,模块C RETURN,0,L-1,0,M-1,0,N-1,0,L-1,L,L+M-1,L+M,L+M+N-1,需要解决的 两个问题: 1、对相对地 址进行修改 2、变换外部 调用符号,目标模块,装入模块,图b 程序链接示意图,程序的链接,2. 装入时动态链接(Load-time Dynamic Linking)这是指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要按照图b所示的方式修改
14、目标模块中的相对地址。装入时动态链接方式有以下优点:(1) 便于修改和更新。(2) 便于实现对目标模块的共享。,程序的装入,3. 运行时动态链接(Run-time Dynamic Linking)这种链接方式,可将某些目标模块的链接,推迟到执行时才进行。即在执行过程中,若发现一个被调用模块尚未装入内存时,由OS去找到该模块,将它装入内存,并把它链接到调用者模块上。,27,5.3 分区存储管理,5.3.1 单一连续分区存储管理 这是最简单的一种存储管理方式,但只能用于单用户、单任务的操作系统中。 在单道程序环境下,当时的存储器管理方式是把内存分为系统区和用户区两部分,系统区仅提供给OS使用,它通
15、常是放在内存的低址部分。而在用户区内存中,仅装有一道用户程序,即整个内存的用户空间由该程序独占。这样的存储器分配方式被称为单一连续分配方式。,28,5.3 分区存储管理,5.3.2 固定分区管理 固定分区式分配是最简单的一种可运行多道程序的存储管理方式。这是将内存用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业,这样,把用户空间划分为几个分区,便允许有几道作业并发运行。 当某一分区空闲时,便可以从外存的后备作业队列中选择一个适当大小的作业装入该分区,当该作业结束时,又可再从后备作业队列中找出另一作业调入该分区。,29,5.3 分区存储管理,5.3.2 固定分区管理 1. 划分分区
16、的方法(1) 分区大小相等(指所有的内存分区大小相等)。(2) 分区大小不等。将内存划分出多个较小的分区,适量的中等分区和少量的大分区。 2. 内存分配为了便于内存分配,通常将分区按其大小进行排队,并为之建立一张分区使用表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配),如图5.5所示。,30,5.3 分区存储管理,图 5.5 固定分区分配,31,5.3 分区存储管理,5.3.3 可变分区管理(动态分区管理) 固定分区分配是最早的多道程序存储管理方式,由于每个分区的大小固定,必然会造成存储空间的浪费。 可变分区分配是指在系统运行的过程中根据作业对内存的实际需要,动态地为之分配内存空
17、间的一种分区方法。 可变分区分配是在作业装入和处理过程中建立的分区,并使分区的大小与作业的大小相等。 分区的个数和大小不是固定不变的,而是根据装入的作业动态地划分。,5.3.3 可变分区管理,1. 可变分区分配中的数据结构 常用的数据结构有以下两种形式: 空闲分区表,在系统中设置一张空闲分区表,用于记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区号、分区大小和分区始址等数据项。 空闲分区链。为了实现对空闲分区的分配和链接,在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针,在分区尾部则设置一后向指针。通过前、后向链接指针,可将所有的空闲分区链接成
18、一个双向链。,5.3.3 可变分区管理,2. 分区分配操作1) 分配内存系统应利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。设请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.size。,内存分配流程,size为内存中允许存在的最小内存空间尺寸,5.3.3 可变分区管理,2) 回收内存 当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一: (1) 回收区与插入点的前一个空闲分区F1相邻接。(2) 回收分区与插入点的后一空闲分区F2相邻接。(3) 回收区同时与插入点的前、后两个分区邻接。(4) 回收区既不与F
19、1邻接,又不与F2邻接。这时应为回收区单独建立一个新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。,36,5.3.4 分区分配算法,可变分区分配常采用的几种分配算法: 1.首次适应算法 2.最优适应算法 3.最差适应算法 4.循环首次适应算法 5.快速适应算法,37,1.首次适应算法,该算法要求分区链以地址递增的次序链接。内存分配时,从链首开始顺序查找,直至找到一个能满足其大小要求的空闲区为止。然后,再按照作业的大小,从该区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲链中。 该算法倾向于优先利用内存中低址部分的空闲区,高址部分的很少利用,从而保留了高址部分的大空闲
20、区,为以后到达的大作业分配大的内存空间创造了条件。但低址部分留下许多难以利用的很小的空闲区 ,每次查找又都从低址部分开始,这样,增加了查找开销。,38,2.循环首次适应算法,由首次适应算法演变而来,分配内存时,不再每次从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间。 为实现该算法,应设置一起始查询指针,并采用循环查找方式。该算法能使内存中的空闲分区分布得更均匀,减少查找空闲分区的开销,但这会缺乏大的空闲分区。,39,3.最佳适应算法,“最佳”的含义是指每次为作业分配内存时,总是把既能满足要求又是最小的空
21、闲分区分配给作业,避免“大材小用”。为加速查询,该算法要求将所有的空闲区按其大小以递增的顺序链接成一空闲区链。这样,第一次找到的满足要求的空闲区,必然是最优的。 孤立地看,这似乎是最佳的,但从宏观上看却不一定。因为每次分配后所切割下的剩余部分,总是最小的,在存储器中会留下许多难以利用的小空闲区。,40,4.最差适应算法,由于最坏适应分配算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区表或链表时,总是挑选一个最大的空闲区,从中分割一部分存储空间给作业使用,以至于存储器中缺乏大的空闲分区,故把它称为是最坏适应算法。 该算法要求将所有空闲分区,按容量从大到小的顺序,形成一空闲分区链
22、,查找时,只要看第一个分区能否满足作业要求即可。,动态分区示例:请使用下面的算法再分配一个16M的内存空间?1.首次适应(First fit)2.循环首次适应(Next fit)3.最佳适应(Best fit)4.最差适应(Worst fit),最佳适应,首次适应,循环首次适应,最差适应,43,5.快速适应算法(基于索引),该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样,系统中存在多个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一个表项对应了一种空闲分区类型,并记录了该类型空闲分区链表的表头指针。 该算
23、法在搜索空闲分区时分二步:第一步是根据进程长度从索引表中找到能容纳它的最小空闲区链表;第二步是从链表中取下第一块进行分配。,44,5.快速适应算法,优点:查找效率高。另外在进行空闲分区分配时,不会对任何分区产生分割,能保留大的空闲分区,同时也不会产生内存碎片。 缺点:在分区归还时算法比较复杂,系统开销较大。该算法在分配空闲分区时是以进程为单位,一个分区只属于一个进程,因此在为进程所分配的一个分区中,或多或少地存在一定的浪费。空闲分区划分越细,浪费越严重,整体上会造成可观的存储空间浪费,这是典型的以空间换时间的作法。,45,哈希算法,哈希算法是利用哈希快速查找的优点,以及空闲分区在可利用空闲分区
24、表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。 进行空闲分区分配时,根据所需空闲分区大小,通过哈希函数计算,即得到在哈希表中的位置,从中得到相应的空闲分区链表,实现最佳分配策略。,46,伙伴系统,该算法规定,无论已分配分区或空闲分区,其大小均为2的k次幂(k为整数,lkm),其中2l表示分配的最小块的尺寸,2m表示分配的最大的块的尺寸。通常, 2m是可供分配的整个内存的大小。 (1)开始时,可用于分配的整个空间被看成是一个大小为2m的块; (2)如果请求的大小s满足2m-1 s = 2m ,则分配整个空间;否则,该块
25、被分成两个大小相等的伙伴,均为2m-1 ,如果有2m-2 s = 2m-1 ,则给该请求分配两个伙伴中的一个,否则,其中的一个伙伴被继续分成两半。这个过程一直持续直到产生大于或等于s的最小块,并将其分配。,伙伴系统的例子,动态可重定位分区分配,1. 紧凑 连续分配方式的一个重要特点是,一个系统或用户程序必须被装入一片连续的内存空间中。当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小的分区,而缺乏大的空闲空间。 通过移动内存中作业的位置,把原来多个分散的小分区拼接成一个大分区的方法,称为“拼接”或“紧凑”。紧凑后的的用户程序在内存中的位置发生了变化, 需对他们的地址进行修改以及进行重
26、定位。,图4-11 紧凑的示意,动态可重定位分区分配,2. 动态重定位该方式必须获得硬件机构的支持。在系统中增加一个重定位寄存器,用来存放程序在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。或者说,地址变换过程是在程序执行期间,随着对每条指令和数据的访问而自动进行,故称为动态重定位。 当系统对内存进行了紧凑,而使若干程序在内存中移动后,不需对程序做任何修改,只要用该程序在内存的新起始地址,去置换原来的起始地址。,50,动态可重定位分区分配,3. 动态重定位分区分配算法动态重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法
27、中,增加了紧凑的功能。通常,当该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这时便须对内存进行“紧凑”,将经“紧凑”后所得到的大空闲分区分配给用户。如果所有的小的空闲分区的容量总和仍小于用户的要求,则返回分配失败信息。,52,5.4 页式存储管理,分区管理实现方式较为简单,但由于该管理方式要求每一个作业必须分配到内存中的一组连续的存储单元内 一是作业的分配受空闲分区大小的限制,若连续空闲区的大小不能满足作业的需求,即使系统中空闲区的总量大于需求量,也不能进行分配; 二是导致了内存碎片问题,使内存利用率不高,并且内存合并也要耗费大量的CPU时
28、间; 三是由于各作业对应于不同的分区,不利于程序段和数据段的共享。,53,5.4 页式存储管理,分页存储管理取消了存储分配连续性的要求,使一个作业的地址空间在内存中可以是若干个不连续的区域。 基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。,54,5.4 页式存储管理,分页存储管理方式。该方式是将用户程序的地址空间划分成若干个固定大小的区域(称为页或页面);相应地,内存空间也被划分成若干个物理块,页和块的大小相等,典型大小为1KB。这样,用户程序的任意页可放在内存的任一块。 分段存储管理方式。该方式是把用
29、户程序的地址空间分成若干个大小不等的段,每段可定义一组相对完整的逻辑信息。进行存储分配时,以段为单位,段在内存中可以不邻接。 段页式存储管理方式。分页和分段两种存储管理方式相结合的产物。,55,5.4.1 页面变换基本思想,页面和物理块(1) 页面。分页存储管理是将内存分成大小固定的若干块,一般每一块的大小为1KB、2KB或4KB,每个这样的内存块称为页或物理块。将逻辑空间划分成若干个页,并为每页加以编号,从第0页开始,第1页,第2页,。同时,将内存的物理地址空间划分成若干个块,同样为它们加以编号。进程分配内存时,将进程中的若干个页分别装入到多个可以不相邻的物理块中。会产生“页内碎片”。(2)
30、 页面大小。 过小,一方面可以减小内存碎片,另一方面会使进程占用较多页面,导致进程页表项过长,占用大量内存;过大,会使页内碎片增大。,56,5.4.1 页面变换基本思想,57,5.4.1 页面变换基本思想,1. 逻辑地址 分页地址结构如下所示: 页号P:表示属于哪一页。页内地址W:在页内的地址,其长度表示每一页的大小。,58,5.4.1 页面变换基本思想,2.页表 在进行存储分配时,允许将进程的各个页离散地存储在内存中不同的物理块中,但系统应能保证进程的正确运行。 页表中至少应包含以下信息: (1) 页号:进程各页的序号; (2) 物理块号:进程各页对应存放在内存中的物理块的块号。,59,5.
31、4.1 页面变换基本思想,60,5.4.2 地址变换过程,地址变换机构的基本任务是实现逻辑地址到物理地址的转换。由于页内地址与块内物理地址是一一对应的,故无须再转换。因此地址变换机构的任务,实际上是将逻辑地址中的页号,转换为内存中的物理块号。又因为页面映射表的作用就是用于实现从页号到物理块号的变换,所以地址变换任务是借助于页表来完成的。,61,5.4.2 地址变换过程,页表的功能可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但现代计算机系统大多都将页表驻留在内存,并设置一个页表寄存器PTR(Page-Table Register),用于存放页表在内存的始址和页表的长度。 进程要访问某个
32、逻辑地址中的数据时,(1)分页地址机构自动地将有效地址分为页号和页内地址两部分;(2)再以页号为索引去检索页表;(3)将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是从中得到该页的物理块号,将之装入物理地址寄存器中;(4)同时再将有效地址寄存器中的页内地址直接送入物理地址寄存器的块内地址字段中。,62,5.4.2 地址变换过程,物理地址计算如下 物理地址 = 物理块号 x 页面大小 + 页内地址,分页系统的地址变换机构,页表寄存器PTR,页表始址,页表长度,页号(3),页内地址,1,b,块号,页号,2,3,0,1,页 表 项 长 度,b,物理地址寄存器,内存,+,页内地
33、址,页 表,越界中断,逻辑地址L,物理地址 = 物理块号 x 页面大小 + 页内地址,64,5.4.3 快表,由于页表作为数据本身是存放在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,以形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式将使计算机的处理速度降低近1/2。可见,以此高昂代价来换取存储器空间利用率的提高,是得不偿失的。,65,5.4.3 快表,为提高地址变换速度,可在地址变换机构中增设一个称为快表的高速缓冲存储器,用以存放当前访问的
34、页表项。 此时地址变换过程是:CPU给出有效地址后,地址变换机构自动地将页号P送入快表高速缓存,并与其中的所有页号比较,若有与此相匹配的页号,则直接读出该页所对应的物理块号,送物理地址寄存器。若未找到,则再访问内存中的页表,找到后,把从页表项中读出的物理块号送地址寄存器;同时将此页表项存入快表。若快表已满,OS须找到一个老的且已被认为不再需要的页表项将它换出。,图 5.9具有快表的地址变换机构,5.4.3 快表,67,5.4.3 快表,页号在快表中被查找到的概率被称为命中率。在具有快表的系统中,有效访存取时间(Effective Access Time, EAT),即访问存储器所需时间的平均值
35、,计算公式为 EAT = PTLB(TTLB+TM)+(1-PTLB)(TTLB+TM+TM) 其中PTLB为快表命中率,TTLB为访问快表的时间,TM为访问内存的时间。 假如查找块表需要20ns,访问内存需要100ns,那么总的访问时间是120ns。如果不能在快表中找到该页表项,那么必须先访问位于内存中的页表得到相应的物理块号(花费120ns),然后再访问内存(花费100ns),总共需要220ns。则: EAT0.85(20+100)(1-0.85)(20+200)135ns,快表命中,快表没命中,除访问快表外,还需要访问内存,68,5.4.4 多级页表,现代的大多数计算机系统支持的逻辑地址
36、空间达到64位以上,在这样的环境下,页表就变得非常大,此时页表项的个数会非常多,要占用相当大的内存空间。 (1) 采用离散分配方式来解决难以找到一块连续的大内存空间的问题; (2) 只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。,69,5.4.4 多级页表,1) 两级页表 对于要求连续的内存空间来存放页表的问题,可以利用将页表进行分页,并离散的将各个页面分别存放在不同的物理块中的办法来加以解决,同样也要为离散分配的页表再建立一张页表,称为外层页表(Outer Page Table) ,在每个页表项中记录了页表页面的物理块号。,1011,1078,外部页表,1742
37、,0,1,n,2,第1页页表,1,3,4,115,114,1468,第0页页表,第n页页表,内存空间,0,1,1,1,0,0,2,2,3,4,115,114,1468,1023,1023,两级页表结构,0,P1,逻辑地址,d,P2,外部页表寄存器,+,+,b,d,外部页表,页表,物理地址,外部页 外部页内地址 页内地址,具有两级页表的地址变换机构,72,5.4.4 多级页表,2)多级页表 随着64位机器的普及,两级页表会出现外部页表非常大,要占用相当大的内存空间的问题。 可以采用三级或三级以上页表的方式,将原来两级页表中的外部页表再进行分页,然后利用第二级的外层页表来映射页表之间的关系。 多级
38、页表类似于多级目录。 UNIX系统中使用了三级页表来实现地址映射。,73,反置页表(Inverted Page Table),为减少页表占用的内存空间而引入了反置页表。前述页表的表项是按页号进行排序,页表项中的内容是物理块号,而反置页表是为每一个物理块设置一个页表项并将它们按物理块的号数排序,其中的内容则是页号及其隶属进程的标识符。 利用反置页表进行地址变换时,是用进程标识符和页号去检索反置页表。若检索完整个页表都未找到与之匹配的页表项,表明此页此时尚未调入内存。此时应请求调页或表示地址出错。若检索到与之匹配的表项,则该表项的序号便是该页所在的物理块号,因之可将该块号与页内地址一起,构成物理地
39、址送内存地址寄存器。,74,5.5.1 段式存储管理,1.分段系统的基本原理 动态分区分配方式中,系统为整个进程分配一个连续的内存空间。而在分段式存储管理系统中则以段为单位分配内存,每段分配一个连续的内存区域,但各段之间不要求连续。 其内存的分配和回收类似于动态分区分配方式,但两者之间也有不同。在分段存储管理系统中,一个作业可以有多个段,这些段允许离散地存放在内存的不同分区当中,而分区存储管理方式则要求整个作业存放在一个内存分区中。,75,5.5.1 段式存储管理,1) 分段 在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。每个段都从0开始编址,并采用一段连续的
40、地址空间,段的长度由相应的逻辑信息的长度决定。其逻辑地址由段号和段内地址所组成。例如,有主程序段Main、子程序段Sub、数据段Data及栈段Stack等,如图5.11所示。 分段地址中的地址具有如下结构:,段号,31,16,15,0,段内地址,76,5.5.1 段式存储管理,1) 分段,图 5.11利用段表实现地址映射,77,5.5.1 段式存储管理,2) 段表 作业的一个段被分配一个连续的分区,而进程中的各个段可以离散地放入内存中不同的分区中,为能从物理内存中找出每个逻辑段所对应的位置,在系统中为每个进程建立一张段映射表,简称段表。每个段在表中占有一个表项,其中记录了该段在内存中的起始地址
41、(基址)和段的长度(段长)。段表可以存放在一组寄存器中,更常见的是存放在内存中。,3) 地址变换机构,段表始址,段表长度,2,100,段号S,段号,0,3,2,1,+,+,8292,8K,8292,8692,逻辑地址,物理地址,主存,位移量,段表寄存器,越界,79,5.5.1 段式存储管理,2.分页和分段的主要区别 分页和分段系统有许多相似之处,但在概念上二者完全不同: (1) 页是信息的物理单位,仅仅是出于系统管理的需要;段是信息的逻辑单位,其目的是满足用户的需要。 (2) 页的大小固定且由系统确定,一个系统只能有一种大小的页面;段的长度不固定,决定于用户所编写的程序; (3) 分页的作业地
42、址空间是一维的;分段的作业地址空间是二维的。 (4) 通常分段的段内空间会比分页的页面空间大,因此段表会比页表短。,80,5.5.2 段页式存储管理,1) 基本原理 段页式系统的基本原理是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。在段页式系统中,其地址结构由段号、段内页号及页内地址三部分所组成,如下图所示。 为实现从逻辑地址到物理地址的变换,系统需同时配置段表和页表,段表的内容是页表始址和页表长度,这与分段式系统不同。,段号(S) 段内页号(P) 页内地址(W),图 5.14 利用段表和页表实现地址映射,5.5.2 段页式存储管理,82
43、,5.5.2 段页式存储管理,2) 地址变换过程 在段页式系统中,为了便于实现地址变换,需要配置一个段表寄存器,其中存放段表始址和段表长度。进行地址变换时按如下步骤进行: (1) 通过段表寄存器将段号与段表长度进行比较,如果未越界则查找段表在内存中的位置,否则越界中断; (2) 访问段表,将页表长度与页号进行比较,如果未越界则根据段号查找页表所在的位置; (3) 访问页表,根据页号查找该页所在的物理块号; (4) 将物理块号和地址结构中的页内地址相加,形成内存单元的物理地址。,图 5.15 段页式地址变换过程,5.5.2 段页式存储管理,84,5.6 内存扩充技术,前面所介绍的各种存储管理方式
44、都有一个共同的特点,那就是都要求将一个作业的全部装入内存后方能运行,于是,出现了这样两种情况: 一是有的作业很大,其所要求的内存空间超过了内存空间的总容量,作业不能装入内存,导致其无法运行; 二是有大量的作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存运行,其它大量作业留在外存等待。 出现这两种情况的原因,都是由于内存容量不够大。 一个明显的解决办法就是增加物理内存;另一种方法就是从逻辑上来扩充内存容量。,85,5.6.1 覆盖技术,覆盖技术是指一个程序的若干程序段或几个程序的某些部分共享某一个存储空间。覆盖技术的实现是把程序划分为若干个功能上相对独立的程序段,按照其
45、自身的逻辑结构使那些不会同时执行的程序段共享同一块内存区域。未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,再把后续程序段调入内存,覆盖前面的程序段。,86,5.6.1 覆盖技术,覆盖技术是早期采用的简单的扩充内存技术,对用户不透明,它要求用户清楚地了解程序的结构,并指定各程序段调入内存的先后次序,以及内存中可以覆盖掉的程序段的位置等,增加了用户的负担。而且程序段的最大长度仍受内存容量的限制。覆盖技术可以由编译程序提供支持,此时被覆盖的块是由程序员或编译程序预先确定的。,87,5.6.2 交换技术,交换的引入 一方面,在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用
46、了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞,而无可运行之进程,迫使CPU停止下来等待的情况;另一方面,却又有着许多作业,因内存空间不足,一直驻留在外存上,而不能进入内存运行。 所谓交换(对换),是指把内存中暂时不能运行的进程,或暂时不用的程序和数据,换出到外存上,以腾出足够的内存空间,把已具备运行条件的进程,或进程所需的程序和数据,换入内存。,88,5.6.2 交换技术,交换技术的目的是尽可能快的实现进程在内、外存之间的交换,从而提高内存利用率。早期的交换技术多用于分时系统当中,大多数现代操作系统也都使用交换技术,交换技术有力地支持了多道程序设计,同时交换技术也是虚拟存储技术的
47、基础。交换基础实施时需要考虑如下问题: 换出进程的选择 交换时机的确定 交换空间的分配 换入进程换回内存时位置的确定,89,5.7 虚拟存储管理5.7.1 基本原理,1. 常规存储器管理方式的特征 (1) 一次性。作业在运行前需要一次性的将其全部装入内存。但许多作业在每次运行时,并非其全部程序和数据都使用到了,如果一次性的将其全部装入,实际上也是对内存空间的一种浪费。 (2) 驻留性。作业装入内存后,便一直驻留在内存中,直至作业运行结束。尽管运行中的进程会因各种事件而长期等待,或有些模块在运行过一次以后就不再需要了,但它们仍将继续占用宝贵的内存资源。,90,5.7.1 基本原理,2. 局部性原
48、理 程序运行时存在的局部性现象,很早就已被人发现,但直到1968年,P.Denning才真正指出:程序在执行时将呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分,相应地,它所访问的存储空间也局限于某个区域。 局限性又表现在下述两个方面:(1) 时间局限性。程序中的某条指令被执行,不久后会再次执行;某个数据被访问,不久后将再次被访问。产生时间局限性的典型原因是在程序中存在着大量的循环操作。(2) 空间局限性。 程序访问了某个存储单元,不久后,其附近的存储单元也将被访问。,91,5.7.1 基本原理,3. 虚拟存储 基于局部性原理可知,应用程序在运行之前没有必要将之全部装入内存,而
49、仅须将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂留在盘上。 局部性原理是实现虚拟存储管理的理论基础。 所谓虚拟存储器是指仅把作业的一部分装入内存便可运行的存储器系统,是具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。虚拟存储器的逻辑容量由系统的寻址能力和外存容量之和所决定,与实际的内存容量无关。,92,5.7.1 基本原理,虚拟存储特征(1) 多次性:是指一个作业被分成多次来调入内存,即作业运行时不需将其全部装入内存,只需将当前要运行的那部分程序和数据装入,以后运行到某些部分时再将其调入。 (2) 对换性:是指允许作业中的程序和数据,在作业运行过程中换进、换出。 (3) 虚拟性:是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。 虚拟性以多