虚拟内存和物理内存

5
我正在学习《操作系统概念-Abraham Silberschatz和Galvin》中的内存管理单元(MMU)概念。虽然到第8章为止一切都很顺利,但是一旦开始学习第9章,事情就开始变得混乱了。
我不清楚我的虚拟内存是什么?物理地址和逻辑地址现在似乎也有点混淆了?虚拟内存在现实中是否存在?
根据我的理解,我的系统RAM就是我所说的物理(或主)内存。我有8GB RAM和64位操作系统。因此,我的RAM可以容纳2^64-1个地址。这就是我所说的物理地址空间吗?那么逻辑地址空间到底是什么?
每个进程必须在主内存中才能执行,否则它将驻留在硬盘上。给定指令的地址是否是我所说的逻辑地址,因为代码位于硬盘上?当它被加载到RAM中时,由于位置不固定,因此代码可以加载到任何地方,这里(RAM)分配的地址称为物理地址。我想这种映射被称为逻辑-物理地址映射。
现在,因为我的代码或进程的大小可能比可用的RAM的大小要大,因此需要使用虚拟内存。据我所了解,它是一种抽象,为程序员提供了一个视图,使他觉得系统上有无限的内存可用。它基本上是硬盘上的一个区域,其中从RAM中交换出一些很少使用的进程。同时,所需的页面被带到主内存中。是这样吗?那么是什么决定了硬盘上此区域的大小?RAM很便宜,为什么我们需要这样的机制?我们不能增加RAM大小而不包括这种交换开销吗?
我在网上搜索了很多,但没有找到这些术语的确切定义和区别。请帮帮我!
谢谢

从谷歌搜索您的标题返回的“约10,600,000个结果”中没有一个有用吗? - Martin James
可能是虚拟内存和物理内存有什么区别?的重复问题。 - Martin James
@MartinJames 是的,他们是这样的,但某些术语必须明确提及以进行解释。这就是为什么在我理解每个问题后,我都会问自己是否理解正确的原因。 - user3552407
3个回答

14
我不清楚我的虚拟内存是什么?同时,物理和逻辑地址似乎很混淆?它(虚拟内存)到底存在于现实中还是不存在?
您可以阅读维基百科上关于虚拟内存的解释。我这里不会讨论全部内容。
是的,虚拟内存是存在于现实中的。它将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址。进程或任务看到的主存储器似乎是一个连续的地址空间或连续的段集合。
虚拟内存的主要好处包括使应用程序无需管理共享内存空间、由于内存隔离而增加安全性以及能够在概念上使用比物理上可用的更多内存,使用页面技术。
感谢David Schwartz帮助我改进内容。但是,在嵌入式设备中,虚拟内存仅用于页面映射,这是其定义的本来目的。但是,在现代操作系统中,它已经采取了完全不同的形式。人们正在利用虚拟内存在分页/分段中的使用,因此交换是最重要的。
额外的内存区域现在也被称为交换区或交换分区,通常由操作系统(Unix/Linux)保留用于将进程从主内存中调入和调出。Windows 有页面文件来实现相同的功能。
我有8GB RAM 和64位操作系统。因此,我的RAM可以容纳2^64-1个地址。这就是我所说的物理地址空间吗?
你应该在这里谈论处理器,而不是直接涉及操作系统或RAM。原则上,64位微处理器可以寻址16 EiBs(16 × 2^60字节)的内存。实际上,它比这少。这些内存是你可能可以用作RAM的内存。
另外,什么是逻辑地址空间? 逻辑地址空间 是指从执行应用程序的角度看,物品(内存单元、存储元素、网络主机)所在的地址空间。
逻辑地址可能会因地址映射或转换功能的操作而不同于物理地址。在计算机内存架构中,这种映射功能可以是位于CPU和内存总线之间的内存管理单元(MMU),也可以是位于硬件和计算机网络系统中互联网协议(Internet Protocol)的地址转换层,例如数据链路层。

在支持虚拟内存的系统中,直到尝试访问时,实际上可能没有任何物理内存映射到逻辑地址。访问将触发操作系统的特殊功能,重新编程MMU以将地址映射到一些物理内存,可能会将该内存的旧内容写入磁盘,并从磁盘读回内存应该包含的内容以获得新的逻辑地址。在这种情况下,逻辑地址可能被称为虚拟地址。

每个进程必须在主内存中执行,否则它位于硬盘上。我的代码指令所分配的地址是否是指在硬盘上驻留的逻辑地址?当它加载到RAM中时,由于位置不固定,因此代码可以加载到任何地方,因此在这里(在RAM中)分配的地址称为物理地址?我认为这种映射被称为逻辑物理地址映射。

