第三章

内存:用于在计算机运行时临时存储CPU需要处理的数据和程序指令

逻辑地址:也称为虚拟地址,是程序在运行时所看到和使用的地址

物理地址:实地址,是数据在物理内存硬件上真实存储的地址

如何将指令中的逻辑地址转换为物理地址?

装入方式:

绝对装入:程序在编译时,其在内存中的物理地址就已经被完全确定(只适用于单道程序环境);灵活性差

可重定位装入:程序经过编译链接后生成的可执行文件(装入模块)中的地址都是从0开始的逻辑地址;当操作系统决定将该程序装入内存时,它会寻找一块足够大的空闲内存区域。假设程序被装入到起始物理地址为x的位置,那么装入程序会扫描整个程序,将所有指令和数据中的逻辑地址都加上一个偏移量x,将其修改为最终的物理地址。地址装换完成后,程序便在内存中驻留及执行。

优缺点:支持多道程序;运行期间不可移动,所有地址在装入时固定;必须连续分配内存;无法动态扩展

动态重定位:

将逻辑地址到物理地址的转换推迟到程序真正执行时,在每次访问内存的瞬间才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。(重定位寄存器存放的是进程的起始物理地址)

优缺点:支持程序在内存中移动;支持非连续内存分配;便于程序段共享;支持虚拟内存;需要硬件支持;存在运行时开销

3.1内存管理概念

操作系统作为系统资源的管理者,需要对内存进行管理,具体管的内容为:

  1. 操作系统负责内存空间的分配和回收
  2. 操作系统需要提供某种技术从逻辑上对内存空间进行扩充
  3. 操作系统需要提供地址转换功能,负责程序的逻辑地址和物理地址的转换
  4. 操作系统需要提供内存保护功能,保证进程在自己的内存空间内运行,不会越界访问

3.2进程的内存映像

内存覆盖技术

3.3基本分页存储管理

分页存储:操作系统将进程的逻辑地址空间划分为大小相等的页,同时将物理内存划分为大小相等的页框,并通过页表将页映射到任意页框中的一种内存管理方式。

操作系统为每个进程建立一张页表,页表存储在PCB中

每个页表项占多少字节?

基本地址变换机构

基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址的硬件机制。

核心部件包括:页表寄存器;MMU;页表

地址变换过程:

  1. 分割逻辑地址,将CPU产生的逻辑地址分为页号(P)和页内偏移(W)
  2. 检查页号合法性,将页号P与页表寄存器中的页表长度比较
  3. 访问页表,根据页表寄存器中的页表起始地址,找到该进程的页表,然后用页号P作作为索引,找到对应的物理块号F(即页框号)
  4. 计算物理地址,物理地址=F×页大小+偏移量W
  5. 访问内存,MMU按计算出的物理地址去读内存单元

具有快表的地址变换机构

快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓存,用来存放最近访问的页表项的副本,可以加快地址变换的速度。

慢表:内存中的页表

快表地址变换机构可以提高查询速度的原理

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令就很可能再次被执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)

空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)

两级页表

当单级页表很大,需要占用很多个连续的页框时。我们可以使用两级页表

3.4分段式存储管理

分段式存储管理是将用户的逻辑地址空间按程序自身的逻辑结构划分为若干个大小可变的段,每段拥有一段连续的地址空间,并且段与段之间可以离散地放入内存中。

段表记录每一段在物理内存中的基址和段长。

段式地址变换机构包括段表基址寄存器和段表长度寄存器

地址转换过程

  1. CPU生成逻辑地址段号和段内偏移
  2. 比较段号s和段表长度寄存器中的段表长度是否越界
  3. 根据段表基址寄存器和段号找到段表中对应项,取出段的物理基址和段长
  4. 检查段内偏移是否越界
  5. 计算物理地址

优点:无内部碎片;易于动态分配

缺点:产生外部碎片;内存分配效率低;段表占用内存;硬件支持复杂

3.5段页式管理方式

基本思想:

