为什么磁盘内容不是全部都在虚拟内存中?

为什么磁盘内容不是全部都在虚拟内存中?

为了简单起见,我们只讨论硬盘和 RAM。简而言之,虚拟内存是指“程序使用的内存地址被映射”到物理地址中电脑内存“。 经过电脑内存它们的意思是任何内存,包括硬盘,对吗(不仅仅是 RAM)?

颠簸定义为“当硬盘因在系统内存和虚拟内存之间移动信息而超负荷工作时”。所以这意味着数据从硬盘传输回硬盘,但部分指定为虚拟内存?如果是这样,那么为什么不让硬盘的所有内容始终是虚拟内存呢?

编辑:我看到每个人都说虚拟内存的目的是为了让 RAM 看起来更大,但重点不也与进程内部的地址空间有关吗,例如每个进程似乎都有自己的地址空间?所以虚拟内存不仅与更大的大小有关……

答案1

基本上,虚拟化内存使用实际内存作为部分虚拟内存空间的缓存。如果虚拟内存增长过大而无法保留在实际内存中,系统会将其中一部分写入磁盘,并释放实际内存以用于虚拟内存的其他部分。写入磁盘的虚拟内存可能从未在磁盘上,因此必须在那时写入那里。

一些较旧的计算机确实使用磁盘作为内存,但使用真实内存作为缓存的速度要快得多。

当正在运行的程序访问不在实际内存中而是在磁盘上的虚拟内存部分时,系统会出现“页面错误”并从磁盘读取该内存,但这比使用实际内存慢 1000 多倍。

并非所有磁盘都用作虚拟内存(但可以)。一些用作非易失性存储(断电后仍保留的内存)。

这回答了你的问题吗?

答案2

虚拟内存如何使用?

当操作系统启动一个进程时,它会为该进程分配物理内存并设置虚拟内存(映射)。每个进程都有自己的虚拟内存映射。每个进程的虚拟内存地址可以相同(Windows 喜欢使用 0x00400000 作为进程基址),但每个进程的虚拟内存地址也可以不同。此虚拟内存在物理内存中的位置完全取决于当前情况,并且每次运行进程时都会有所不同。

当进程访问地址 0x12345678 时,必须查找虚拟内存映射表以查看需要读取哪个物理内存地址。进程看不到该映射,它是透明的。

举个例子:假设您有一个进程 A。该进程可能从虚拟地址 0x00400000 开始,长度为 10 MB。第二个进程 B 也可能从虚拟地址 0x00400000 开始,长度为 6 MB。两个进程都从相同的虚拟地址开始,但两个进程的物理内存不同。进程 A 可能使用物理内存 0x00010000 处的 10 MB,而进程 B 可能使用物理内存 0x00200000 处的 6 MB。

虚拟内存有什么用呢?

  1. 虚拟内存允许进程分离。进程 A 只能访问映射到其虚拟内存的物理内存。进程 A 不能干扰进程 B 的内存。这是一个安全问题(进程 A 无法从进程 B 的内存中读取机密)和稳定性问题(进程 A 使用错误指针时不会干扰其他进程的内存,但崩溃时不会对其他进程产生影响)。
  2. 如果您有一个程序,该程序有 2 MB 代码、1 MB 常量数据和 5 MB 动态数据,并且如果您启动该程序两次,则进程 A 和 B 将共享相同的物理内存用于代码和常量数据段。因此,您不需要 2*(2+1+5) MB 物理内存,而是 2+1+2*5 MB。
  3. 虚拟内存并不一定需要由RAM来备份。虚拟内存可以是RAM,也可以是磁盘空间。
  4. 操作系统可以为进程提供比物理内存实际支持的更多的内存(谷歌搜索:linux memory overcommit)。

如果您的所有虚拟内存仅由 RAM 备份,则不会发生抖动。只有当您的虚拟内存由磁盘空间备份时,才会发生抖动。要理解这一点,我们首先来看看如何在磁盘上备份虚拟内存。

当进程访问虚拟内存地址时,操作系统必须在 RAM 中备份相应的物理内存。如果已经备份,则进程可以直接访问内存。如果物理内存不在 RAM 中,而是存储在磁盘上,则操作系统首先需要将内存从磁盘加载到 RAM。进程必须等到内存从磁盘加载后,才能恢复进程并访问内存。如果没有可用的 RAM 供操作系统将内存从磁盘加载到其中,则操作系统需要释放一些 RAM。这可以通过将任何 RAM 内存移动(写入)到磁盘来实现。