现今,几乎所有系统都支持虚拟内存(有几个例外)。因此,当你的进程被交换出RAM以便其他进程能够执行时,它们会单独保存在被称为虚拟内存的硬盘保留部分中。而且,虚拟内存有一个寻址方案,也就是所谓的逻辑地址。
页面表用于将应用程序看到的虚拟地址转换为硬件用于处理指令的物理地址;处理这种特定翻译的硬件通常被称为内存管理单元。页面表中的每个条目都包含一个标志,指示相应的页面是否在真实内存中。如果它在真实内存中,页面表条目将包含页面存储的真实内存地址。
由于我的代码或进程的大小可能大于可用RAM的大小,因此就需要使用虚拟内存。据我理解,它是一种抽象,给程序员提供了在系统上有无限量的内存的视图。它基本上是从RAM中交换出来的一些进程(很少使用)的硬盘区域。同时,所需的页面被带入主内存。是这样吗?那么是什么确定了硬盘上这个区域的大小呢?

与上述描述完全相同。不同类型的操作系统建议保留硬盘空间(虚拟内存)的大小不同。但是,通常在Unix / Linux操作系统上将其定义为不同的分区(交换分区)。 Windows有页面文件与*nix的交换分区相比;尽管两者之间存在许多技术差异...这是特定于操作系统的,但概念几乎相同。在*nix系统中,我看到建议将交换分区的大小保持为系统中RAM大小的两倍。我无法更多地争论这一点,也许有人可以提出更详细的建议。

此外,RAM很便宜,那么为什么我们需要这样的机制?我们不能增加RAM的大小,而不包括交换的开销吗?

不,与内存的价格相比,硬盘的价格仍然更加经济实惠。此外,内存很昂贵,并非所有计算机都可以升级以增加内存。幸运的是,当您的内存不足时,增加虚拟内存是最好的选择。此外,Microsoft建议将虚拟内存设置为不少于计算机内存量的1.5倍,不多于3倍。( 最后一行的来源 )。


1
如果有人发现了什么变化,请为我纠正。我打得太匆忙了。感谢您阅读答案... - Am_I_Helpful
当您的进程从RAM中交换出来以便其他进程可以执行时,它们会被单独保存在硬盘保留部分称为虚拟内存的区域中。这是不正确的。虚拟内存和交换空间是不同的东西,您可以在没有交换空间的情况下拥有虚拟内存(许多嵌入式设备),也可以在没有虚拟内存的情况下拥有交换空间(交换空间存在于虚拟内存之前)。 - David Schwartz
@user3004790-并不完全像David在他的答案评论中所提到的那样,实际上,有方法可以在不使用额外空间的情况下减少页面错误。但是,请相信我,分页/分段/交换——所有这些都只能通过这个硬盘来实现。如果不使用硬盘,这是不可能发生的。因此,您可以放心地假设这一点。我还建议您浏览一遍维基百科文章。 - Am_I_Helpful
@user3004790-交换空间的访问时间比物理内存慢。请查看来自Redhat的链接,交换空间的优点超越了快速可访问的RAM。虚拟内存是由内核管理的额外空间,以允许交换等操作。它甚至可以在系统保留的空间下。然后就可以没有分页/分段/交换等操作。但是,这只适用于小型设备。减少页面错误是创建OS虚拟内存的基本原因。 - Am_I_Helpful
@user3004790- 我已经大大改善了我的回答,尤其是第一和第二段。请再次查看以了解这些变化。如果您有任何疑问,请告诉我... - Am_I_Helpful
显示剩余3条评论

3
据我理解,这是一种抽象概念,旨在让程序员感觉系统上有无限量的可用内存。
基本上是正确的。
它基本上是硬盘上一些进程(很少使用)从RAM中交换出来的区域。
不,那是页面或交换,与虚拟内存几乎没有任何关系。你可以有交换和页面而不需要虚拟内存(事实上,历史上交换出现得更早)。你可以有虚拟内存而没有页面或交换(像许多嵌入式设备一样)。
虚拟内存是许多现代操作系统用于实现分页/交换的方式,但虚拟内存的本质与分页或交换没有任何关系。
此外,内存很便宜,为什么我们需要这样的机制呢?我们不能增加RAM大小,而不是包括这种交换的开销吗?
内存并不便宜,我们不希望浪费它来保存可能永远不会被访问的数据。例如,考虑计算机启动时启动的所有服务。每个服务加载一些代码到内存中,并占用一些RAM来保存其结构。其中许多服务将不运行数天,甚至从未运行过。您真的希望所有这些东西永远占用RAM吗?

