我一直在学习这些主题并阅读了许多文章和书籍,但它们都缺乏一些补充信息,让我更加困惑。所以在这里,我想解释一下我在提问时所知道的。希望这个主题对像我这样的许多人有用。我还想了解我的知识的有效性,并在必要时进行更正。
虚拟内存
一些文章说“虚拟内存是硬盘的一些空间,它模拟物理内存,因此我们可以拥有比实际更多的内存。”。其他一些文章说“虚拟内存是物理内存 (RAM) 的组合,它是硬盘的一部分,其作用类似于物理内存和页表。” 但是它们是不同的东西,我不明白为什么会有这样的不同解释。
让我们继续第二个解释,因为它也是 Wikipedia 描述虚拟内存的方式。在这一点上,虚拟地址是有意义的,因为我们在虚拟内存中使用地址而不是直接使用物理内存。
顺便说一句,我的 Mac 说我有 8GB 物理内存和 8GB 虚拟内存。在这种情况下,VM 是否包括物理内存或者它是 HD 中用作内存的空间量?我的程序是否有 16GB 内存可用?
问题一:
Intel i5 具有 36 位地址总线,这意味着您可以寻址 64GB 内存。假设我在我的电脑上安装了 4GB RAM。但是,我的程序可能不知道安装的内存大小,因为它将用于具有不同内存大小的许多不同系统。这就是虚拟内存变得方便的地方。它抽象出安装的内存的实际大小。
但是,当我的程序想要访问内存地址 0xFFFFFFFFF 时会发生什么?我只安装了 4GB,也许还有一些 HD 内存空间。
对于这个问题,我有两个理论:
1.由于页表是由 OS 维护的,OS 对该地址进行解码并找出是哪个页,并在页表中检查该页以查看它们是否具有与其关联的物理地址(有效和无效标志),如果是然后转到物理内存中页面入口点的物理地址+虚拟地址中定义的偏移量并带来该值。否则会发生页面错误,操作系统在辅助存储中查找该页面,获取它并将其放入内存并更新页表。
2.它抛出 OutOfMemory 类型的异常,表示我没有给定地址可以寻址的任何内存。
第一种理论的缺点是当程序想要使用 64GB 内存时会发生什么?然后我们需要有 60GB 的 HD 内存空间,因为我们只有 4GB。但是,在下面的屏幕截图中,MAC 告诉我只有 8GB 虚拟内存。
问题2:
进程如何放入虚拟内存中?我的意思是每个进程都有 0x0 - 0xFFFFFFFFF 可用的虚拟内存空间,还是只有一个虚拟内存地址空间可以放置所有进程?
如果每个进程都假设它们拥有所有可用的内存,那么这些内存如下所示:
如果只有一个虚拟内存概念,那么它看起来像这样:
页表
所以页表是一种位于物理地址和虚拟地址之间的数据结构。它是一个关联数组(或类似字典),对于每个页面(键),都有一个关联的物理地址(值)。
操作系统使用 MMU(内存管理单元)来执行从虚拟地址到物理地址的转换。
问题 3:
是否有一个巨大的页表,其中包含每个进程的所有页面,或者每个进程都有自己的页表?
寻呼
分页是一种内存管理方法。虚拟内存和物理内存由内存管理单元划分为页面(它们是固定且大小相同的块)。当您在内存和辅助存储之间交换页面时,此技术很有用,以便您可以在它们之间交换页面。例如,您的程序请求位于地址中的数据。但是,您的程序使用的地址是虚拟地址,MMU 使用页表对其进行转换。在此期间,MMU 检查页表中是否存在请求的页表,如果没有,则 OS 从辅助存储中获取并更新页表。
问题4:
假设一个进程从一个地址请求数据,该地址被转换为一个已经有一些数据的物理地址。怎么知道数据不属于请求者进程而应该替换为二级存储中的数据?
例如,有脏位用于是否将该页面写回硬盘,但我认为这不是决定所有者进程的因素。