0

由于程序存储在闪存/磁盘上。为了执行它,程序被加载到虚拟内存中,并由虚拟管理器映射到 RAM。在其执行过程中是在 RAM 中。那么虚拟内存在哪里(它有所有.text、.data、.stack、.heap)?

4

3 回答 3

3

虚拟内存是 RAM 的一个视图,可能还有一些由虚拟内存管理器提供的交换空间。现代操作系统具有虚拟内存管理器并为进程提供虚拟内存,以便执行程序可以表现得好像它有一个连续的地址空间,其大小不受实际 RAM 的限制。构成虚拟内存的页面或块可以映射到 RAM 中的任何位置,因此需要将连续的虚拟页面存储在连续的 RAM 区域中。或者它们可以被换出到页面空间或交换空间,在那里等待直到需要,然后它们被操作系统读取并映射到某个 RAM 页面。

当你说

在其执行过程中是在 RAM 中。

这并不完全正确。正如解释的那样,属于该进程的一些或所有内存页面可能会被换出。

关于说“虚拟”意味着它不存在的答案和评论,还有一个词。这是没有意义的。相反,根据韦伯斯特的说法:

本质上或效果上是这样的……

因此,虚拟内存是一种表现得好像它是内存的东西(因此,它存在!)。

于 2013-07-25T11:07:51.947 回答
0

虚拟内存就像 RAM 的幻觉。它使用分页来获取操作系统中的进程可以使用的额外 RAM。

于 2013-07-25T11:12:18.147 回答
0

虚拟内存是指您可以使用“普通”内存访问方法访问的内存,尽管尚不清楚数据实际存储在哪里。

它可能是

  • 实际上在 RAM 中
  • 在交换区
  • 在另一个文件中(内存映射文件)

并且对它的访问将得到适当的处理。

它是一个虚拟化层,因此您作为程序员不必担心数据的实际放置位置。

最初的目的主要是为了能够为进程提供比我们实际拥有的更多的内存,并通过交换空间来扩展它,但还有更多:

  • 操作系统可以自由地将 RAM 用于任何必要的用途,例如缓存。在某些情况下,将 RAM 用于缓存可能比保存长时间未使用的程序部分更有效。
  • 在程序请求时为其提供额外的内存:如果您调用malloc(),程序的库可能会请求操作系统提供可以无缝连接到地址空间的一部分内存。
  • 避免堆栈溢出:如果堆栈越来越大,相应的内存部分也可以透明地扩展,这样程序就不必担心它。
  • 系统甚至可以“过度使用”内存:如果一个进程请求大量内存,操作系统可能会说“是的,好的”,即将内存提供给程序。这意味着首先“允许程序访问某个地址空间区域”,但该地址空间不会立即由内存支持。只有当程序访问该内存时,映射才会完成,如果无法完成,程序就会被 Out of emory 杀手(至少在 Linux 下)崩溃。

所有这一切都是通过将物理内存按页(1 页 = 4 kiB)分配给程序来实现的,通过程序的地址空间查看,这在数量和频率上都是需要的。

于 2013-07-25T11:15:10.177 回答