深入理解操作系统虚拟内存

来源:互联网 发布:socket编程语言 编辑:程序博客网 时间:2024/05/01 11:41

最近用java NIO的时候涉及到虚拟内存的知识,看了网上一些资料感觉写的都不直观,决定自己整理一下。

先解释几个名词:

虚拟内存

现代操作系统中的进程在使用内存的时候,都不是直接访问内存物理地址的,进程访问的都是虚拟内存地址,然后虚拟内存地址再转化为内存物理地址。
为什么要使用虚拟内存呢?有以下两个优点:

  1. 虚拟地址空间可以大于实际的内存空间,比如实际内存大小是1G,但是虚拟地址空间可以是4G。这样在操作系统中的普通应用程序看来,就好像是有4G的可用内存。
  2. 一个以上的虚拟地址可指向同一个物理内存地址。这个很好理解,虚拟地址到物理地址的映射可以是多对一的。

页面文件

上文我们说到,虚拟地址空间可以大于实际内存空间,这是怎么实现的呢?很简单,比如我实际内存1G,虚拟内存设成了4G,现在往4G的虚拟内存里放了4G的数据,那么当前只有1G的数据在真实内存中,另外的3G因为装不下就只能以文件形式放到硬盘里,这个存放内存内容的硬盘文件就叫页面文件。

因此虚拟内存的空间=物理内存+页面文件。

页面

现在我们知道一个虚拟地址转化为真实地址的时候,不一定会对应内存地址,还可能对应硬盘地址。

而内存的一个地址一般对应1byte,而硬盘的一个地址一般对应512byte(一个磁盘扇区),这里先剧透一下,后面我们会把内存和硬盘里的数据做交换,也就是把一个内存地址对应的数据拷贝到硬盘里或者反过来把硬盘数据拷贝到内存里,因此要方便处理最好统一单位(传说中的页对齐)。

页就是一个统一的单位,页的大小总是磁盘扇区大小的倍数,通常是2次幂,比如1024、2048、4096字节。有了页这个统一单位,接下来我们说的虚拟地址、内存地址、磁盘地址都是对应的一个页。

现在需要的知识点都有了。

现在假设我们是一个进程,我们只知道一个虚拟地址Vaddress1,现在我们要获取该地址对应的数据,那么操作系统就应该给我们提供一个这样的API:

Data getPageByVirtualAddress(Vaddress)

我们要直接通过虚拟地址获取到数据,至于内部的虚拟地址映射,页这些概念,作为进程是不需要知道的。

而我们现在的关注点就是,操作系统内部是如何实现这个API的,请看图:



第一步

第一步是要把虚拟地址Vaddress转化为物理地址Paddress,这一步是CPU直接完成的,参见维基百科:

Address translation hardware in the CPU, often referred to as a memory
management unit or MMU, automatically translates virtual addresses to
physical addresses.


地址转换是硬编码在CPU里的,CPU里的MMU负责自动将虚拟地址转化为物理地址。

这个MMU的工作原理也很简单,是通过一张页映射表直接把虚拟地址映射为物理地址。

如图所示,Vaddress1通过页映射表被映射为Paddress1,而Paddress1当前指向D1。

第二步

获取物理地址后,直接通过物理地址去内存找数据,只有两种可能:
1. 找到了,那么直接返回数据就行了,执行结束。
2. 没找到,没找到说明这部分数据存在磁盘的页面文件里了,进入第三步。

在图中的例子就是没找到。

第三步

通过物理地址在磁盘页面文件找数据:
如图中所示找到了D1,那么把D1处的文件复制到内存上的一处空页R1,然后修改页映射表中Paddress的指向,由D1改为R1。
返回第一步,重新用虚拟地址去映射物理地址,这次的映射结果将会是R1,然后在第二步的时候就必然会直接从内存返回数据。

补充

在第三步中有一个操作是将D1处数据复制到内存上的空页R1,那么有一种情况是内存上的全部页都已经装满数据了,这时怎么办呢?

这时就只能去覆盖一个暂时没有被使用的内存页,比如R2了。R2上的数据将会被复制到磁盘上的一个空页D2,然后原本在页映射表中指向R2的地方将被修改为D2。

那么问题又来了,上面提到了将R2上的数据复制到磁盘上的一个空页D2,那么这时候如果磁盘页也满了怎么办呢?仔细想想就知道不会发生这种情况的:前面说过

虚拟内存的空间=是物理内存+页面文件。

因此在极限情况下,虚拟内存空间全部被占用,此时物理内存和页面文件刚好可以存下所有的数据。

总结

从本质上来看,通过使用虚拟内存,操作系统将物理内存和磁盘分页文件这两者组成了一个分级缓存系统。

正在频繁使用的数据保存在内存中,不频繁使用的保存在磁盘上。当要访问的内容不在内存中时,就把硬盘中的内容置换进内存,当前没有被频繁访问的内容置换到硬盘。

0 0
原创粉丝点击