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