这里的问题是如何决定将哪些 RAM 内存移动到磁盘。在最坏的情况下,您可能有两个进程在运行,进程 A 循环访问内存页面 1,进程 B 循环访问内存页面 2,并且页面 1 在 RAM 中,页面 2 在磁盘中。当进程 B 访问页面 2 时,页面 1 可能会移动到磁盘,页面 2 移动到 RAM,进程 B 可以访问页面 2。然后进程 A 被调度,页面 2 移动到磁盘,页面 1 移动到 RAM,进程 A 可以访问页面 1。如果您继续交换这两个页面,进程的性能将非常差,您将看到 100% 的磁盘活动。在这种有限的情况下,很明显其他分页策略应该表现更好。存在相当复杂的代码来决定将哪些内存从 RAM 移动到磁盘。例如,一种策略是保留最近访问的页面并换出最近最少使用的页面。当然,a) 如果不展望未来,您就无法在所有情况下都拥有最佳策略,b) 进程越多或 RAM 越少,问题就越有价值。

你可能会问为什么操作系统不直接使用整个硬盘进行虚拟内存备份。事实上,在 Windows 中,你可以创建文件映射这意味着您可以为 Windows 指定一个文件名,然后返回虚拟内存地址。如果您从该虚拟内存读取/写入,Windows 将自动从磁盘上的文件读取/写入。这是一个不错的功能,但它对抖动没有帮助。您需要记住,抖动的原因是您的 RAM 不足以运行所有进程。在这种情况下,增加更多磁盘空间无济于事。

答案3

虚拟内存是覆盖在物理内存(RAM)以及交换文件/分区之上的内存空间。

交换文件/分区是硬盘上的一个特殊文件/部分,计算机可将其用作 RAM。定义交换文件/分区后,其他任何东西都无法使用该空间。因此,理论上,您可以将 100 GB 专用于交换文件,但如果您只有 200 GB 的硬盘,那么您的空间就浪费了一半。

虚拟内存的作用是允许计算机使用比实际运行程序所需的更多的内存。为此,它会将不再需要放在前台但仍需要的数据存储在交换文件/分区中。

这允许程序存储大量可供访问(寻址)的数据,但仍允许其他程序执行相同的操作。

当您没有足够的 RAM 时,硬盘会崩溃的原因是,计算机必须不断地Program A从交换文件/分区获取数据并将其放入 RAM 中,但是当Program B需要访问其数据时,计算机必须将Program A'sRAM 中的数据放回到硬盘上以便为Program B's数据腾出空间。

RAM 也比硬盘快得多,这就是为什么当计算机开始破坏其交换文件/分区时,它通常是第一个要升级的东西

答案4

系统抖动的定义是“硬盘在系统内存和虚拟内存之间移动信息而超负荷工作”

简单来说,虚拟内存由磁盘支持,即 Windows 中的页面文件或 Linux 中的交换分区。

那么,这是否意味着数据从硬盘传输回到硬盘上,但指定用于虚拟内存的部分呢?

虚拟内存或页面文件保存着已被“交换出”的进程的 RAM。现代系统会尝试将一段时间未使用的进程交换到磁盘,例如一段时间未碰过的最小化程序,或长时间未活动的服务。

这样可以为您实际使用的程序提供更多实际 RAM。此外,它还允许您运行比 RAM 支持的更多程序。但是,在“颠簸”期间,基本上您有多个无法装入 RAM 的进程,但它们正在尝试处于活动状态并执行工作。

如果有两个或多个进程同时运行,并且占用了大量内存,而系统中所有内存都已分配,则可能会发生这种情况。因此,系统会不断地将数据从磁盘移动到 RAM,然后再移回磁盘 - 即进程 A 需要 RAM 中但被分流到页面文件的内容,因此系统会检索它,但如果内存真的很低,它可能必须将另一个进程的内存交换到磁盘。然后,当进程 B 轮到使用 CPU 时,系统可能需要再次返回磁盘并为进程 B 交换一些内容。

如果是这样,那么为什么不将硬盘中的所有内容都保留为虚拟内存呢?

没有意义。你基本上是在说为什么不把整个磁盘放在页面文件或交换分区中。页面文件或交换分区只是磁盘的一个区域,供 CPU/OS 的虚拟内存系统使用,但它不会因为任何原因而比磁盘的其余部分更快。

编辑:我看到每个人都在说虚拟内存的目的是为了让 RAM 看起来更大,但重点不是也与进程内部的地址空间有关吗,例如每个进程似乎都有自己的地址空间?

每个用户空间进程都有自己的地址空间。它从地址 0 开始,一直到操作系统为其分配的最大地址。CPU 的 MMU 将用户空间内存地址映射到实际内存地址,这对用户空间进程来说是透明的。

您似乎认为此处的“虚拟内存”与物理 RAM 不同,但事实并非如此。它只是为用户空间进程创建的物理 RAM 的另一种视图。因此,如果您有 3TB 的硬盘,除非您有 3TB 的实际 RAM 以及运行程序所需的 RAM,否则您甚至无法做到这一点。此外,每次更新 RAM 时,您都必须更新硬盘,因此,除非您真的需要非常快速地读取 3TB 的数据,否则这是毫无意义的。

相关内容