OS

内存管理之段页式机制

Posted by Surflyan on 2018-01-10

本文所有配图来源于 William Stallings, Operating Systems - Internals and Design Principals

内存管理是操作系统的核心任务之一。内存管理机制由早先的分区技术发展成被现在各大流行操作系统广泛使用的段页式机制,在正式介绍段页式机制之前,必须了解什么虚拟内存技术,因为不管是分段还是分页亦或是段页式结合,都是建立在虚存的技术之上,简单分段和简单分页在实际中并为使用过。
内存管理主要面对的问题:

  • 段页管理
  • 部分加载
  • 按需调页
  • 换入换出

本文主要就段页管理做一定阐述。

1. 虚拟内存

操作系统由早先的批处理系统到多道程序批处理系统,再到分时系统,都是在围绕着如何提升 cpu 的利用率来发展的。在多进程并发执行过程中,由于内存是有限的,所有只能容纳一定数量的进程,在进程调度执行过程中,一旦遇到I/O 操作等未发生事件,进程阻塞,这很可能造成就绪队列中没有一个进程处于就绪队列。因此,需要在内存中保留多个进程,这就导致进程可以比内存的全部空间都要大。由于进程只能在内存中执行,这个存储空间就是 实存储器 。而程序员或者用户感受到的那个更大的内存空间就是虚拟内存,通常分配在磁盘上。现在假设加载一个新的进程,此时操作系统只读取程序开始的一个或几个块,进程执行时,只要内存访问都是这几个块,那么就可以顺利执行。如果访问不在内存的数据块时,那么就会发生访问故障(缺页中断),该进程被阻塞,操作系统必须通过I/O中断将引发中断的数据块读入内存。这也称作 按需调页。因为缺页而不得不中断,这样效率还能保证吗。事实上,由于程序运行的局部性原理,通常能带来很好效率保证。虚拟内存可看作是内存和外存结合管理。

虚拟内存的优势:

  • 虚拟地址空间 > 物理内存。 用户可以编写比实际内存大的程序。cpu 可寻址空间可以任意使用,可远大于实际物理内存。
  • 内存中可以同时存放更多进程,并发度好,cpu 利用率高,程序响应时间更快。
  • 进程需要的部分放入内存,用不到的几乎从来不进入内存,内存利用率高。

2. 分段

分段技术则将进程可分为许多段,每个段都有各自的用途,比如代码段、数据段、堆栈段。段的大小无须相等。在调入一个进程时,将其所有段都装入内存的可用分区,并建立一个专有的段表记录所有段的在内存的起始位置及其他属性。

采用基于分段的虚拟内存方案时,程序中要访问的逻辑地址格式和段表项内容为:

P 位表示当前页是否在内存中
M 位表示当前页是否修改过

下图为采用分段机制内存方案的逻辑地址到物理地址的转换过程:

分段技术的优点:

  • 符合人的习惯,靠近程序员;
  • 不同的段有不同的含义,在特权级等管理上更为方便;
  • 每个段独立编址,编程容易。

分段技术的缺点:

  • 存在碎片。类似早先内存管理变长分区的存在的碎片问题,需要内存紧缩策略。
  • 远离硬件

3. 分页

在分段机制下,由于段的长度不固定,在内存分配的问题上也会遇到变长分区的问题,会产生外部碎片,也就是内存空闲区段小于段的大小。因此,引入了分页机制。从总体上来说,分页机制就是用固定的页来代替长度不一定的页,来藉此解决因段长度不同而带来的内存空间管理问题。分页机制下,内存被划分成大小固定且相等的块,块相对比较小,称作 页框,每个进程也被划分为同样大小的块,称为 ,然后页可被分配到内存中可用的页框中。基于分页的虚拟内存方案,同样需要页表,通常每个进程都有唯一对应的页表。

采用基于分页的虚拟内存方案时,程序中要访问的虚拟地址格式与页表项内容为:

不同于段表,由于页比较小,故页表可能会很大,考虑到查表效率的问题,常常采用多级页表的结构,下图为一个采用二级页表结构的虚拟地址到物理地址的转换过程:

分页机制的优点:

  • 靠近硬件,结构严格;
  • 消除了外部碎片,可高效的使用内存。

分页机制的缺点:

  • 远离程序员,不符合程序员的思考习惯。

4. 段页式

分段与分页都有各自独有的优势,将分段和分页结合起来,让段面向程序员、页面向硬件。在段页式系统中,虚拟空间被划分为许多大小不一的段,每段又被划分为同样大小的页,而进程也被划分为等大的页填充到内存中的页框中。在段页式机制中,每个进程都需建立一个段表和一些页表,每个段对应一个页表。在进程运行过程中,进程的每个段表的起始地址被记录在寄存器中。

采用基于段页式的虚拟内存方案时,逻辑地址格式、段表项与页表项内容为:

下图为采用段页式机制内存方案的逻辑地址到物理地址的转换过程:

5. 再写一点

操作系统的内存管理除了内存的分配,还涉及到其他非常复杂的策略。在进程被加载进内存中,数据块在执行过程中的换入换出,每次内存地址都不同,因此需要到代码中的相对地址(逻辑地址的特例,是相对与某些已知点的偏移位置)转换为绝对的物理地址,这就是 重定位 问题。还有数据段间的保护和共享问题,数据页的换入换出策略等等。总之,翻译、保护、内存分配是操作系统内存管理的核心。

若要查看详细的内存访问过程,可查看博主之前的文章实模式与保护模式下的内存访问实模式与保护模式下的内存访问

Reference

  1. William Stallings, Operation Systems - Internals and Design Principales, 2017
  2. HIT, Operation Systems Slides

请多多指教!