![逻辑内存和虚拟内存有什么区别和关系?](https://linux22.com/image/1285176/%E9%80%BB%E8%BE%91%E5%86%85%E5%AD%98%E5%92%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%E5%92%8C%E5%85%B3%E7%B3%BB%EF%BC%9F.png)
我想知道逻辑内存和虚拟内存之间有什么区别和关系?它们的用途有何不同?
逻辑地址和虚拟地址的联系和区别是否相同?
答案1
首先让我们来看一下虚拟寻址和逻辑寻址之间的区别。我认为区别在于“逻辑地址”意味着程序看到的地址与存储在 RAM 中的数据的物理地址不同。
如果您有虚拟内存,则可能根本没有物理地址,因为存储的数据可能会被交换到磁盘。但是,有可能有一个没有虚拟内存的系统,其中逻辑地址与物理地址不同,但每个逻辑地址都映射到一个物理地址。这将使运行多个程序变得更容易,而不会让它们相互干扰,但不会让程序使用比系统可用的物理内存更多的内存。
因此,计算机中没有单独的“逻辑内存”,尽管我想您可以说具有逻辑地址但没有虚拟内存系统的计算机具有逻辑内存系统。我只想说逻辑内存是通过某种间接方法寻址的内存。您想到了某种特定的计算机系统吗?
--
考虑到您的意见:
同一物理内存的逻辑地址可以相同或不同。通常两个进程不会访问同一内存,因为一个进程可能会破坏另一个进程。但是,如果它们安排使用某种形式的共享内存,它们通常会将该共享内存映射到不同的地址。虚拟地址或多或少是一种逻辑地址,因此如果您的操作系统支持 VM,并且两个进程映射共享内存,它们通常会将该内存视为位于不同的地址,就像没有虚拟内存一样。
至于您对逻辑和虚拟目的的理解,虚拟内存是使用硬盘来扩展程序可用的内存。逻辑寻址的用途不仅限于进程分离,但这是一个主要用途。
答案2
进程使用“逻辑”内存地址来引用其代码和数据。从逻辑地址到物理地址的转换取决于内存模型。
当内存直接映射(即实模式)时,逻辑内存地址与物理内存地址完全相同。
如果物理内存大于处理器的地址空间(例如在 16 位处理器上),则通常使用内存库硬件来扩展可用的物理内存量。Intel 8086/8088 处理器使用灵活的部分寄存器而不是固定的存储体方案。将 (16 位) 逻辑地址转换为 (20 位) 物理地址将使用存储体映射表。对于 x86,逻辑地址可能包括段寄存器的规范。
如果物理地址范围大于典型物理内存(例如十年前的 32 位处理器),则使用虚拟内存硬件来提供对完整地址范围的使用。逻辑地址由物理内存按需支持。为了容纳完整的虚拟/逻辑地址空间和/或为每个进程提供自己的地址空间,后备存储需要保存虚拟内存的交换副本。交换的内存可以按段或页或分段页组织。
顺便说一句,在我多年的 Unix 内核黑客生涯中,我很少听到或使用短语“逻辑(内存)地址”。如果您指的不是物理内存地址,那么它就是虚拟地址。也就是说,“逻辑地址”==“虚拟地址”(当虚拟内存在 MMU 中激活时)。