了解虚拟地址,虚拟内存和分页

时间:2014-03-10 00:51:37

标签: paging virtual-memory virtual-address-space

我一直在学习这些主题并阅读了很多文章和书籍,但他们都缺乏一些补充信息,让我更加困惑。所以在这里,我想在我提出问题时解释我所知道的。希望这个主题对我这样的人有用。如有必要,我也想学习我的知识和更正的有效性。

虚拟内存

有些文章称“虚拟内存是硬盘的一些空间,它模拟物理内存,因此我们可以拥有比实际更多的内存。”其他一些文章说“虚拟内存是物理内存(RAM)的组合,硬盘的一部分就像物理内存和页面表。”然而它们是不同的东西,我不明白为什么有这样的不同解释

让我们继续第二个解释,因为维基百科也是如何描述虚拟记忆的。此时虚拟地址是有意义的,因为我们直接使用虚拟内存中的地址而不是物理内存。

顺便说一下,我的Mac说我有8GB的物理内存和8GB的虚拟内存。在这种情况下,VM是否包含物理内存,还是HD用作内存的空间量?我的程序有16GB可用内存吗?

enter image description here

问题1:

Intel i5具有36位地址总线,这意味着您可以寻址64GB内存。假设我在我的电脑上安装了4GB RAM。但是,我的程序可能不知道所安装内存的大小,因为它将在具有不同内存大小的许多不同系统上使用。这就是虚拟内存变得方便的地方。它抽象出安装的内存的实际大小。

然而,当我的程序想要访问内存地址0xFFFFFFFFF时会发生什么?我只安装了4GB,也许还有一些高清内存空间。

我对这个问题有两个理论:

1。由于页面表由操作系统维护,操作系统会对该地址进行解码并找出该页面,并检查页面表中的该页面,以查看它们是否具有与之关联的物理地址它(有效和无效标志),如果是,则转到物理地址,页面入口指向虚拟地址中定义的物理内存+偏移量并带来该值。否则会发生页面错误,操作系统在辅助存储中查找该页面,获取它并将其放入内存并更新页面表。

2。它抛出一个OutOfMemory类型的异常,它说我没有任何给定地址可以解决的内存。

第一个理论的缺点是程序想要使用64GB内存时会发生什么?然后我们需要有60GB的高清内存空间,因为我们只有4GB。但是,在MAC屏幕截图中,MAC告诉我虚拟内存只有8GB。

问题2:

如何将进程放入虚拟内存?我的意思是每个进程都有可用的0x0 - 0xFFFFFFFFF虚拟内存空间,或者只有一个虚拟内存地址空间可以放置所有进程吗?

如果每个进程都假定他们拥有可用的所有内存,那么回忆如下:

enter image description here

如果只有一个虚拟内存概念,那么它将如下所示:

enter image description here

Page Table

因此,页表是位于物理地址和虚拟地址之间的数据结构。它是一个关联数组(或类似字典),对于每个页面(键),都有一个物理地址关联(值)。

操作系统使用MMU(内存管理单元)执行从虚拟地址到物理地址的转换。

enter image description here

问题3:

是否有一个巨大的巨型页面表,其中包含每个进程的所有页面,或者每个进程都有自己的页面表?

寻呼

分页是一种内存管理方法。虚拟内存和物理内存由内存管理单元分为页面(固定和相同大小的块)。当您在内存和辅助存储之间交换页面时,此技术非常有用,以便您可以在它们之间交换页面。例如,您的程序请求位于地址中的数据。但是,程序使用的地址是虚拟地址,MMU使用页表对其进行转换。在此过程中,MMU检查页表是否在页表中存在请求,如果不存在,操作系统从辅助存储器获取,并更新页表。

问题4:

假设一个进程从一个地址请求数据,该地址被转换为已经有一些数据的物理地址。如何知道数据不属于请求者进程,应该用二级存储中的数据替换?

例如,有一个脏位用于是否将该页面写回硬盘,但我不认为这是决定所有者进程的原因。

2 个答案:

答案 0 :(得分:15)

答案 1 :(得分:13)

有些人使用术语“虚拟内存”就好像它与页面文件同义一样,因为页面文件代表分配的内存中不是“真实”内存(即RAM)的部分。但大多数人认为“虚拟内存”是操作系统为程序提供的整个抽象层,它结合了RAM和页面文件。

我不确定Mac OS会支持哪些这些定义,尽管您的计算机似乎不会分配任何分页内存,所以我猜它可能正在添加8GB的分页内存到8GB的实际内存,总共16GB的可用(虚拟)内存。

请记住,因为操作系统管理内存分配和释放请求,所以可以随心所欲地执行任何操作。我的理解是,大多数操作系统为每个进程都有不同的内存分配表,因此它们可以为多个程序提供相同的虚拟内存地址,但这些内存地址将映射到内存中的不同实际块。因此,64位操作系统可以将最大数量的32位地址分配给多个32位程序 - 它们并不仅限于相同的32位内存地址。

但是,存在限制:操作系统可以将限制设置为允许页面文件增长到的大小。因此,除非您故意告诉操作系统这样做,否则它可能不会有64 GB的总虚拟内存。即使它确实如此,它也无法为每个程序分配所有64 GB,因此在操作系统在OutOfMemory为您的程序分配虚拟地址之前,您很可能会遇到0xFFFFFFFFF错误。 (事实上​​,我不会惊讶地发现0xFFFFFFFFF实际上是一个保留的错误代码位置,类似于0x0。)但是因为你的程序知道的地址与true无关内存地址,你有可能最终被分配一个你的程序认为是0xFFFFFFFFF的内存地址,即使操作系统没有在那么大的内存附近使用。

  

是否有一个巨大的巨型页面表,其中包含每个进程的所有页面,或者每个进程都有自己的页面表?

可能两者......然后是一些。

  1. 每个进程都有自己的私有内存表,操作系统将主动阻止您的程序访问尚未分配给该表的内存地址。
  2. 还有共享内存这样的东西,因此需要使用相同信息的两个进程可以创建共享内存区域,并且两个内存空间中的地址都可以访问。
  3. 操作系统本身显然需要有一些方法来跟踪可用的总内存量,地址空间是空闲/使用的,以及哪些虚拟内存块已分配到RAM或页面文件中的哪些位置。 / LI>

    因此,假设一个进程已经在地址0x00000002分配了内存,当它从该内存地址加载该值时,操作系统可能会发现它实际上映射到实际内存地址{{1这是内存地址,其值实际上将被提取到CPU寄存器中。或者,它可以意识到它已经将包含该地址的页面移动到某个地方的磁盘上,在这种情况下,操作系统将找到一个空的内存部分,并首先将页面的数据从磁盘加载到该内存中。 (同样,此内存地址与程序请求的原始内存地址没有任何关联。)

    如果没有任何空内存来拉取页面,操作系统首先必须将一些数据从内存中移出并进入页面文件。它试图智能地确定哪个内存在不久的将来最不可能使用。但有时候你最终会在内存被交换到磁盘后不断被请求,只能替换程序要求的下一块内存。这种“颠簸”导致计算机内存不足的情况真的,真的慢,因为磁盘访问比内存访问慢几个数量级。