408 操作系统 知识点记忆(3)内存管理
408 操作系统 知识点记忆(3)内存管理
前言
本文基于王道考研《操作系统考研复习指导》与汤小丹《计算机操作系统》(第4版)教材内容,结合 408 考研大纲,系统梳理内存管理的核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。
本章解决“多个程序如何共享有限内存”的问题,主线是从连续分配走向离散分配,最终用虚拟内存把“有限”伪装成“无限”;请求调页与页面置换是考点最密集的区域。
核心知识记忆点+理解性说明
第三章 内存管理
1. 内存管理基础
A. 内存管理概念:逻辑地址与物理地址空间,地址变换,内存共享,内存保护,内存分配与回收
内存管理的主要功能:
内存空间的分配与回收。由操作系统负责内存空间的分配和管理,记录内存的空闲空间、内存的分配情况,并回收已结束进程所占用的内存空间。
地址转换。程序的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,将逻辑地址转换成相应的物理地址。
内存空间的扩充。利用虚拟存储技术从逻辑上扩充内存。
内存共享。指允许多个进程访问内存的同一部分。例如,多个合作进程可能需要访问同一块数据,因此必须支持对内存共享区域进行受控访问。
存储保护。保证各个进程在各自的存储空间内运行,互不干扰。
逻辑地址与物理地址
编译后,每个目标模块都从0号单元开始编址,该目标模块的相对地址(或逻辑地址)
当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间(或虚拟地址空间),
不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。

物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。
操作系统通过内存管理部件(MMU)将进程使用的逻辑地址转换为物理地址。进程使用虚拟内存空间中的地址,操作系统在相关硬件的协助下,将它“转换”成真正的物理地址。逻辑地址通过页表映射到物理内存,页表由操作系统维护并被处理器引用。
绝对装入(逻辑与实际相同)
可重定位装入/静态重定位
经过编译、链接后的装入模块的始址(起始地址)通常都是从0开始的,程序中使用的指令和数据的地址都是相对于始址而言的逻辑地址。可根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中的相对地址的修改过程称为重定位,地址转换通常是在进程装入时一次完成的。
动态运行时装入/动态重定位
装入程序将装入模块装入内存后,并不会立即将装入模块中的相对地址转换为绝对地址,而是将这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器(存放装入模块的起始位置)的支持。

对目标模块进行链接时,根据链接的时间不同,分为以下三种链接方式。
静态链接 在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装入模块,以后不再拆开。
装入时动态链接 将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。其优点是便于修改和更新,便于实现对目标模块的共享。
运行时动态链接 在程序执行中需要某目标模块时,才对它进行链接。凡在程序执行中未用到的目标模块,都不会被调入内存和链接到装入模块上。

