【问题标题】:What is the difference between virtual address space and virtual memory?虚拟地址空间和虚拟内存有什么区别?
【发布时间】:2021-09-11 19:03:08
【问题描述】:

当用户创建一个进程时,会创建一个虚拟空间地址,对于 32 位操作系统(0 到 2^32-1),它的大小为 4g?进程认为它有整个内存可供使用,但虚拟地址被转换为物理地址并存储在进程的页表中。 我很困惑虚拟内存是什么?和虚拟地址空间一样吗?

【问题讨论】:

  • 这里没有混淆,尽管有些人将磁盘交换的 RAM 也称为“虚拟内存”。
  • 可能不是你要问的,但“虚拟内存”这个词被草率地使用了。这可能意味着两件事:要么通过配置 MMU 设置虚拟寻址,要么使用桌面操作系统中的交换文件将当前 RAM 的部分存储在硬盘驱动器上。
  • 虚拟地址空间包括映射和未映射区域。只有映射的区域算作虚拟内存(但可能根本不是内存——例如,如果硬件寄存器映射到虚拟地址空间)。
  • @IanAbbott 那么当一个进程被创建时,只有在主内存中加载的块(块大小=页框大小)是虚拟内存?其他未使用的块仍在硬盘或二级存储中,仍未映射到物理内存?
  • @Lundin Ya,你是对的,它令人困惑的不同书籍使用不同的术语。

标签: operating-system cpu-architecture virtual-address-space


【解决方案1】:

虚拟地址空间和虚拟内存有什么区别?

虚拟地址空间实际上是空间(就像后院棚子是存储空间一样)。

虚拟内存是您可以放在虚拟空间中的东西(就像园艺工具是您可以放在后院棚子里的东西一样)。

您还可以将部分虚拟地址空间留空/未使用;或者在虚拟地址空间中放置一些不像内存的东西(例如内存映射设备)(就像你可以让后院棚子的一部分空着,或者把不是园艺工具的东西放在棚子里) .

举一个更完整的例子;假设您有一个 32 位系统,并且虚拟地址空间为 4 GiB 或 4096 MiB。这 4096 MiB 的空间可以拆分为进程可以使用的 3072 MiB 的“用户空间”和为内核本身保留的 1024 MiB 的“内核空间”。在这种情况下,它可能会像这样结束:

  • 进程用于虚拟内存的 1024 MiB 空间

  • 进程未使用的 2048 MiB 空间(并且不是虚拟内存)

  • 内核用于虚拟内存的 128 MiB 空间

  • 内核用于内存映射设备(不是虚拟内存)的 32 MiB 空间

  • 864 MiB 的空间未被内核使用(并且不是虚拟内存)

在这种情况下;您总共将拥有“1024 + 128 = 1152 MiB”的虚拟内存(以及“2048 + 32 + 864 = 2944 MiB”的非虚拟内存空间)。

【讨论】:

  • 嘿,我实际上没明白。在书中我读到虚拟地址空间是操作系统给每个进程的空间。
  • @warmiccoder:如果一个进程被分配了 4 GiB 的(虚拟地址)空间,它可能会使用 1 GiB 的虚拟内存(并且有 3 GiB 的未使用空间不是虚拟内存)。
  • @Brenden 栈和堆会根据进程需要增长吗?是这样吗?
  • 堆会增长(当你用完虚拟内存时,它会向操作系统询问更多)。堆栈可能是固定数量的虚拟内存,其中堆栈使用的虚拟内存量是恒定的,但堆栈实际使用的数量会有所不同。
  • 一个进程可能有多个堆栈。
猜你喜欢
  • 2019-07-03
  • 2023-03-17
  • 2016-10-05
  • 2011-06-25
  • 2018-07-09
  • 1970-01-01
  • 2020-11-09
  • 2014-01-16
  • 2021-07-25
相关资源
最近更新 更多