4

我所知道的是,虚拟内存的大小仅受地址线数量的限制。但是在William Stallings 的操作系统内部和设计原则中,我读到虚拟内存也受到辅助内存大小的限制。
1.如何?
2.交换(在主内存和辅助内存之间)是虚拟内存的必要条件吗?我的意思是,如果不允许交换,那么我们仍然可以将其称为虚拟内存,尽管好处会受到限制吗?
然后我有几个基于答案的后续问题。

编辑:


我想我一定引用了书中的原话:

一种存储分配方案,其中辅助存储器可以像主存储器的一部分一样被寻址。程序可以用来引用内存的地址与内存系统用来识别物理存储站点的地址不同,程序生成的地址会自动转换为相应的机器地址。虚拟存储的大小受计算机系统的寻址方案和可用辅助存储器的数量限制,而不是受主存储位置的实际数量限制。

在“虚拟内存”和“虚拟存储的大小”中是否存在某种文字游戏?

4

2 回答 2

3

虚拟存储的大小受计算机系统的寻址方案和可用辅助存储器的数量限制,而不是受主存储位置的实际数量限制。

这本书似乎(错误地)假设您不会分配您不打算使用的虚拟内存。因此,它警告用于交换的物理内存和硬盘限制了可用的虚拟内存(当然,从您的进程的角度来看,对该资源池的其他需求 - 操作系统和其他进程也是如此)。

在实践中,分配比实际使用更多的虚拟内存通常很有用,因为您可能想要,例如:

  • 将虚拟内存用于稀疏数组,您可以在其中直接索引到一些分散的地址,
  • 当系统资源实际耗尽时,让页面错误失败,而不是通过尝试跟踪可用内存(请记住,这与其他进程等动态)或悲观限制来使您的代码复杂化,这意味着您无法积极利用您的系统功能
  • 让每个程序都能享受到相信它已被加载到编译它的地址的好处,因此它可以使用绝对地址来进行跳转指令等,而不是相对地址

将其与您的具体问题联系起来:

1.【虚拟内存也受二级内存大小限制】怎么办?

同样,它在某种意义上是有限的,即当内存(物理和交换)耗尽时尝试使用更多将失败。

2.交换(在主内存和辅助内存之间)是虚拟内存的必要条件吗?

这有点模糊......虚拟内存只能通过交换物理内存内容为新的内存需求腾出空间来增加内存进程可以透明地使用的内存总量,并从辅助内存重新加载换出的内容。但是,即使没有交换磁盘空间(因此没有交换),或者您还没有足够的内存需求来进行任何交换,进程仍然可以根据稀疏数组、巨大的堆栈/堆区域从虚拟寻址中受益有按需增长的空间等。

我的意思是,如果不允许交换,那么我们仍然可以将其称为虚拟内存,尽管好处会受到限制吗?

也许。您仍然可以从虚拟寻址中受益,但这取决于您采用的术语是否将其归类为虚拟内存:有一个合理的论点认为“虚拟内存”意味着您假装拥有更多的物理 RAM,因此如果没有交换,您将不会即使您可能正在使用支持虚拟内存的虚拟寻址组件,也不符合条件。

于 2011-04-13T04:09:02.643 回答
2

关于书摘,我可以看到你困惑的根源。我不得不通读几遍才能看到他在说什么。更清晰的解释可能是:虚拟内存是一种抽象,它允许程序分配内存而不受其运行系统的物理约束的干扰。程序天真地访问虚拟内存;抽象(虚拟内存)区分直接映射到物理位置的虚拟内存位置和映射到辅助内存位置的虚拟内存位置。或者,它可以映射到任何地方,并且您手上有一个段错误。

2 号肯定不是真的。虚拟内存就在那里,“可供”程序使用,无论它是否有物理支持。当他说有限...可用的辅助内存量时,我不太理解那部分。当然可以设计一个具有 100 千兆地址空间的虚拟内存层,这样就很好了。

如果我为了清晰而交换正确性,那么道歉。我的解释不是很学术,听起来你在学校,但你去了。无论如何,希望这会有所帮助。

-tjw

于 2011-04-13T03:43:13.450 回答