技术开发 频道

虚拟内存机制浅析

  现在的操作系统基本上都实现了虚拟内存的功能。本文就简单的记录一下我对虚拟内存的理解。

  1. 虚拟内存的作用

  1.1 便于写程序,特别是多进程环境下的程序。

  想象一下,如果每个程序都要在固定的物理地址执行,读取指定物理地址处的数据,那么多个程序如何共存,数据如何保护?有了虚拟内存这一层,每个程序都运行在自己相对独立的虚拟空间中,不需要考虑别的程序。

  1.2 可以访问比物理内存多的虚拟空间

  理论上程序可以访问虚拟空间中的每一个地址,比如32位机器上一个程序可以访问4G的空间,即使实际的物理内存没有那么多。因为一个虚拟地址可以映射到物理内存,也可以映射到硬盘,或是其它设备,比如显卡的内存。从这个角度看,物理内存是当作了cache。为了达到这个效果,操作系统做了很多工作,比如将数据从硬盘空间取到内存,或是将内存放到硬盘里,一般这个操作叫做page in, page out,硬盘上存放虚拟空间内容的那个地方叫swap空间。

  2. 虚拟地址和物理地址的映射

  有了虚拟内存这一层,CPU上的指令访问的地址都是虚拟地址,而这些地址是需要在物理内存中真实存在的,这里就需要在虚拟地址和物理地址直接建立一个映射关系(应当是多对一的关系),说白了就是一个整数集合到另一个整数集合的映射。

  最简单的可以用一张表格来记录这个关系:T[vi] = pi, 其中vi, pi都是32位的整数.

  如果对每一个可能的地址都要记录一下的话,这个表格占用的空间需要16G的空间。为了减小管理开销,将空间进行切分,一段连续的空间作为一个映射的单元,一般称为page。假设每页内存的大小为4k, 那么4G的空间就可以看作是1M个4K大小的page组成,那么映射表的大小需要4M,是不是好多了?

  这个4M是对一个进程来说的,如果我有1k个进程,那么是不是需要4G的空间了呢?

  4M可以映射整个空间,但如果我只需要访问其中很小的空间(比如32M),是不是也一定要分配4M空间给映射表呢?

0
相关文章