挖祖坟级的虚拟内存解读

什么是虚拟内存

虚拟内存可以分为两个词去看待——虚拟、内存。虚拟意味着现实中不存在,内存就是存储。

虚拟内存到底是什么?为什么是虚拟的?

我们追本溯源,看看论文是如何定义虚拟内存的。

Virtual memory may be used to give the programmer the illusion that memory is much larger than in reality. To do this, it is necessary to allow the programmer to use a set of addresses different from that provided by the memory and to provide a mechanism for translating program-generated addresses into the correct memory location addresses.

虚拟内存为程序员提供了一个错觉——程序运行的内存比实际的内存要大。为了实现这点,必须让程序员使用与存储器地址不同的地址,同时机器可以将程序生成的地址翻译成正确的存储器地址。

再看看《深入理解计算机系统》的定义

虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。

我们可以看出,二者对虚拟内存的定义基本相同。虚拟内存是一种交互方式,是一个地址空间,是对主存的抽象概念

既然是抽象概念,当然就不能是现实存在的了。

为什么要出现虚拟内存

最初出现虚拟内存的原因当然要从最初的论文中提取,好在Peter 在摘要中就说明了。

The need for automatic storage allocation arises from desires for program modularity, machine independence, and resource sharing. Virtual memory is an elegant way of achieving these objectives.

自动存储分配需求的增加导致了虚拟内存的出现。自动存储分配主要用于程序模块化、机器独立性和资源共享。

程序模块化

Program modularity. Programs may be constructed as collections of separately compilable modules which are not linked together to from a complete program until execution time.

程序模块化允许各程序分开编译,根据需要再组合链接成一个执行文件。程序就像搭积木,需要哪块就用哪块,“拼装”成最终需要的执行文件。

机器独立性

Machine independence. There is no a priori correspondence between address space and memory space.

机器独立性允许地址空间和内存空间之间没有先验对应关系,允许在不重新编程的情况下更改计算机设备,允许在不同环境下运行同一套程序。

理解

程序模块化就迫使机器必须提供一个程序地址翻译为物理地址的机制。这是因为程序分块后只知道自己的地址,在执行前不知道和哪些程序链接、链接后需要用多大地址。由机器负责地址分配和翻译工作,既可以支撑程序模块化,又可以大大解放程序员,把工作放在解决问题上。

机器独立性也是同样的道理,程序在编写的时候不知道未来机器是否需要更改,是否要求在不同环境下运行。既然不知道,那就不要管,只管好自己的地址就好了,剩下的都交给机器去做。

拓展内存是不是原因之一

一些博客讲了拓展内存是虚拟内存存在的原因之一。但是在翻看 Peter 的论文后,我发现拓展内存并不是原因,只是带来的一个好处

虚拟内存不只是用磁盘来扩展内存,而扩展内存只是扩充内存级别以使其包含硬件驱动器而已。

Peter 的论文原话只说了自动存储分配的需求引出了虚拟内存,虚拟内存带了一种错觉——内存空间变大了。

再者,在一些早期的系统,如 DEC PDP-11/70,虚拟内存比物理内存要小。倘若拓展内存是原因,这么DEC PDP-11/70的虚拟内存必然大于物理内存。

可见,拓展内存只是虚拟内存的果之一,并不是因。

ps. 感兴趣的读者可就这点与我继续讨论

虚拟内存带来什么好处

这里我们完全参考《深入理解计算机系统》,书里总结的虚拟内存有三大优点。

  1. 虚拟内存作为内存管理的工具

    虚拟内存大大简化了内存管理,并提供了一种自然的保护内存的方法。

  • 简化链接——独立的地址空间允许每个进程的内存映射使用相同的基本格式,而不管代码和数据实际存放在物理内存何处。
  • 简化加载——容易加载可执行文件和共享对象文件。
  • 简化共享——为OS提供一个管理用户进程和OS自身之间共享的一致机制。
  • 简化内存分配——向用户进程提供一个简单的分配额外内存的机制。
  1. 虚拟内存作为内存保护的工具

    虚拟内存控制了对内存系统的访问,实现机制是地址翻译硬件需要访问的PTE上添加一些额外的许可位来控制对一个虚拟地址的访问权限。

  2. 虚拟内存作为缓存的工具

现在还需要虚拟内存吗

先说结论,需要。

现在这个时代,内存大小已经不是问题。但是拓展内存并不是虚拟内存的原因之一,所以大内存时代我们依旧需要虚拟内存。

因为虚拟内存解决的是自动存储分配的需要,是为程序模块化、机器独立性和资源共享服务的。这些需求现在依旧存在,并且已经是我们提升开发效率的重要支撑。

参考文献

  1. Peter J. Denning. 1996. Virtual memory. ACM Comput. Surv. 28, 1 (March 1996), 213–216.

  2. 《深入理解计算机系统》

  3. 维基百科-虚拟内存

@山东·威海 2020.05.01

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值