虚拟内存

计算机系统中的RAM资源有限,由系统上所有运行的进程竞争共享。当系统运行多个应用程序时,所有进程分配的内存总量会超过系统上RAM的数量,这很正常。

操作系统也支持虚拟内存,这样进程就可以分配和使用比系统上的安装的RAM数量还要多的内存。也就是说,进程的地址空间不受物理RAM数量的限制。有了虚拟内存,操作系统便可以使用次级存储器(如硬盘)上的后备存储空间,保存无法放到RAM中的进程的地址的空间。然而,CPU仍然只能访问RAM中的地址,因此,操作系统必须在磁盘后备存储空间和RAM之间交换数据,以便能在进程运行时访问内存。

在特定时刻,进程可能只需要使用分配的总内存的一小部分,我们称之为进程的工作集。只要操作系统将这一工作集保存在RAM中,就可以忽略虚拟内存对执行速度的影响。工作集是一个动态实体,根据进程运行时当前使用的数据而变化。如果进程访问RAM外的内存地址,则需要从磁盘的后备存储中读取对应的数据,放入RAM中。如果当前没有空闲的RAM用于数据载入,就需要预先将RAM中现存的一些数据换出并保存到磁盘,释放物理RAM。

虚拟内存由操作系统处理。用户进程并不参与这一过程的实现,它不用关心地址空间是否在RAM中,也不用关心访问的数据是否转到了主存中。

使用虚拟内存的后果是,进程使用的地址与物理RAM的地址并不对应。只要想一想进程地址空间比系统的RAM大,你就明白了。因此,需要将进程读取/写入的地址从进程的虚拟地址空间转换成物理RAM地址。由于访问每个内存都需要进行地址转换,为了减少对执行速度的影响,这些工作全由CPU执行。

操作系统通常使用一种称为“分页”的方案,来实现虚拟地址到物理地址的转换。使用分页内存方案时,物理内存被划分成固定长度的块,称为页帧。大多数操作系统,包括Mac OS X和IOS,使用的帧长度为4096 Byte。类似地,每个进程的虚拟内存空间也都划分成固定长度的块,称之为页。每页的字节数与每帧的字节数始终相同。这样便可以将进程中的每页映射到物理内存中的一个帧里,如下图所示


虚拟内存的另一个优点是,进程虚拟地址空间中页码连续的缓冲区,可以分布到物理内存多个不连续的帧里,如上图所示。这就解决了物理内存的碎片问题,因为一个进程分配的内存可以分布到多个物理内存段,而且不受最长的连续物理页帧组的大小限制。

作为启动进程的一部分,操作系统会创建一个表,保存进程的虚拟地址空间及其对应的物理地址之间的映射关系,这个表称为:“分页表”。从概念上讲,页表项对应进程地址空间中的每页,以及每页对应的物理页帧地址。页表项还包含访问控制位和一个比特位,CPU根据前者来判断页是否只读,根据后者来判断页是在内存中还是已经换到后备存储器中。下图描述了CPU虚拟地址转换为物理地址进需要执行的步骤。

如果CPU无法将进程访问的地址转换为物理地址,就会发生错误,我们称之为“缺页异常”。缺页异常运行在特权执行层,由操作系统处理。操作系统确定异常是否由地址不在进程地址空间而引起,如果是,则说明进程试图访问无效的地址,因而会被终止。如果是因为包含该地址的页已经换出到后备存储器而发生异常,操作系统将会执行一下操作。

(1)分配一个物理内存中的帧,保存请求页;如果内存中没有空闲的帧可用,则将现有的帧换出到后备存储器中,腾出空间。

(2)将请求页从后备存储器读取到内存中。

(3)更新进程的页表,以便将请求的页映射到分配的帧。

(4)将控制权返回给调用进程

调用进程重新执行引起异常的指令,但这次,CPU可以找到页表中请求页的映射,此时指令成功。

尽管IOS为每个进程都提供了一个页表,但它并不支持后备存储器。乍一看,也许你会认为这完全背离了分页的初衷,但这样其实有两个非常重要的目的。第一,让每个进程可以完全访问内容。第二,避免了由物理内存碎片造成的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值