SIR,请查看此已接受的答案,https://dev59.com/lm445IYBdhLWcg3wO3xu#4970555。`交换空间是虚拟内存中位于硬盘上的部分,在RAM已满时使用`。 - Am_I_Helpful
这并不是说虚拟内存是硬盘的一部分,而是说交换空间是。当然,这只适用于通过虚拟内存实现交换的操作系统。 (其他答案有助于澄清被接受的答案为何令人困惑。) - David Schwartz
1
你可以通过仅丢弃干净页面(保存磁盘上数据未修改副本的页面)来实现分页,而无需额外的硬盘空间。但我不确定你为什么要问这个问题。是的,分页或交换涉及在RAM和大容量存储之间移动数据,一些操作系统使用虚拟内存来实现它,尽管你可以有一个而没有另一个。虚拟内存的本质与分页或交换无关,虚拟内存通常用于实现分页/交换。 - David Schwartz
是的,先生,我同意最后一点。它与它们完全没有关系,但它仅用于实现这些事情。为了改善页面错误,减少较少的主存储器使用。但是,我不知道现代操作系统如何不使用交换(*nix)/页面文件(Windows)来实现它!如果您认为我仍然是错误的,请 enlighten 我。谢谢。 - Am_I_Helpful
让我们在聊天中继续这个讨论 - Am_I_Helpful
显示剩余5条评论

1
我正在学习Abraham Silberschatz和Galvin所著的《操作系统概念》中的Memory Management Unit(MMU)概念。尽管一直到第8章都还好。
物理内存是系统上实际的硬件内存。逻辑内存是线性内存地址映射到物理内存的独立于物理内存地址的映射。逻辑内存为系统提供了基本的安全性。每个进程都有自己的逻辑地址空间,通常分为用户空间和系统空间。在用户空间中,相同的逻辑地址通常映射到不同的物理地址。在系统空间中,相同的逻辑地址映射到相同的物理地址。
因此,我的RAM可以容纳2^64-1个地址。这就是我所说的物理地址空间吗?那么逻辑地址空间究竟是什么?
那就是逻辑地址空间。虚拟地址可以与逻辑地址空间相同,但通常受操作系统通过系统参数或进程配额的限制而更小。

虚拟内存:逻辑地址到物理内存的映射是在软件中模拟的。每个逻辑内存页面映射到磁盘空间块。逻辑地址可能引用实际的物理内存地址,也可能不引用。

每个进程必须在主存储器中才能执行,否则它将驻留在硬盘上。给予我代码指令的地址是否就是我所说的逻辑地址?

差不多。当您访问一个逻辑内存地址并且它没有被映射到内存中时,它会触发一个页面错误(可重启指令)。操作系统的故障处理程序会被调用(通常使用与处理除零或中断相同的方法)。该处理程序尝试从磁盘加载内存。

当程序启动时,它会频繁出现页面错误,然后通常趋于稳定。

当它加载到RAM中时,因为位置不固定,因此代码可以加载到任何地方,这里(RAM)分配的地址称为物理地址吗?

当页面加载时,它会加载到物理地址。操作系统设置进程页面表以便将逻辑地址映射到正确的物理地址。

虚拟内存是存在于现实中还是不存在?

是的。尝试运行具有8GB内存和4GB用于Windoze模拟器的Mac。您将很快耗尽物理内存。

此外,RAM很便宜,那么为什么我们需要这样的机制呢?我们不能增加RAM大小而不包括交换的开销吗?

在32位虚拟内存和8MB物理内存的旧日子里,虚拟内存至关重要。在20世纪80年代初,8MB内存需要一个冰箱大小的柜子。在未来,随着你所说的,内存变得便宜,虚拟内存可能会完全消失。

我预计,当我们开始在基于磁盘的操作系统(例如,eunuchs和Windoze)中看到TB内存时,它将消失无踪。

据我所知,这是一种抽象,让程序员认为他在系统上有无限数量的可用内存。

那就是逻辑内存。虚拟内存是对逻辑地址空间的一部分进行模拟。在32位系统上,用户空间可能有2^31个逻辑地址。但是,系统可能会限制您使用2^20个(选了一个数字)虚拟地址。

基本上,它是硬盘的一个区域,用于交换来自RAM的一些(很少使用的)进程。
不,所有进程必须为其所有内存提供磁盘备份。磁盘空间(页面文件、交换分区)的大小限制了可用虚拟内存的数量。
那么是什么确定了硬盘上该区域的大小?
通常需要与虚拟内存一样多的磁盘空间。

我不知道你在描述什么系统。批处理系统? - user3344003

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接