导图社区 《操作系统》第三章-内存管理
操作系统内存管理,管理的概念,连续分配管理方式,基本分页储存管理,虚拟内存管理,包括页宽分配,请求分页管理方式等
编辑于2022-07-15 17:07:10内存管理
(1) 内存管理概念
内存管理的基本原理和要求
功能
内存空间的分配与回收
地址转换
内存空间的扩充
内存共享
存储保护
基本原理
程序的链接与装入
编译:由编译程序将用户源代码编译成若干目标模块
链接:由链接程序将编译后形成的一组目标模块及它们所需的库函数链接在一起,形成一个完成的装入模块
静态链接
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。
将几个目标模块装配成一个装入模块时,需要解决两个问题
①修改相对地址,编译后的所有目标模块都是从0开始的相对地址(每个模块都相对独立),当链接成一个装入模块时要修改相对地址,使其形成一个完整的逻辑地址空间
②变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址。
装入时动态链接
将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。其优点是便于修改和更新,便于实现对目标模块的共享。
运行时动态链接
对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。其优点是能加快程序的装入过程,还可节省大量的内存空间。
装入:由装入程序将装入模块装入内存运行
绝对装入(静态装入、编程阶段)
绝对装入方式只适用于单道程序环境。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,因此不需对程序和数据的地址进行修改。
另外,程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址。
可重定位装入(静态重定位、装入阶段)
在多道程序环境下,多个目标模块的起始地址通常都从0开始,程序中的其他地址都是相对于起始地址的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址变换通常是在进程装入时一次完成的,故称为静态重定位,如图3.2(a)所示。
当一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则无法装入。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间。
动态重定位(动态运行时装入)
程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持,如图3.2(b)所示。
优点:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享。
逻辑地址与物理地址
逻辑地址(相对地址)
编译后,每个目标模块都从0号单元开始编址,这称为该目标模块的相对地址(或逻辑地址)。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间(或虚拟地址空间),对于32位系统,逻辑地址空间的范围为0~232-1。进程在运行时,看到和使用的地址都是逻辑地址。用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是完全透明的。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。
物理地址
物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址在主存中存取。
地址重定位
当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址的过程
操作系统通过内存管理部件(MMU)将进程使用的逻辑地址转换为物理地址。进程使用虚拟内存空间中的地址,操作系统在相关硬件的协助下,将它“转换”成真正的物理地址。逻辑地址通过页表映射到物理内存,页表由操作系统维护并被处理器引用。
进程的内存映像
代码段
程序的二进制代码,代码只读,且可以被多个进程共享
数据段
程序运行时加工处理的对象,包括全局变量和静态变量
进程控制块(PCB)
存放在系统区,操作系统通过PCB来控制和管理进程
堆
存放动态分配的变量;通过调用malloc函数动态地向高地址分配空间
栈
实现函数调用,从用户空间的最大地址往低地址方向增长
内存保护
定义:确保每个进程都有一个单独的内存空间;保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程影响
需要操作系统和硬件机构合作完成
方法
1 在CPU 中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU 要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
2 采用重定位寄存器(又称基地址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元,如图3.4所示。
加载重定位寄存器和界地址寄存器时必须使用特权指令,只有操作系统内核才可以加载这两个存储器。这种方案允许操作系统内核修改这两个寄存器的值,而不允许用户程序修改。
内存共享
并不是所有的进程内存空间都适合共享,只有那些只读的区域才可以共享。可重入代码(纯代码)是一种允许多个进程同时访问但不允许被任何进程修改的代吗。但实际执行时,也可以为每个进程配以局部数据区,把在执行中可能改变的部分复制到该数据区,这样时只需对该私有数据区中的内存进行修改,并不去改变共享的代码。
内存的分配与回收
单一连续分配
固定分区分配
动态分区分配
连续分配方式
离散分配方式(页式存储管理)
覆盖与交换*
覆盖
基本思想
由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
特点
打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,此外,内存中能够更新的地方只有覆盖区的段,不在覆盖区中的段会常驻内存。覆盖技术对用户和程序员不透明。
可用于单一连续存储管理或固定分区分配的存储管理
交换
基本思想
把处于等待状态(或在CPU调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这一过程又称换出;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称换入。第2章介绍的中级调度采用的就是交换技术。
覆盖用于同一程序或进程;交换用于不同进程(或作业)
两者本质上都是以时间换空间的技术,以提高换入、换出速度为主要目标
连续分配管理方式
定义:为一个用户程序分配一个连续的内存空间
单一连续分配
内存
系统区:仅供操作系统使用,通常在低地址部分
用户区:仅有一道用户程序,即整个内存的用户空间由该程序独占
优点
简单、无外部碎片,无须进行内存保护(因为内存中只有一道程序)
缺点
只能用于单用户、单任务的操作系统,有内部碎片,存储器利用率极低
固定分区分配
定义:最简单的一-种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。
分区方法
分区大小相等。程序太小会造成浪费,程序太大又无法装入,缺乏灵活性。
分区大小不等。划分为多个较小的分区、适量的中等分区和少量大分区。
为便于内存分配,通常将分区按大小排队,并为之建立一张分区说明表,其中各表项包括每个分区的始址、大小及状态,如图3.5所示。当有用户程序要装入时,便检索该表,以找到合适的分区给予分配并将其状态置为“已分配";未找到合适分区时,则拒绝为该程序分配内存。
缺点
程序可能太大而放不进任何一个分区,这时就需要采用覆盖技术来使用内存空间
当程序小于固定分区大小时,也要占用一个完整的内存分区,这样分区内部就存在空间浪费,这种现象称为内部碎片
不能实现多进程共享一个主存区,所以存储空间利用率低
动态分区分配(可变分区分配)
定义:在进程装入内存时,根据进程的实际需要,动态地为之分配内存,并使分区的大小正好适合进程的需求。因此,系统中分区的大小和数目是可变的
存在外碎片,可通过紧凑技术解决
分配策略
首次适应(First Fit)算法
空闲分区以地址递增的次序链接。分配内存时,从链首开始顺序查找,找到大小能满足要求的第一个空闲分区分配给作业
最简单,但会使内存的低地址部分出现很多小的空闲分区
邻近适应(Next Fit)算法
又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找
最佳适应(Best Fit)算法
 
空闲分区按容量递增的次序形成空闲分区链,找到第一个能满足要求且最小的空闲分区分配给作业,避免“大材小用”
性能很差,会产生最多的外碎片
最坏适应(Worst Fit)算法
空闲分区以容量递减的次序链接,找到第一个能满足要求的,即最大的分区,从中分割一部分存储空间给作业
性能很差
基本分页存储管理
基本概念
分页
把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位。每个进程也以块(页)为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间
分页管理不会产生外碎片,但会产生非常小的页内碎片
从计算机的角度设计,目的是提高内存的利用率,提升计算机性能,分页通过硬件机制实现,对用户完全透明
页面和页面大小
进程中的块称为页或页面(Page),内存中的块称为页框或页帧(Page Frame)。外存也以同样的单位进行划分,直接称为块或盘块(Block)。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。 为方便地址转换,页面大小应是2的整数幂。
页面太小会使进程的页面数过多,这样页表就会过长,占用大量内存,而且也会增加硬件地址转换的开销,降低页面换入/换出的效率
页面过大又会使页内碎片增多,降低内存的利用率
地址结构
给出逻辑地址LA,求具体页号的方法: (((unsigned int)(LA))>>12) & 0x3FF >>12表示右偏移12位,跳过页内偏移量 &0x3FF表示取最低的10位二进制数
页号P
最多允许2^20页
页内偏移量W
每页大小4KB
页表
功能:实现页号到物理块号的地址映射
页表项由页号和块号组成;块号和地址结构的页内偏移量W共同组成物理地址
基本地址变换机构
功能:将逻辑地址转换为内存中的物理地址,借助页表实现
页表寄存器(PTR):存放页表在内存的起始地址F和页表长度M
进程被调度执行时,PCB内页表的始址和页表长度被装入寄存器(每个进程有一组F、M,但同一时刻寄存器中仅存储一组)
转换过程(页面大小为L,逻辑地址为A,物理地址为E)
1 计算页号P(P=A/L)和页内偏移量W(W=A%L)
2 比较页号P和页表长度M,若P≥M,则发生越界中断
3 页号P对应的页表项地址=页表始址F+页号P×页表项长度,取出该页表项内容b,即为物理块号b
注意区分页表长度和页表项长度。页表长度是指一共有多少页,页表项长度是指页地址占多大的存储空间
4 计算E=b×L+W,用得到的物理地址E去访问内存
缺点
1 每次访存操作都需要进行逻辑地址到物理地址的转换,地址转换过程必须足够快,否则访存速度会降低(需要两次访存,一次访问页表,一次访问实际物理地址)
2 每个进程引入页表,用于存储映射机制,页表不能太大,否则内存利用率会降低
具有快表的地址变换机构
引入具有并行查找能力的高速缓冲存储器——快表,又称相联存储器(TLB),用来存放当前访问的若干页表项,以加速地址变换的过程;相应的,主存中的页表称为慢表
地址变换过程
CPU给出逻辑地址后,由硬件进行地址转换,将页号送入高速缓存寄存器,并将此页号与快表中的所有页号进行比较。
若找到匹配的页号,说明所要访问的页表项在快表中,则直接从中取出该页对应的页框号,与页内偏移量拼接形成物理地址。这样,存取数据仅一次访存便可实现。
若未找到匹配的页号,则需要访问主存中的页表,读出页表项后,应同时将其存入快表,以便后面可能的再次访问。若快表已满,则须按特定的算法淘汰一个旧页表项。
基于局部性原理
两级页表
 
目的:建立索引,以便不用浪费主存空间去存储无用的页表项,也不用盲目地顺序式查找页表项
CPU页表寄存器中存储一级页表的起始物理地址
假定32位逻辑地址空间、页面大小4KB、页表项大小4B,以字节为编制单位,顶级页表最多只有1个页表,故可以容纳4KB/4B=1K个页表项,占用地址位数为log1K=10位,页内偏移地址log4K=12位
基本分段存储管理
目的:从用户和程序员角度出发,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需求
分段
段式管理方式按照用户进程中的自然段划分逻辑空间,段内要求连续,段间不要求连续
在页式系统中,逻辑地址的页号和页内偏移量对用户是透明的,但在段式系统中,段号和段内偏移量必须由用户显式提供,在高级程序设计语言中,这个工作由编译程序完成。
存在外碎片
段表
每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度
配置段表后,执行中的进程可通过查找段表,找到每段所对应的内存区;即段表用于实现从逻辑段到物理内存去的映射
地址变换机构
与页式管理不同,段式管理不能通过给出一个整数便确定对应的物理地址,因为每段的长度是不固定的,无法通过整数除法得出段号,无法通过求余得出段内偏移,所以段号和段内偏移一定要显式给出(段号,段内偏移),因此分段管理的地址空间是二维的。
在系统中设置段表寄存器,用于存放段表始址F和段表长度M
地址转换过程
1 从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W。(注意,在地址变换的题目中,要注意逻辑地址是用二进制数还是用十进制数给出的)
2 比较段号S和段表长度M,若S>M,则产生越界中断,否则继续执行。
3 段表中段号S对应的段表项地址=段表始址F+段号S×段表项长度,取出该段表项的 前几位得到段长C。若段内偏移量≥C,则产生越界中断,否则继续执行。(段表项实际上只有两部分,前几位是段长,后几位是始址)
4 取出段表项中该段的始址b,计算E=b+W,用得到的物理地址E去访问内存。
段的共享与保护
存取控制保护
在分段系统中,段的共享是通过两个作业的段表中相应表项指向被共享的段的同一个物理副本来实现的。当一个作业正从共享段中读取数据时,必须防止另一个作业修改此共享段中的数据。不能修改的代码称为纯代码或可重入代码(它不属于临界资源),这样的代码和不能修改的数据可以共享,而可修改的代码和数据不能共享。
可重入程序主要是通过共享来使用同一块存储空间的,或通过动态链接的方式将所需的程序段映射到相关进程中去,其最大的优点是减少了对程序段的调入/调出,因此减少了对换数量。
地址越界保护
将段表寄存器中的段表长度与逻辑地址中的段号比较,若段号大于段表长度,则产生越界中断;再将段表项中的段长和逻辑地址中的段内偏移进行比较,若段内偏移大于段长,也会产生越界中断。分页管理只需要判断页号是否越界,页内偏移是不可能越界的。
段页式管理
分页存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享和保护。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。
在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位,如图3.17所示。
在段页式系统中,作业的逻辑地址分为三部分:段号、页号和页内偏移量,如图3.18所示。
每个进程有且仅有一张段表,每个分段有一张页表
段表表项:段号、页表长度、页表始址
页表表项:页号、块号
段表寄存器:作业的段表始址和段表长度
地址变换
首先通过段表查到页表始址,然后通过页表找到页帧号,最后形成物理地址
进行一次访问实际需要三次访问主存(同样可以通过使用快表来加快查找速度)
内存管理方式的一些总结
(1) 采用分页或分段管理后,由于系统提供给用户的物理地址空间为总大小减去页表或段表的长度,而页表和段表的长度不能确定,因此提供给用户的物理地址空间大小是不能确定的
(2) 碎片
分区固定的往往会产生内碎片,如固定分区分配、分页存储、段页式存储
分区不固定(动态划分区大小)的往往会产生外碎片,如动态分区分配、分段存储
(3) 透明
内存分页管理是在硬件和操作系统层面实现的,对用户、编译系统、连接装配程序等上层是不可见的。
程序如何分段是由用户编程决定的
(4) 装入、重定位和内存管理
装入是指由装入程序将装入模块装入内存运行,用户程序编译为目标模块后,会对每个模块内部(程序数据等)进行编址,此时编好的地址叫做逻辑地址或相对地址(绝对装入方式除外),都是相对于本模块的起始地址(一般从0开始)计算的。进行链接后某些模块的相对地址会发生变化,地址都变为相对于装入模块的起始地址进行计算。
静态装入
采用绝对地址,将装入模块直接装入内存即可,无需进行地址变换
可重定位(静态重定位)
装入时把逻辑地址转换为物理地址,装入后不可变
可用于固定分区方式的存储管理方式
动态重定位
执行时再决定装入的地址
可用于可变分区、页式和段式
(5) 页式和段式的维度
对于页式管理,给出地址a,根据页面大小就可以算出页号(P=A/L)和页内偏移地址(W=A%L),所以是一维线性。段式管理则不同,必须给出段号,根据段表找出此段的起始地址,再根据段内偏移地址进行定位,所以是二维的。
(2) 虚拟内存管理
基本概念
传统存储管理方式的特征
一次性:作业必须一次性全部装入内存后才能开始运行
驻留性:作业被装入内存后,就一直驻留在内存中
局部性原理
时间局部性
程序中的某条指令一旦执行,不久后该指令可能再次执行:某数据被访问过,不久后该数据可能再次被访问。产生的原因是程序中存在着大量的循环操作。
空间局部性
一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
虚拟存储器的定义和特征
定义
基于局部性原理,在程序装入时,仅须将程序当前要运行的少数页面或段先装入内存,而将其余部分暂留在外存,便可启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。 另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存容量大得多的存储器,称为虚拟存储器。
特征
多次性
将作业分成多次调入内存运行
对换性
作业运行时无需常驻内存,可将暂时不使用的程序和数据从内存调至外存的对换区(换出),需要时再换进
虚拟性
从逻辑上扩充内存的容量
虚拟存储器的理论最大容量由计算机的地址结构决定,与主存容量+外存容量没有必然联系;若计算机系统的地址寄存器为32位,则虚存的最大容量为2^32B(字节编址) 不过,虚存的实际容量≤内存容量+外存容量
离散性
内存分配时采用离散分配的方式
虚拟内存技术的实现
虚拟内存技术允许将一个作业分多次调入内存。采用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。
请求分页存储管理
请求分段存储管理
请求段页式存储管理
硬件机制
一定容量的内存和外存
页表机制(或段表机制)作为主要的数据结构
中断机构,当用户程序要访问的部分尚未调入内存后,则产生中断
地址变换机构,逻辑地址到物理地址的变化
请求分页管理方式
请求分页存储管理方式和基本分页管理方式的区别是,前者采用虚拟技术,开始运行时,不必将作业全部一次性装入内存,而后者不是
建立在基本分页系统基础上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能
页表机制
状态位P:用于指示该页是否已调入内存,供程序访问时参考
也称合法位,决定了是否会发生页面故障
访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法换出页面时参考
修改位M:标识该页在调入内存后是否被修改过,以确定页面置换时是否写回外存
外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页参考
缺页中断机构
缺页中断作为中断,同样要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序、恢复CPU环境等几个步骤。但与一般的中断相比,它有以下两个明显的区别: 在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部异常。 一条指令在执行期间,可能产生多次缺页中断。
在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存,并将缺页的进程阻塞(调页完成唤醒)
若内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中的相应页表项。
若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。
地址变换机构
页框分配
驻留集大小
定义:给一个进程分配的物理页框的集合
分配给一个进程的页框越少,驻留在主存中的进程就越多,从而可提高CPU的利用率
若一个进程在主存中的页面过少,则尽管有局部性原理,缺页率仍相对较高
若分配的页框过多,则由于局部性原理,对该进程的缺页率没有太明显的影响
内存分配策略
固定分配局部置换
固定分配
每个进程的驻留集(物理页框)大小固定不变
局部置换
缺页时只能选择该进程的页面换出
缺点:难以确定为每个进程分配的物理块数目;太少会频繁出现缺页中断,太多会降低CPU利用率
可变分配全局置换
可变分配
进程的驻留集大小可变
全局置换
缺页时,系统从空闲物理块队列中取出一块分配给该进程,并将所缺页调入
可变分配局部置换
物理块调入算法
平均分配算法
按比例分配算法
优先权分配算法
调入页面的时机
预调页策略
根据局部性原理,将可能会被访问的页面预先调入内存
请求调页策略
发生缺页时才请求调页
主要用于进程的首次调入
缺点:每次仅调入一页,增加了磁盘I/O开销
从何处调入页面
外存
文件区
离散分配,用于存放文件
对换区
连续分配,用于存放对换页面,I/O速度更快
发生缺页时
若系统拥有足够的对换区空间
进程运行前,将其相关文件从文件区复制到对换区,以提高调页速度
若系统缺少足够的对换区空间
将可能会被修改的文件调入对换区
不会被修改的文件将直接从文件区调入(这些文件无需换出)
UNIX方式
未运行过的页面都从文件区调入,换出的页面存放在对换区
如何调入页面
当进程所访问的页面不在内存中时(存在位为0),便向CPU发出缺页中断,中断响应后便转入缺页中断处理程序。该程序通过查找页表得到该页的物理块,此时如果内存未满,则启动磁盘I/O,将所缺页调入内存,并修改页表。如果内存已满,则先按某种置换算法从内存中选出一页准备换出;如果该页未被修改过(修改位为0),则无须将该页写回磁盘;但是,如果该页已被修改(修改位为1),则必须将该页写回磁盘,然后将所缺页调入内存,并修改页表中的相应表项,置其存在位为1。调入完成后,进程就可利用修改后的页表形成所要访问数据的内存地址。
页面置换算法
最佳置换算法(OPT)

淘汰“以后不再使用/最长时间内不再被访问”的页面
目前无法实现
先进先出页面置换算法(FIFO)

淘汰“最早进入内存”的页面
Belady异常:分配的物理块数增大而页故障数反而增加的现象
只有队列类算法可能出现
最近最久未使用置换算法(LRU)
淘汰“最近最长时间未访问过”的页面
基于堆栈实现
时钟置换算法(COLCK)
简单的CLOCK置换算法(最近未用NRU算法)

为每帧设置一个访问为,首次装入或访问时置其为1
将内存中的所有页面视为循环队列,并设置替换指针
若该页的访问位为0,将其换出
若访问位为1,则置其为0,指针移动至下一位
改进型CLOCK置换算法
选择换出页面时,同时考虑访问位A和修改位M
执行过程
(1) 从指针的当前位置开始,扫描循环队列,寻找A=0且M=0的1类页面,将遇到的第一个1类页面作为选中的淘汰页。在第一次扫描期间不改变访问位A。
(2) 若第1)步失败,则进行第二轮扫描,寻找A=0且M=1的2类页面。将遇到的第一个2类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置为0。
(3) 若第2)步也失败,则将指针返回到开始的位置,并将所有帧的访问位置为0。重复第1)步,并且若有必要,重复第2)步,此时一定能找到被淘汰的页。
抖动和工作集
抖动(颠簸)
抖动发生的主要原因是不合理的页面置换算法
定义:刚刚换出的页面马上又要换入主存,刚刚换入的页面马上又要换出主存
发生原因:每个进程的物理块太少,不能满足进程正常运行的基本要求,致使其频繁发生缺页
工作集
定义:在某段时间间隔呢,进程要访问的页面集合,由时间t和工作及窗口大小Δ决定
t1-工作集:{2,3,5}
t2-工作集:{1,2,3,4}
原理
操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。落在工作集内的页面需要调入驻留集中,而落在工作集外的页面可从驻留集中换出。若还有空闲物理块,则可再调一个进程到内存。若所有进程的工作集之和超过了可用物理块总数,则操作系统会暂停一个进程,将其页面调出并将物理块分配给其他进程,防止出现抖动现象。
内存映射文件
将磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关系,便可直接访问被映射文件,而不必执行文件I/O操作,也无需对文件内容进行缓存
共享内存
虚拟存储器性能影响因素
地址翻译