早期系统
操作系统曾经是一组函数(实际上是一个库),在内存中(在本例中,从物理地址0开始),然后有一个正在运行的程序(进程),在目前物理内存中(本例中,从物理地址 64KB 开始),并使用剩余内存。
多道程序和时分共享
由于机器昂贵,人们开始更有效地共享机器,因此,多道程序系统时代开启。其中有多个进程在给定时间准备运行,比如当有一个进程在等待 I/O 操作的时候,操作系统会切换这些进程,这样增加了 CPU 的利用率。
一种实现时分共享的方法,是让一个进程单独占用全部内存运行一段时间,然后停止,并将它的所有状态信息保存在磁盘上(包含所有的物理内存),加载其他进程的状态信息,再运行一段时间,这就实现了比较粗糙的机器共享。遗憾的是,这种方式太慢了。
因此,我们仍然将进程信息放在内存中,这样操作系统可以更有效率低实现时分共享。
如上图所示,每个进程拥有一部分内存,假定只有一个 CPU ,操作系统选择运行其中一个进程(比如 A),同时其他进程(B 和 C)则在队列中等待运行。
随着时分共享变得流行,人们对操作系统有了新的要求,特别是多个程序同时驻留在内存中,使保护(protection)成为重要问题。
地址空间
上图中,当我们描述地址空间时,所描述的是操作系统提供给运行程序的抽象(abstract)。程序并不在物理地址0~16KB 的内存中,而是加载到任意的物理地址。
运行的程序认为它被加载到特定的地址(例如 0)的内存中,并且具有非常大的地址空间。如图 13-2中的进程 A 尝试在地址0(虚拟地址)执行加载操作时,然而操作系统在硬件支持下,出于某种原因,必须确保不是加载到物理地址 0,而是物理地址 320KB(这是 A 载入内存的地址)。这是虚拟化的关键,这是世界上每一个现代计算机系统的基础。
微内核:通过将内核隔离,操作系统进一步确保运行程序不会影响底层操作系统的操作。一些现代操作系统通过将某些部分与操作系统的其他部分分离,实现进一步的隔离。这样的微内核(microkernel)可以比整体内核提供更大的可靠性。
目标
虚拟内存(VM)系统的主要目标是:
透明(transparency)。操作系统实现虚拟内存的方式,应该让运行的程序看不见,因此,程序不应该感知到内存被虚拟化的事实,相反,程序的行为就好像它拥有自己的私有物理内存。
效率(efficient)。包括时间和空间。
保护(protection)。操作系统应该确保进程受到保护,不会受到其他进程的影响,操作系统本身也不会受到进程的影响。每个进程都应该在独立环境中运行,避免其他出错或恶意进程的影响。
关于虚拟化内存,需要清楚以下内容:如何管理可用空间,以及在空间不足时哪些页面该释放。
小结
虚拟内存系统负责为程序提供一个巨大的,稀疏的,私有的地址空间的假象,其中保存了程序的所有指令和数据。操作系统在专门的硬件的帮助下,通过每一个虚拟内存的索引,将其转化为物理地址,物理内存根据获得的物理地址去获取所需的信息。操作系统同时对许多进程执行此操作,并且确保程序之间不会受到影响,也不会影响操作系统。