进程的内存映像 程序调入内存运行时
代码段:即程序的二进制代码,代码段是只读的,可以被多个进程共享。数据段:即程序运行时加工处理的对象,包括全局变量和静态变量。
进程控制块(PCB):存放在系统区。操作系统通过PCB来控制和管理进程。堆:用来存放动态分配的变量。通过调用malloc函数动态地向高地址分配空间。栈:用来实现函数调用。从用户空间的最大地址往低地址方向增长。
内存保护
- 在CPU中设置一对上、下限寄存器,存放用户进程在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
- 采用重定位寄存器(也称基地址寄存器)和界地址寄存器(也称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址,界地址寄存器中存放的是进程的最大逻辑地址。内存管理部件将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
重定位寄存器是用来“加”的,逻辑地址加上重定位寄存器中的值就能得到物理地址;界地址寄存器是用来“比”的,通过比较界地址寄存器中的值与逻辑地址的值来判断是否越界。
内存共享
只读区域可共享 可重入代码/纯代码 允许多个进程同时访问但不允许被任何进程修改的代码。
但在实际执行时,也可以为每个进程配以局部数据区,将在执行中可能改变的部分复制到该数据区,这样,程序在执行时只需对该私有数据区中的内存进行修改,并不去改变共享的代码。
B. 连续分配管理方式
内存分配与回收
连续分配管理方式
单一连续分配 内存划分 系统区(低地址)+用户区(用户程序独占)
固定分区分配 存在内部碎片 分区大小相等 ;分区大小不等 多个较小分区,适量中等分区,少量大量分区
分配与回归建立一张分区使用表 分区号 大小 起址 状态
动态分区分配/可变分区分配 是指在进程装入内存时,根据进程的实际需要,动态地为之分配内存,并使分区的大小正好适合进程的需要。因此,系统中分区的大小和数量是可变的。
外部碎片 紧凑技术克服 需要动态重定位寄存器
设置一张空闲分区链表
基于顺序搜索的分配算法
首次适应算法
邻近适应算法/循环首次适应算法
最佳适应法 空闲分区按容量递增次序排列,依次搜索空闲分区链上的空闲分区最坏适应法 空闲分区按容量递减次序排列
基于索引搜索的分配算法 大、中型系统
快速适应法
- 首先根据进程的长度,在索引表中找到能容纳它的最小空闲分区链表;
- 然后从链表中取下第一块进行分配。
伙伴系统 规定所有分区的大小均为2的k次幂(k为正整数)。当需要为进程分配大小为n的分区时 ( 2 k − 1 < n ≤ 2 k ) (2^{k-1}<n \le 2^{k}) (2k−1<n≤2k),在大小为 2 k 2^{k} 2k 的空闲分区链中查找。若找到,则将该空闲分区分配给进程。否则,表示大小为 2 k 2^{k} 2k 的空闲分区已耗尽,需要在大小为 2 k + 1 2^{k+1} 2k+1 的空闲分区链中继续查找。若存在大小为 2 k + 1 2^{k+1} 2k+1 的空闲分区,则将其等分为两个分区,这两个分区称为一对伙伴,其中一个用于分配,而将另一个加入大小为 2 k 2^{k} 2k 的空闲分区链。若不存在,则继续查找,直至找到为止。回收时,需要要将相邻的空闲伙伴分区合并成更大的分区。哈希算法 根据空闲分区链表的分布规律,建立哈希函数,构建一张以空闲分区大小为关键字的哈希表,每个表项记录一个对应空闲分区链的头指针。分配时,根据所需分区大小,通过哈希函数计算得到哈希表中的位置,从中得到相应的空闲分区链表。
覆盖技术 程序分为多个段
内存分为一个“固定区”和若干个“覆盖区”,需要常驻内存的段放在“固定区”,调入后就不再调出。不常用的段放在“覆盖区”,需要用到时调入内存,用不到时调出内存
中级调度(内存调度) 外存——>内存对换区 连续分配 主要追求换入换出速度文件区 离散分配
外存
C. 页式管理
分页:将内存空间分为若干固定大小(如4KB)的分区,称为页框、页帧或物理块。进程的逻辑地址空间也分为与块大小相等的若干区域,称为页或页面。操作系统以页框为单位为各个进程分配内存空间。
分页管理不产生外部碎片,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所以尽管会产生内部碎片,但这种碎片相对进程来说也是很小的,每个进程平均只产生半个块大小的内部碎片(也称页内碎片)。
进程的逻辑地址空间中的每个页面有一个编号,称为页号,从0开始;内存空间中的每个页框也有一个编号,称为页框号(或物理块号),也从0开始。进程在执行时需要申请内存空间,即要为每个页面分配内存中的可用页框,这就产生了页号和页框号的一一对应。为了便于找到进程的每个页面在内存中存放的位置,系统为每个进程建立一张页面映射表,简称页表。进程的每个页面对应一个页表项,每个页表项由页号和块号组成,它记录了页面在内存中对应的物理块号。

- 根据逻辑地址计算出页号P=AIL、页内偏移量 W = A % L W=A\%L W=A%L。2. 判断页号是否越界,若页号P ≥ 页表长度M,则产生越界中断,否则继续执行。
- 在页表中查询页号对应的页表项,确定页面存放的物理块号。页号P对应的页表项地址=页表始址F+页号Px页表项长度,取出该页表项内容b,即为物理块号。
- 计算物理地址E=bL+W,用物理地址E去访存。注意,物理地址=页面在内存中的始址+页内偏移量,页面在内存中的始址=块号×块大小(页面大小)。
以上过程硬件自动完成
两级页表 外层页表(页目录) 为离散分配的页表再建立一张页表一级页号或页目录号 二级页号或页号 页内偏移
外层页表寄存器(页目录基址寄存器)
D. 段式管理
分段:地址段内要求连续,段间不要求连续,进程的地址空间是二维的
段号 段内偏移量
页式系统逻辑地址页号和页内偏移量对用户透明,
分段系统 必须由用户显式提供
每个进程都有一张逻辑空间与内存空间映射的段表 编译程序完成
段表 段号 段长 本段在主存的始址
- 从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W。
- 判断段号是否越界,若段号S≥段表长度M,则产生越界中断,否则继续执行。
- 在段表中查询段号对应的段表项,段号S对应的段表项地址=段表始址F+段号Sx段表项长度。取出段表项中该段的段长C,若 W ≥ C W \ge C W≥C,则产生越界中断,否则继续执行。
- 取出段表项中该段的始址b,计算物理地址 E = b + W E=b+W E=b+W,用物理地址E去访存。

分页和分段对比
- 页是信息的物理单位,分页的主要目的是提高内存利用率,分页完全是系统的行为,对用户是不可见的。段是信息的逻辑单位,分段的主要目的是更好地满足用户需求,用户按照逻辑关系将程序划分为若干段,分段对用户是可见的。
- 页的大小固定且由系统决定。段的长度不固定,具体取决于用户所编写的程序。
- 分页管理的地址空间是一维的。段式管理不能通过给出一个整数便确定对应的物理地址,因为每段的长度是不固定的,无法通过除法得出段号,无法通过求余得出段内偏移,所以一定要显式给出段号和段内偏移,因此分段管理的地址空间是二维的。
为了实现段共享,在系统中配置一张共享段表,所有共享的段都在共享段表中占一个表项。表项中记录了共享段的段号、段长、内存始址、状态(存在)位、外存始址和共享进程计数count 等信息。共享进程计数count记录有多少进程正在共享该段,仅当所有共享该段的进程都不再需要它时,此时其
c
o
u
n
t
=
0
count=0
count=0,才回收该段所占的内存区。对于一个共享段,在不同的进程中可以具有不同的段号,每个进程用自己进程的段号去访问该共享段0。
不能被任何进程修改的代码称为可重入代码或纯代码,它是一种允许多个进程同时访问的代码。为了防止程序在执行时修改共享代码,在每个进程中都必须配以局部数据区,将在执行过程中可能改变的部分复制到数据区,这样,进程就可对该数据区中的内容进行修改。与分页管理类似,分段管理的保护方法主要有两种:一种是存取控制保护,另一种是地址越界保护。地址越界保护将段表寄存器中的段表长度与逻辑地址中的段号比较,若段号大于段表长度,则产生越界中断;再将段表项中的段长和逻辑地址中的段内偏移进行比较,若段内偏移大于段长,也会产生越界中断。分页管理只需要判断页号是否越界,页内偏移是不可能越界的。
E. 段页式管理

在段页式系统中,进程的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将各段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的物理块,对内存的分配以物理块为单位,
段号 页号 页内偏移量
为了实现地址变换,系统为每个进程建立一张段表,每个段对应一个段表项,每个段表项至少包括段号(隐含)、页表长度和页表始址;每个段有一张页表,每个页表项至少包括页号(隐含)和块号。此外,系统中还应有一个段表寄存器,指出进程的段表始址和段表长度(段表寄存器和页表寄存器的作用都有两个,一是在段表或页表中寻址,二是判断是否越界)。
段号的位数决定了每个进程最多可以分几个段页号位数决定了每个段最大有多少页
页内偏移量决定了页面大小,内存块大小一个进程对应一个段表,对应多个页表
2. 虚拟内存管理
A. 虚拟内存基本概念
传统存储管理方式特征:
一次性。作业必须一次性全部装入内存后,才能开始运行。
驻留性。作业被装入内存后,就一直驻留在内存中,其任何部分都不会被换出,直至作业运行结束。
快表 页高速缓存 虚拟内存技术 高速缓存技术 时间局部性、空间局部性
虚拟内存技术实际上建立了“内存-外存”的两级存储器结构,利用局部性原理实现高速缓存。
请求调页(调段):当所访问信息不在主存,操作系统从外存调入内存
页面置换(段置换):内存空间不足,将内存中暂时用不到的信息换出到外存
虚拟存储器特征:多次性 对换性 虚拟性(最重要的目标)
虚拟内存的实现:请求分页存储管理、请求分段存储管理、请求段页式存储管理硬件支持:一定容量内存-外存;页表机制(段表);中断机构;地址变换
B. 请求页式管理
请求分页系统中的页表项:页号 物理块号 状态位P 访问字段A 修改位M 外存地址(通常是物理块号)
缺页中断与一般中断区别:
在指令执行期间而非一条指令执行完后产生和处理中断,属于内部异常。一条指令在执行期间,可能产生多次缺页中断。
请求分页系统的地址变换过程如下:
- 先检索快表,若命中,则从相应表项中取出该页的物理块号,并修改页表项中的访问位,以供置换算法换出页面时参考。对于写指令,还需要将修改位置为1。
- 若快表未命中,则要到页表中查找,若找到,则从相应表项中取出物理块号,并将该页表项写入快表,若快表已满,则需采用某种算法替换。
- 若在页表中未找到,则需要进行缺页中断处理,请求系统将该页从外存换入内存,页面被调入内存后,由操作系统负责更新页表和快表,并获得物理块号。
- 利用得到的物理块号和页内地址拼接形成物理地址,用该地址去访存。
C. 页框分配与回收
驻留集:操作系统必须决定读取多少页,即决定给特定的进程分配几个页框。给一个进程分配的页框的集合
- 驻留集越小,驻留在内存中的进程就越多,可以提高多道程序的并发度,但分配给每个进程的页框太少,会导致缺页率较高,CPU需耗费大量时间来处理缺页。
- 驻留集越大,当分配给进程的页框超过某个数量时,再为进程增加页框对缺页率的改善是不明显的,反而只能是浪费内存空间,还会导致多道程序并发度的下降。
内存分配策略:固定、可变分配策略
内存置换策略:全局、局部置换
固定分配局部置换:为每个进程分配固定数量的物理块,在进程运行期间都不改变。
若进程在运行中发生缺页,则只能从分配给该进程在内存的页面中选出一页换出,然后再将所缺页面调入,以保证分配给该进程的内存空间不变。
可变分配全局置换:先为每个进程分配一定数量的物理块,在进程运行期间可根据情况适当地增加或减少。
若进程在运行中发生缺页,则系统从空闲物理块队列中取出一块分配给该进程,并将所缺页面调入。
可变分配局部置换:为每个进程分配一定数量的物理块,当某进程发生缺页时,只允许从该进程在内存的页面中选出一页换出,因此不会影响其他进程的运行。
若进程在运行中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直至该进程的缺页率趋于适当程度;反之,若进程在运行中的缺页率特别低,则可适当减少分配给该进程的物理块,但不能引起其缺页率的明显增加。
固定分配策略:平均分配算法、按比例分配算法、优先权分配算法
调入页面的时机:
- 预调页策略。根据局部性原理,一次调入若干个相邻的页面会比一次调入一页更高效。但若提前调入的页面中大多数都未被访问,则又是低效的。因此,可以预测不久之后可能被访问的页面,将它们预先调入内存,但目前预测成功率仅约50%。因此这种策略主要用于进程的首次调入,由程序员指出应先调入哪些页。
- 请求调页策略。进程在运行中需要访问的页面不在内存,便提出请求,由系统将其所需页面调入内存。由这种策略调入的页一定会被访问,且比较易于实现,因此目前的虚拟存储器大多采用此策略。其缺点是每次仅调入一页,增加了磁盘I/O开销。预调页实际上就是运行前的调入,请求调页实际上就是运行期间的调入。
从何处调入页面:
- 系统拥有足够的对换区空间。可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,需将与该进程有关的文件从文件区复制到对换区。
- 系统缺少足够的对换区空间。凡是不会被修改的文件都直接从文件区调入;当换出这些页面时,由于它们不会被修改而不必再换出。但对于那些可能被修改的部分,在将它们换出时必须放在对换区,以后需要时再从对换区调入(因为读比写的速度快)。3)UNIX方式。与进程有关的文件都放在文件区,因此未运行过的页面都应从文件区调入。
曾经运行过但又被换出的页面,因为放在对换区,所以在下次调入时应从对换区调入。
进程请求的共享页面若被其他进程调入内存,则不需要再从对换区调入。
D. 页置换算法
页面置换算法:
最佳置换算法OPT
先进先出页面置换算法FIFO Belay异常 物理块数据增大,缺页次数增多最近最久未使用算法 LRU
时钟置换算法 CLOCK
简单的CLOCK置换算法 为每个页面设置一个访问位
最近未用(NRU)算法
改进型CLOCK置换算法 访问位A 修改位M
淘汰顺序
A
=
0
A=0
A=0,
M
=
0
M=0
M=0;
A
=
0
A=0
A=0,
M
=
1
M=1
M=1;
A
=
1
A=1
A=1,
M
=
0
M=0
M=0;
A
=
1
A=1
A=1,
M
=
1
M=1
M=1
一轮扫描寻找
A
=
0
A=0
A=0,
M
=
0
M=0
M=0 1类页面
二轮扫描
A
=
0
A=0
A=0,
M
=
1
M=1
M=1 2类页面 将所有A置0,重复一轮扫描
抖动/颠簸:刚刚换出的页面马上又要换入内存
换入 换出
根本原因:分配给每个进程的物理块太小
工作集:在某段时间间隔内,进程要访问的页面集合,可由时间t和工作集窗口尺寸决定驻留集大小不能小于工作集大小,驻留集大小一般小于进程的总大小
将物理页面换出过程即为页框的回收
页面缓冲算法在原页面置换算法的基础上增设已修改页面链表,保存已修改且需要被换出的页面,等被换出的页面数量达到一定值时,再一起换出到磁盘,以减少页面换出的开销。
为了显著降低页面换入/换出的频率,在内存中设置了如下两个链表:
- 空闲页面链表。也称空闲页框链表。当进程需要读入一个页面时,便从空闲页面链表中取链首的页框并装入该页。当有一个未被修改的页面要换出时,实际上并不将它换出到磁盘,而将它所在的页框挂在空闲链表的链尾。注意,这些挂在空闲链表内且未被修改的页框中是有数据的,若以后某个进程需要这些数据,则可从空闲链表上将它们取下,进而避免从磁盘读入的操作,减少页面换入的开销。2)修改页面链表。当进程需要将一个已修改的页面换出时,系统并不立即将它换出到磁盘,而将它所在的页框挂在修改页面链表的末尾。这样做的目的是降低将已修改页面写回磁盘的频率,进而降低将磁盘内容读入内存的频率。
属于内核的大部分页框(如内核栈、内核代码段、内核数据段和大部分内核使用的页框)都是不能回收的,而由进程使用的页框(如进程代码段、进程数据段、进程堆栈、进程访问文件时映射的文件页、进程间共享内存使用的页框)大部分是可以回收的。在Linux内核中,设置了一个负责页面换出的守护进程kswapd,它定期检查内存的使用情况,当空闲页框数量少于特定的阈值时,便发起页框回收操作。下面解释为什么空闲页框数量少于特定的阈值时就要发起回收操作。例如,要释放一个页框,内核可能需要将页框的数据写回磁盘,为此内核可能要请求一个页框来作为I/O传送的缓冲区,而系统中不存在空闲页框,因此不可能释放页框,此时可能导致内核陷入一种内存请求的僵局,并导致系统奔溃。
Linux 系统采用“伙伴算法”对内存中具有不同长度的连续空闲页框进行统计和记录。将内存中连续的空闲页框视为空闲页框块,并根据它们的大小(连续页框的数量)分组。分配页框是一个化整为零的过程,会产生很多碎片,而系统也必须有把零碎的页框合并成大的连续页框块的机制,Linux 使用伙伴算法的逆操作进行页框的回收。回收页框时,算法先检查是否有大小相等的伙伴页框块存在,若有,则将它们合并成一个大小为原来两倍的新空闲页框块,每次合并完后,还要检查是否可以继续合并成更大的页框块。
E. 内存映射文件(Memory-Mapped Files)
内存映射文件(Memory-Mapped Files)是操作系统向应用程序提供的一个系统调用,它与虚拟内存有些相似,在磁盘文件与进程的虚拟地址空间之间建立映射关系。
进程通过该系统调用,将一个文件映射到其虚拟地址空间的某个区域,之后就能用访问内存的方式来读/写文件。这种功能将一个文件当作内存中的一个大字符数组来访问,而不通过文件I/O 操作来访问,显然更为便利。磁盘文件的读/写由操作系统负责完成,对进程而言是透明的。在映射进程的页面时,不会实际读入文件的内容,而只在访问页面时才被每次一页地读入。当进程退出或关闭文件映射时,所有被改动的页面才被写回磁盘文件。
进程可通过共享内存来通信,很多时候,共享内存是通过映射相同文件到通信进程的虚拟地址空间来实现的。当多个进程映射到同一个文件时,各进程的虚拟地址空间都是相互独立的,但操作系统将对应的这些虚拟地址空间映射到相同的物理内存(用页表实现),
F. 虚拟存储器性能的影响因素及改进方式
总结(本章速记)
本章知识骨架:
-
- 内存管理基础
- A. 内存管理概念:逻辑地址与物理地址空间,地址变换,内存共享,内存保护,内存分配与回收
- B. 连续分配管理方式
- C. 页式管理
- D. 段式管理
- E. 段页式管理
-
- 虚拟内存管理
- A. 虚拟内存基本概念
- B. 请求页式管理
- C. 页框分配与回收
- D. 页置换算法
- E. 内存映射文件(Memory-Mapped Files)
- F. 虚拟存储器性能的影响因素及改进方式
关键速记清单:
- 内存管理的主要功能:
- 内存空间的扩充。利用虚拟存储技术从逻辑上扩充内存。
- 存储保护。保证各个进程在各自的存储空间内运行,互不干扰。
- 逻辑地址与物理地址
- 绝对装入(逻辑与实际相同)
- 可重定位装入/静态重定位
- 动态运行时装入/动态重定位
- 对目标模块进行链接时,根据链接的时间不同,分为以下三种链接方式。
- 进程的内存映像 程序调入内存运行时
- 内存保护
- 内存共享
- 内存分配与回收
- 连续分配管理方式
- 单一连续分配 内存划分 系统区(低地址)+用户区(用户程序独占)
- 分配与回归建立一张分区使用表 分区号 大小 起址 状态
- 外部碎片 紧凑技术克服 需要动态重定位寄存器
- 设置一张空闲分区链表
- 基于顺序搜索的分配算法
- 首次适应算法
- 邻近适应算法/循环首次适应算法
- 基于索引搜索的分配算法 大、中型系统
- 快速适应法
- 1 首先根据进程的长度,在索引表中找到能容纳它的最小空闲分区链表;
- 2 然后从链表中取下第一块进行分配。
- 覆盖技术 程序分为多个段
- 以上过程硬件自动完成
- 外层页表寄存器(页目录基址寄存器)
- 分段:地址段内要求连续,段间不要求连续,进程的地址空间是二维的
- 段号 段内偏移量
- 页式系统逻辑地址页号和页内偏移量对用户透明,
- 分段系统 必须由用户显式提供
- 每个进程都有一张逻辑空间与内存空间映射的段表 编译程序完成
- 段表 段号 段长 本段在主存的始址
- 1 从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W。
- 分页和分段对比
- 段号 页号 页内偏移量
- 传统存储管理方式特征:
- 一次性。作业必须一次性全部装入内存后,才能开始运行。
- 快表 页高速缓存 虚拟内存技术 高速缓存技术 时间局部性、空间局部性
- 请求调页(调段):当所访问信息不在主存,操作系统从外存调入内存
- 页面置换(段置换):内存空间不足,将内存中暂时用不到的信息换出到外存
- 虚拟存储器特征:多次性 对换性 虚拟性(最重要的目标)
- 缺页中断与一般中断区别:
- 请求分页系统的地址变换过程如下:
- 4 利用得到的物理块号和页内地址拼接形成物理地址,用该地址去访存。
- 内存分配策略:固定、可变分配策略
- 内存置换策略:全局、局部置换
- 固定分配策略:平均分配算法、按比例分配算法、优先权分配算法
- 调入页面的时机:
- 从何处调入页面:
- 进程请求的共享页面若被其他进程调入内存,则不需要再从对换区调入。
- 页面置换算法:
- 最佳置换算法OPT
- 时钟置换算法 CLOCK
- 简单的CLOCK置换算法 为每个页面设置一个访问位
- 最近未用(NRU)算法
- 改进型CLOCK置换算法 访问位A 修改位M
- 一轮扫描寻找 A = 0 A=0 A=0, M = 0 M=0 M=0 1类页面
- 二轮扫描 A = 0 A=0 A=0, M = 1 M=1 M=1 2类页面 将所有A置0,重复一轮扫描
- 抖动/颠簸:刚刚换出的页面马上又要换入内存
结语
内存管理的演进史,是一部不断“解耦”的历史。连续分配要求程序在内存中占据一整块,于是产生外部碎片;分页把内存切成固定大小的页框,消除了外部碎片却带来少量内部碎片;分段按逻辑单位划分,便于共享与保护;段页式则是二者的折中。而虚拟内存是这一章的灵魂——它建立在局部性原理之上,让每个程序以为自己独占了一个远大于物理内存的地址空间。请务必吃透三件事:地址变换的完整过程(页表、快表 TLB 与页表项各字段)、页面置换算法(尤其是 LRU 与 Clock 在硬件代价上的权衡)、以及抖动(thrashing)的成因——当工作集超出可用页框数时,系统会把几乎所有时间花在换页上。理解了抖动,就理解了虚拟内存的性能边界。
参考资料
- 王道考研《操作系统考研复习指导》
- 汤小丹.计算机操作系统(第4版).西安:西安电子科技大学出版社
- Abraham Silberschatz.操作系统概念(Operating System Concepts).北京:机械工业出版社
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)