目录
前言:层次化存储
典型存储器层次结构
外设与内存的关系:
重定位的概念:
1. 物理地址(physical address):
2. 物理地址空间:
3. 逻辑地址:
4. 逻辑地址空间:
3 . 3 内存管理
3.3.1 地址变换
3 . 3 . 2 内存支持多道程序的技术手段:分区存储管理
1 . 固定分区(固定个数、固定大小、固定位置)
2 . 可变分区(类似Malloc和Free:个数、大小、位置可变)
3 . 3 . 3 段页式存储管理
1 . 页式存储管理
2 . 段式存储管理
3 . 段页式存储管理
3 . 3 . 4 虚拟存储管理(适合可执行文件存放在文件系统的系统)
1 . 局部性原理
2 . 工作集
3 . 页面置换算法
前言:层次化存储
内存管理的根本原因是:
- 所有程序所需要的内存空间,远大于实际的物理内存的空间,不可能一次性把所有的程序加载到系统的内存空间,因此就需要设计出一套机制,让不同的应用程序(已经运行的、正在运行的、未来运行的)程序共享有限的物理内存。
- 正是因为不可能一次性加载所有的程序,而是需要按需动态加载,因此,程序在内存中的物理位置是不一定的,而程序编程时有不能没有地址,因此,就需要一套机制把编程时的连续的地址空间映射成运行时不连续的物理地址空间。
这就是内存管理的背景、目标和意义!!!是内存管理要解决的问题!!!
典型存储器层次结构
按照速度、容量和成本划分,存储器系统构成一个层次结构,如下图所示。
外设与内存的关系:
内存也称主存,是指CPU能直接存取指令和数据的存储器,是现代计算机系统进行操作的中心。
外存也称辅存,是指一些外部的存储设备,例如硬盘、软盘和磁带等存储器。
用户的程序和数据,通过I/O系统接口,从外部设备(硬盘)中读到内存中才能运行。
重定位的概念:
可执行程序与进程:每个可执行的应用程序都是应用程序进程。
1. 物理地址(physical address):
物理地址是指出现CPU外部地址总线(与硬件直接相连)上的寻址物理内存的地址信号,是地址变换的最终结果地址。
内存中各物理存储单元的地址是从统一的基地址开始顺序编址的,这种地址称为物理地址,也称为绝对地址。
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。
如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。
如果没有启用分页机制,那么线性地址就直接成为物理地址了。
2. 物理地址空间:
由内存中一系列存储单元所限定的地址范围称作物理地址空间,或简称为物理空间,内存空间。
3. 逻辑地址:
用户程序的目标模块(程序)都以0为基地址顺序编址的,这种地址称为逻辑地址,也称为相对地址(相对于0地址处的地址)。
4. 逻辑地址空间:
由程序中逻辑地址组成的地址范围叫做逻辑地址空间,或简称为地址空间。
虚拟地址(virtualmemory):
虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的任务。在Linux 0.11内核中,给每个程序(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。
有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。
重定位:程序和数据装入内存时,需对目标程序中的地址进行修改。这种把逻辑地址转变为内存物理地址的过程称作重定位。
3 . 3 内存管理
由于任何程序和数据都必须占用内存空间后才能执行,因此,内存管理的优劣直接影响系统的性能。尽管现代计算机中内存容量不断增大,但仍不能保证有足够的空间来支持大型应用程序和数据的使用,因此,操作系统的任务之一是尽吋能地方便用户使用和提高内存的利用效率。
此外,有效的内存管理也是多道程序设计系统的关键支撑。具体来说,内存管理的功能主要包括以下几个方面:
(1)内存空间的分配与回收: 这是应用程序最常见的功能
Malloc和Free都是
(2)地址映射(对应用程序不可见):逻辑地址=》物理地址的映射
配合硬件进行地址转换工作,把用户源代码中使用的逻辑地址转换成处理器能访问的物理内存的物理地址。
(3)内存空间的共享与保护
使得若干个进程能够同时访问公共程序所占的内存区,同时,能够防止多个程序在执行中互相不干扰,并保护区域内的信息不被破坏。
(4)虚拟内存:外存对内存的扩充 =》虚拟地址与外存的映射
当内存容 不足时,操作系统要采取某种措施,在不改变实际内存容量的前提下,借助于大容量的外存来解决内存不够用的问题。
3.3.1 地址变换
用户作业的程序通常用高级语言编写,称为源程序。
但源程序是不能被计算机直接执行的,需要通过编译程序或汇编程序编译获得目标程序。
目标程序中的地址不是内存的实际地址,一般将用户目标程序中使用的地址单元称为逻辑地址(也称为相对地址或虚拟地址),逻辑地址一般以0为基地址进行编址,是程序经过编译或汇编后形成的目标模块或装配连接程序的地址编码。
一个用户作业的目标程序的逻辑地址集合称为该作业的逻辑地址空间。
作业的逻辑地址空间可以是一维的,这时逻辑地址限制在从0开始顺序排列的地址空间内;
也可以是二维的,这时整个用户作业被分成若干段,每段有不同的段号,段内地址从0 开始。
当程序运行时,它将被装入内存地址空间的某些部分,此时程序和数据的实际物理地址一般不可能与原来的逻辑地址一致,将内存中的实际存储单元称为物理地址(也称为绝对地址或实际地址)。物理地址的总体构成了用户程序实际运行的物理地址空间(也称为存储空间),它是由存储器地址总线扫描出来的空间,其大小取决于实际安装的内存容。为了保证程序的正确运行,必须将程序和数据的逻辑地址转换为物理地址,这一工作称为地址转换或重定位。一般情况下,一个作业在装入内存时分配到的存储空间和它的逻辑地址空间是不一致的。在装入作业或执行时,若不对有关地址加以修改,将导致错误的结果。因此,需要将程序中的地址调整成与所装入的内存空间相一致,有关地址部分的调整过程就是地址重定位的过程。重定位公式表示为:物理地址= 起始的物理地址+逻辑地址,例如,一个作业被装入到从1000开始的内存区域中,则该作业的物理地址为其逻辑地址值加上1000。
地址转换通常有两种方式:分别是静态重定位和动态重定位。
静态重定位是指在作业装入时由作业装入程序(装配程序)实现地址转换。这种方式要求目标程序使用相对地址,即直接把目标程序中的地址通过软件的方式给替换掉,地址变换在作业/程序执行前一次性完成。静态重定位的特点是容易实现,无需增加硬件地址变换机构,当操作系统为程序分配一个内存区域后,只需将程序中的指令或操作数的逻辑地址加上分配内存区的起始地址就得到了物理地址。如下图所示:
但这种方式要求为每个程序分配一个连续的存储区,在程序执行期间不能移动,且难以做到程序和数据的共享(相同的数据区,在不同的程序中共享,如果程序共享DLL和数据共享-共享内存,则无法统一替换),其内存利用率低。
因为静态替换,是针对程序或数据的各自的整个内存空间进行整体地址更换,而共享内存区既属于进程1,也属于进程2,静态替换时是无法实现的。
动态重定位是指在程序执行过程中, C P U 访问程序和数据之前实现地址转换。
在多道程序系统中,可用的内存空间常常被许多进程共享,程序员编程时事先不可能知道程
序执行时的驻留位置,而且必须允许程序因地址对换或收集而被移动,这些现象都需要程序的动态重定位。
动态重定位必须借助于硬件的地址转换机构来实现,最简单的方式是利用一个重定位寄存器。当某个作业开始执行时,操作系统负责将该作业在内存中的起始地址送入重定位寄存器中。之后,在作业的整个执行过程中,每当访问内存时,重定位寄存器的内容将被自动地加到逻辑地址送入内存地址寄存器中去,从而得到与该逻辑地址对应的物理地址,用内存地址寄存器的内容访问数据,如下图所示:
动态重定位的优点是程序可在内存中移动,当程序移动后,只要将新的内存区域的首地址放进基址寄存器就可以了。
而且,动态重定位方式容易实现程序的共享,有可能提供虚拟存储空间。
SWAP对换技术与虚拟地址:
对换技术也称作交换技术,它的实现方式就类似于日常生活中几个单位租用一个会议厅那样,甲单位租用时间到了,就退出会议厅,由乙单位使用;乙单位到时后,也退出去,由丙单位使用,等等。如甲单位还需使用,就再租用,由管理者安排占用时间。
在多道程序环境中可以采用对换技术。此时,内存中保留多个进程。当内存空间不足以容纳要求进入内存的进程时,系统就把内存中暂时不能运行的进程(包括程序和数据)换出到外存上,腾出内存空间,把具备运行条件的进程从外存换到内存中。在UNIX/Linux系统中对内存的管理就利用了这种多道程序的对换技术,如图下图所示:
3 . 3 . 2 内存支持多道程序的技术手段:分区存储管理
存储器的管理方式随着操作系统的发展而发展,早期存储管理方式发展的推动力, 主要来自于“千方百计地提高存储器的利用率”。这样,由固定式分区存储分配方式演变为分页式存储管理方式,此时,存储器利用率已达到较为令人满意的程度,而后存储器管理继续发展的动力,则主要来自于更好地满足用户的需要,这样,又产生了分段式存储管理方式和虚拟存储器。
在存储管理系统中,最简单的方法就是单一连续管理,即将内存空间分成两个存储域,一个区域用来存储操作系统程序,另一个区域归用户使用,称为用户内存区。
该管理方式的主要特点是管理简单,不需要太多的软硬件支持。但由于内存屮只允许存放 一个作业,系统的资源利用率不高,一般只能用于单用户、单任务的操作系统中。
分区管理是支持多道程序运行的最简单的一种内存管理方式,主要有固定分区、可变分区、 可重定位分区和多重分区4 种方式。
1 . 固定分区(固定个数、固定大小、固定位置)
固定分区也称为静态分区,是在作业装入之前,内存就被划分为若干个分区。划分工作可以由系统管理员完成,也可以由操作系统实现。一旦划分完成,在系统运行期间不再重新划分,即分区个数不可变,分区大小不可变。
这种分区方式一般将内存的用户区域划分成大小不等的分区,以适应不同大小的作业的需要。系统有一张分区说明表, 每个表目说明一个分区的大小、起始地址和是否己分配的标志。
备注:
- 作业或程序的大小,必须小于分区的大小,否则分区无法容纳程序。
- 每个分区是通过某种技术手段确保相互隔离的,不允许相互越区访问。
固定分区的主要优点是实现技术简单,适用于作业的大小和多少事先都比较淸楚的系统中;
其主要缺点是由于每个分区只能存放一个作业,所以内存的利用率不高,内部碎片较多。
备注:这里的作业,类似于“可执行程序”或进程概念。
2 . 可变分区(类似Malloc和Free:个数、大小、位置可变)
可变分区也称为动态分区,是指在作业装入内存时,从可用的内存中划出一块连续的区域分配给它,形成一个新的分区,且分区大小正好等于该作业的大小。可变分区中分区的大小和分区的个数都是可变的,而是根据作业的大小和多少动态地划分的。
这种内存管理技术是固定分区的改进,既可以获得较大的灵活性,又能提高内存的利用率。
可变分区在分配时,首先找到一个足够大的空闲分区(自由分区),即这个空闲区 的大小比作业要求的要大,系统则将这个空闲分区分成两个部分,一部分成为己分配的 分区,剩余的部分仍作为空闲区。在回收撤除作业所占领的分区时,要检查回收的分区是否与前后空闲的分区相邻接,若是则加以合并,使之成为一个连续的人空间。
在选择空闲分区时,可变分区分配策略主要采用以下儿种算法:
( 1 ) 首次适应算法(按地址排序)
从空闲区表(空闲区链)的第1个表目起查找该表,把最先能够满足要求的空闲分区分配给作业,这种方法的好处在于减少查找时间。
为适应这种算法, 空闲区表中的空闲区要按地址由低到高进行排序。
该算法的特点是,如果找出的空闲区长度恰好等于申请的长度则是最合适的:如果比申请的长度略大,则分割后剩下的空闲区就很小,这种空闲分区不但不能被再度使用,而旦还占用空闲区表的一个节点。当空闲区表中的小空闲区节点过多时,本算法的性能急剧下降。
( 2 ) 最佳适应算法(按大小,从小到大排序)
它从全部空闲区中找出能满足作业要求的、且最小的空闲区, 这种方法能使碎片尽量小。
为适应这种算法,空闲分区表中的空闲区要按大小从小到大进行排序,自表头开始查找到第一个满足要求的空闲分区分配。
最佳适应算法的特点是, 分配空间时尽量利用低地址部分的存储区域,而使高地址部分保持较大的空闲区,有利于大进程空间的装入。
( 3 ) 最坏适应算法(按大小,从大到小排序)
从所有未分配的分区中挑选最大的且大于和等于作业大小的分区分给要求的作业;
空闲区按由大到小排序,每次查找从链头开始。
最坏适应算法的特 点是,由于过多地分割大的空闲当遇到较大空间申请时,可能无法满足其中请。该 算法对中、小作业比较有利。
实践表明,在针对存储空间利用情况的三种策略中,首次适应算法可能比最佳适应算法好,而首次适应算法和最佳适应算法一定比最坏适应算法好。
4、临近适应算法(Next Fit)
算法总结
5 . 可重定位分区
可重定位分区分配是解决存储器碎片问题的简单而有效的方法。
其基本思想是在适当的时候,把零散的空白区合并为一个大的空白空间,称为拼接。
实现方式是移动某些已分配区域中的信息,使所有的分配都紧挨着存储器的一端,而空白区在另一端。
4 . 多重分区
多重分区的基本思想是为一个作业分配一个以上的分区,允许一个作业在其运行过程中动态地申请附加存储空间,该空间不必和己有的作业分区相连接。
多重分区的优点是便于使用共亨子程序或数据,其缺点是需要较多的硬件支持,因为该分区方式一定要 有动态重定位结构来支持,管理也较复杂。
5 . 存储器保护
分区方式允许多道程序在内存中同时运行,因此,必须解决存储器保护问题,防止分区越界。
常用的方法有界地址保护和设置存储键保护。
界地址保护又称为界限寄存器保护,分为界限寄存器、基址和限长寄存器两种保护 方式。
其中界限寄存器方式是指下界寄存器存放作业分区的起始地址,上界寄存器存放 下一个分区的起始地址。每次寻址和汸问时,先与这两个寄存器的内容进行比较,以实 现对分区的保护;
基址和限长寄存器方式是指基址寄存器存放作业分区的起始地址,限长寄存器存放作业的最大偏移暈(长度)。在作业运行过程中,在访问存储器时所计算出的存储地址如果超过限长,则发出越界中断信号。
存储键保护的基本思想是系统对每个作业或进程进行内存分配时,对同一作业的各页面所对应的内存块都要指定一个相同的、不与其他作业相重的键(代码),这个键保存于快速寄存器和该作业的程序状态字中。当程序要访问某一块时,将程序状态字中的键与被访问块的键进行比较,若相符,则表明允许本次访问,否则就发出越界中断,请求系统处理。为使系统能访问内存的任何块,其程序状态字的键为“0”,此时,不必进行键的比较工作。
3 . 3 . 3 段页式存储管理
分区存储管理存在产生存储碎片和空间管理较复杂的问题,其原因在于,这种管理方式要求把作业放在内存的一片连续区域中。整个程序/作业是一个整块,没有被切分成块。
为了避免这种连续性要求,可以将作业的逻辑地址空间分成若干个长度相等的区域(称为页),内存空间也划分成若千个与页长度相等的区域(称为页帧或块),程序装入时,每页对应一个页帧,这就是分页存储管理的思想。分页存储的思想就是集装箱的思想,把个大的程序块,划分成标准N个标准的长度块,每个块单独进行地址译码。
1 . 页式存储管理
在分页存储管理中,页帧可以是连续的,也可以是不连续的。系统为每道作业/可执行程序建立 一张页面映射表(称为页表),记录相应页在内存中对应的页帧号。这种管理方式消除了 可变分区中紧致存储空间所带来的开销,同时,又能实现内存信息共享和虚拟存储技术。
备注:分页存储管理中,程序也会一次性全部加载到内存中,只不过是被切分成多个页块,存放在不连续的物理地址空间中,而逻辑地址是连续的,通过页表实现连续的逻辑地址到不连续的物理地址之间的映射。
在分页存储管理中,地址结构由两部分组成,分别是页号和页内位移(页内地址)。
地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变换成内存中的物理地 址,为了实现地址变换功能,在系统中设置页表寄存器,用来存放页表的起始地址和页表的长度。
在进程未执行时,每个进程对应的页表的起始地址和长度存放在进程的P C B中,当该进程被调度时,就将它们装入页表寄存器。
在进行地址变换时,系统将页号与 页表长度进行比较,如果页号大于页表寄存器中的页表长度,则访问越界,产生越界中 断。如未出现越界,则根据页表寄存器中的页表起始地址和页号计算出该页在页表项中 的位置,得到该页的物理块号,并将此物理块号装入物理地址寄存器中。
与此同时,将 有效地址寄存器中的页内地址直接装入物理地址寄存器的块内地址字段中,这样,便完 成了从逻辑地址到物理地址的变换。 如果页表存放在内存中,则每次访问内存时,都要先访问内存中的页表,然后根据 所形成的物理地址再访问内存。
这样,C P U 保存一个数据必须访问两次内存,降低了计 算机的处理速度。
为了提高地址变换的速度,可以在地址变换机构中增设一个具有并行 査询功能的特殊高速缓冲存储器(称为联想存储器或快表),用以存放当前访问的那些页表项。如下图所示:
2 . 段式存储管理
段:就是一个大的可执行程序中用到的文件分成一个个可控的顿,每个段可以独立加载和共享。
如windows每个DLL库或Linux so库,就可以作为一个独立的段。一个可执行程序,使用多个动态链接库时,就一个按照段的方式来组织依赖的外部库。
段式存储管理按用户作业中的自然段(代码的实际长度)来划分逻辑空间,每段占用连续的地址空间, 其逻辑地址是二维的,由段号和段内地址组成。
系统为每个作业建立一张段表,记录该段在内存中的起始地址和段长,各段可以存放在内存不同的分段中,段的分配与回收与可变分区存储管理相同。
段式存储管理的地址转换采用动态重定位方式,地址转换机构 取出逻辑地址的段号和段内地址,根据段号检索段表,找到该段对应的表目,将该段的 起始地址与段内地址相加得到绝对地址。
段式存储管理也存在二次访存问题,可以通过增设快表来解决。
段式存储管理可以采用地址转换机制进行越界保护和在段表中增设一些标志位,进 行存取控制保护。由于用户对信息的共享要求是以段为单位的,因此共享易于实现,若 多个作业段表中的某一项指向内存的同一个地址,则内存中以该地址为起始地址的那一 段便被共享了。虽然段存储式管理方便用户编程,便于共享与保护,支持动态链接和动 态增长,但它对内#的管理与可变分区存储管理是类似的,也存在存储管理复杂,空间利用差的缺点。
段式存储管理和分页存储管理有许多相似之处,例如,都采用离散分配方式来提高内存的利用率,都要通过地址变换机构来实现地址变换。
但在概念上两者是完全不同的, 它们的主要区别表现在以下三个方面:
( 1 ) 分页是一个单一的线性地址空间,分段作业地址空间是二维的。
( 2 ) 页是信息的物理单位,大小固定,分页活动是用户看不见的,分页的目的是为了提高内存的利用率;
段是信息的逻辑单位,其长度不定,分段是用户可见的活动,段的目的是为了更好地满足用户的需要。
( 3 ) 分页存储管理实现单段式虚拟存储系统, 分段式存储管理实现多段式虚拟存储系统。
3 . 段页式存储管理
段页式存储管理的基本思想是将段式存储管理与分页存储管理结合起来,正好克服了各自存在的一些问题。
段页式存储管理将作业/程序分成若干段,每个段分成若千页,每段赋了一个段名,为了实现地址转换,必须为每个作业配置一张段表和若干张页表。内存的分配与回收以页为单位进行。
作业的逻辑地址是二维的,包括段号和段内地址,其中段内地址又包含页号和页内地址两部分。
段页式存储管理的地址转换的具体步骤为:
地址转换机构取出逻辑地址,并根据页 的大小将段内地址再细分为页号和页内地址。
根据段号检索段表,找到该段的页表存放地址;
根据页号査页表,取出相应的页帧号;
把页帧号和页内地址合并,得到物理地址, 执行访存操作。
由此吋知,为了获得一条指令或数据,需要三次访问内存(段表、页表、实际物理地址),这使得系统 执行指令的速度更慢。
这个问题同样可通过快表来解决,快表中存放当前使用的段号、 页号、页帧号和页内地址等表目。
段页式存储管理的保护方法与段式存储管理相同,共享则从页表幵始。
备注1:无论是页式存储,还是段式存储,都必须一次性为程序分配足够的内存空间,以容纳整个程序的地址空间。如果程序足够大,剩余的内存空间不够,则无法执行该程序。
备注2:有时候程序空间很大,程序执行时,其实是不需要一次性装载所有程序的,有些程序,大部分时间都得不到执行,甚至执行一次后,程序就不需要执行,按照段式或页式存储方式。程序还还占用内存空间,无法释放,这浪费有宝贵的内存资源!!!
3 . 3 . 4 虚拟存储管理(适合可执行文件存放在文件系统的系统)
3.3.2节 和 3.3.3节介绍的各种存储管理方式中,必须为作处分配足够的存储空间,以装入有关作业的全部信息,作业的大小不能超出内存的可用空间,否则,这个作业是无法运行的。
但当有关作业的全部信息都装入内存后,作业执行时实际上不是同时使用 全部信息的,有些部分运行一遍便不再使用,甚至有些部分在作业执行的整个过程中都 +会 被 使 用 (例如,错误处理部分等)。这种情况的出现,是对宝贵的内存资源的一种浪 费,大大降低了内存利用率。
虚拟存储管理的提出就是为了解决这一问题,应用程序在运行之前并不必全部装入内存,仅需将当前运行到的那部分程序和数据装入内存便可启动程序的运行,其余部分仍驻留在外存(硬盘)上。
当程序要执行的指令或访问的数据不在内存时,再由操作系统通过请求调入功能将它们调入内存,以使程序能继续执行。如果此时内存已满,则还需通过置换功 能,将内存中暂时不用的程序或数据调至外存上,腾出足够的内存空间后,再将要访问 的程序或数据调入内存,使程序继续执行。这样,便可使一个大的用户程序能在较小的 内存空间中运行,也可在内存中同时装入更多的进程使它们并发执行。从用户的角度看, 该系统具有的内存容量比实际的内存容量大得多。将这种具有请求调入功能和置换功能, 能从逻辑上对内存容量加以扩充的存储器系统称为虚拟存储系统。
1 . 局部性原理
虚拟存储管理能够在作业信息不全部装入内存的情况下保证作业正确运行,是利用了程序执行时的局部性原理。局部性原理是指程序在执行时呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分。相应地,它所访问的存储空间也仅局限于某个区域。程序局部性包括时间局部性和空间局部性,时间局部性是指程序中的某条指令一旦执行,不久以后该指令可能再次执行。产生时间局部性的典型原因是由于程序中存在着大量的循环操作;空间局部性是指一旦程序访问了某个存储单元,不久以后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能集中在一定的范围内,其典型情况是程序顺序执行。
2 . 工作集
在虚拟存储管理中,可能会出现这种情况,即对于刚被替换出去的页,立即又要被访问,需要将它调入,因无空闲内存又要替换另一页,而后者是即将被访问的页,于是造成了系统需花费大量的时间忙于进行这种频繁的页面交换,致使系统的实际效率很低,严重时导致系统瘫痪,这种现象称为抖动现象。防止抖动现象有多种办法,例如,采取局部替换策略、引入工作集算法和挂起若干进程等。工作集是指在某段时间间隔内,进程实际要访问的页面的集合。引入虚 k 内存后,程序只需有少量的内存就可运行,但为了使程序有效地运行,较少产生缺页,必须使程序的工作集全部在内存中。
3 . 页面置换算法
当内存中没有空闲页面(假设页表的最大内存空间或页面的条目有最大数限制),而又有新的程序和数据需要从外存中装入内存运行时,就需要从内存中选出一个或多个页面淘汰出去,以便新的程序和数据装入运行,良好的页面置换算法应该淘汰那些被访问概率最低的页,并将它们移出内存。
(1) 随机淘汰算法。
无法确定哪些页被访问的概率较低时,随机地选择某个页面,并将其换出。
(2) 轮转算法。
按照内存页面的编号,循环地换出内存中一个可以被换出的页,无论该页是刚换进来的还是已驻留内存很长时间的。
(3) 先进先出算法 (First In First Out , F I F O )。
F I F O 算法总是选择在内存驻留时间最长的一页将其淘汰。实 现 F I F O 算法需要把各个己分配页面按页面分配时间顺序链接起来,组成 F I F O 队列,并设置一置换指针,指向 F I F O 队列的队首页面。 F I F O 算法忽略了一种现象的存在,那就是在内存中停留时间最长的页往往也是经常要访问的页。将这些页淘汰,很可能刚置换出去,又请求调用该页,致使缺页中断太频繁,严重降低内存的利用率。F I F O 的另一个缺点是它可能会产生一种异常现象 。一 般来说,对于任一作业或进程,如果给它分配的内存页面数越接近于它所要求的页面数,则发生缺页的次数会越少。但使用 F I F O 算法时,有时会出现分配的页面数增多,缺页次数反而增加的现象,称为 belady现象。
(4) M 近最久未使用算法 (Least Recently Used , L R U )。
为需要淘汰某一页时,选择离3 前时间最近的一段时间内最久没有使用过的页先淘汰。
例如,考虑一个仅460个