内存空间演化史

这一次, 我们从内存的视角, 再次回顾操作系统的演化史.

早期系统

正如我们过去所言, 操作系统早先只是一组函数, 是一个库.
因此早期机器没有什么抽象, 只是操作系统的进程占用一部分内存, 现在正在运行的程序使用剩余的内存.

Early Days

多道程序与时分共享

后来, 由于人们想要有效共享昂贵的机器, 多道程序系统时代开启.
计算机中有多个进程在给定时间准备运行, 当有一个进程在等待 I/O 操作的时候, 操作系统会切换这些进程, 增加了 CPU 的有效利用率.

再后来, 人们意识到批量计算的局限性, 对交互性的重视提升(可能许多人在同时使用机器, 而每个人都等待他们的任务及时相应)
因此分时系统的时代到来了.
时分共享的一种实现方式是: 让一个进程占用全部内存一小段时间, 然后停止它, 加载其他进程状态信息并运行.

Sharing Memory

随着时分共享也变得流行, 人们又提出了诸如保护性之类的其他要求.

地址空间

操作系统提供了易用的物理内存抽象, 叫作地址空间.
一个进程的地址空间包含运行的程序所有的内存状态, 例如:

  • 代码(code), 即指令

Address Space

当我们描述地址空间的时候, 所描述的是操作系统提供给运行程序的抽象.
程序不在对应的物理地址, 而是加载在任意的物理地址.

目标

操作系统要在单一的物理内存上为多个运行的进程构建一个私有的, 可能很大的地址空间的抽象.
这时, 我们称之为操作系统在虚拟化内存.
当进程试图在虚拟地址某处执行加载操作的时候, 操作系统在硬件的支持下, 必须将虚拟地址转化, 确保数据加载到对应的物理地址.

而为了指导操作系统虚拟化内存, 我们需要制定一些目标:

  • 透明: 程序不应该感知到内存被虚拟化的事实, 行为就应该好像其拥有自己的私有物理内存.
  • 效率: 包括时间上不要拖慢程序运行太多, 空间上不要太多额外内存. 操作系统必须依赖硬件支持, 例如 TLB.
  • 保护: 进程不应该受到其他进程影响, 操作系统本身也不应该被其他进程影响. 在进程之间提供隔离, 让进程在自己独立环境运行.