逻辑地址空间按照用户逻辑划分为若干段;将每一段进一步划分为固定大小的页,把页分配到物理内存中不连续的页框中;内存管理,段之间的离散消除了外部碎片,仅存在少量页内碎片。

段页式系统的逻辑地址结构由段号、页号、页内地址组成

段页式地址管理是二维的

地址转换

需要寄存器:段表基址寄存器和段表长度寄存器

3.6虚拟内存

虚拟内存是一种内存管理技术,它使每个进程认为自己拥有一个连续、完整的地址空间,而实际物理内存可能只加载了部分内容,且位置可以分散。虚拟内存允许程序部分装入即可运行。

虚拟内存的主要功能

  1. 地址空间扩展
  2. 内存保护
  3. 内存共享
  4. 按需调页

3.7请求分页管理

请求分页:允许进程只装入少数必要页面就启动,运行过程中通过缺页异常动态调入缺失的页面。

请求分页存储管理的页表组成:页号、内存块号、状态位、访问字段、修改位、外存地址

缺页中断:程序访问一个尚未加载到物理内存中的虚拟内存页时,由CPU的内存管理单元(MMU)触发的硬件中断。

页面置换:在发生缺页中断时,若物理内存已满,操作系统必须选择一个当前驻留在内存中的页面将其换出(若页面被修改,写回磁盘),为新页面腾出空间。

缺页异常机制:当CPU访问存在位=0的虚拟地址时,MMU触发一个缺页中断,操作系统接管并处理。

请求分页的地址转换

  1. CPU生成逻辑地址
  2. 查找TLB:TLB命中得到物理块号,访问内存;TLB未命中到进程页表中查找
  3. 检查页表项中的存在位:存在位=1,计算物理地址,访问内存,并将该页表项装入TLB;存在位=0,缺页异常,转入操作系统内核。
  4. 缺页异常处理:1、判断虚拟地址是否合法。 2、查找空闲页框,若没有空闲页框,执行页面置换算法,选择一个页框调出。 3、将所需页面从磁盘读入空闲页框。 4、更新存在位=1,修改位=0,访问位=0,填写物理块号。 5、重新执行引发缺页的指令,恢复正常运行。

3.8页面置换算法

最佳置换算法(OPT):选择最长时间不再使用的页面换出。

先进先出算法(FIFO):选择最早进入内存的页面换出。实现简单;性能差,出现belady异常,分配页框增多,缺页率反而上升。

最近最久未使用置换算法(LRU):选择最长时间未访问的页面换出。性能好,但需要硬件维护访问时间或访问次序,成本较高

时钟算法(CLOCK,NRU):页框组织成环形,通过指针扫描;访问位=1则清0并跳过;访问位=0则换出。利用页表项的访问位

页面分配策略

驻留集:指请求分页存储管理中给进程分配的物理块集合。

固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变。

可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。

局部置换:发生缺页时只能选进程自己的物理块进行置换。

全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

从何处调入页面?

外存(磁盘)分有对换区和文件区,系统拥有足够的对换区空间,页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区。

抖动

当系统内存不足,进程频繁缺页,导致CPU大部分时间等待磁盘I/O,系统吞吐量急剧下降的现象。

原因是分配的物理页框数少于进程的工作集。

工作集

在某段时间间隔里,进程实际访问页面的集合。

3.9内存映射文件

内存映射文件是一种将磁盘文件的内容直接映射到进程的虚拟地址空间的技术,使应用程序可以像访问普通内存一样通过指针来读写文件,而无需使用传统的read/write系统调用。

内存映射文件基于虚拟内存的请求分页机制实现:

映射建立:操作系统在进程虚拟地址空间中分配一段区域,并记录该区域对应的磁盘文件。

按需调页:当进程首次访问映射区域内的某个地址时,CPU发生缺页异常,操作系统从磁盘文件中将对应的数据页读入物理内存,并建立虚拟页到物理页框的映射。

写操作:修改内存页时,该页会被标记为脏页。脏页最终会写回磁盘。

文件共享:多个进程映射同一文件时,可以共享相同的物理页框,从而实现高效进程间通信和共享数据。

参考:王道操作系统

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