7

我对这些问题感到非常困惑。

  1. 在 32 位处理器上,每个进程都有 4 GB 的虚拟内存。但是,如果每个进程都有 4gb 的空间,那么如果有 100 个进程正在运行,这将是每一个巨大的空间——这大于交换区域。有人可以解释一下吗?我很迷茫。

  2. 操作系统如何为进程分配内存?假设一个进程有a = malloc(2)。谁将把这块内存分配给进程?操作系统会将这些 2 字节内存分配给进程吗?
    (我们访问 a[2] 它会产生分割错误)。

  3. 进程的不同部分(代码、数据、堆栈、堆)在主内存或辅助内存中的位置。

请给我一些好的链接,以便我也可以理解虚拟内存及其整个机制,因为我找到的链接并没有完全解释虚拟内存。

4

4 回答 4

3
  1. 谁在乎虚拟内存是大于还是小于交换区?这有什么区别?(例如,如果您以只读方式映射 2GB 文件,该文件使用 2GB 虚拟内存,但不需要交换空间,只需要少量物理内存。)

  2. 操作系统只是扩展进程的虚拟内存空间。这只是更改会计分录。在尝试修改地址空间的内容之前,不需要物理内存。(实际上,该进程可能会自己执行此操作,仅在需要更大的块时才要求操作系统扩展其虚拟内存空间。)

  3. 它们保留在物理内存中(假设它们一开始就出错了),直到操作系统选择将它们移动到其他地方或丢弃它们。如果它们被移到别处或被丢弃,它们会在通过页面错误访问时被调回或重新创建。(操作系统将物理内存作为宝贵的资源进行管理,按照它认为最好的方式授予它。)

顺便说一句,在大多数 32 位操作系统上,操作系统本身占用 1GB 或 2GB 的虚拟内存空间,进程真正可用的只有 2GB 或 3GB。在 64 位操作系统上,操作系统不占用任何空间,因此完整的 4GB 可用于 32 位进程。

于 2012-07-24T07:06:02.523 回答
2

1) 每个进程有 4gb 的虚拟内存空间,但不需要一次全部分配。操作系统向MMU指定物理内存的哪些部分映射到其虚拟空间,哪些部分根本不映射。访问未映射的部分会导致处理器出现故障,操作系统通常会产生段错误。还有一个“不存在”的标记,它告诉处理器内存区域不在物理内存空间中,而是在交换空间中,因此处理器发生故障,操作系统将页面交换回物理内存,然后恢复它停止的过程。要描述一个进程页表,您只需要几个字节的内存,因此 100 个进程在实际请求之前不会使用那么多内存。

2)内存分配算法很多。通常操作系统一次只分配大块内存,因此对 malloc() 的调用有时只会导致对操作系统的调用,但大多数时候是 C 标准库实现细节处理微管理。不能保证超出数组范围的访问会产生 seg 错误,因为它可能是之前 malloc'ed 的不同数组的一部分,或者是标准库为将来跟踪的可用空间的一部分分配,因此不会出现段错误。然而,像 valgrind 这样的调试工具可以检测到此类错误。

3)每个段的具体位置取决于操作系统,但对于通用和可移植的代码,无需知道。

有关所有这些主题的更多信息,请查阅osdev wiki,特别是关于分页内存分配的部分。

于 2012-07-24T13:18:12.030 回答
0

第一:32bit表示32bit。没有更多的位来寻址更多的内存空间。多处理器系统不是新发明。使用 32 位,您只能处理 4gigs 空间。有一些解决方法,例如 PAE http://en.wikipedia.org/wiki/Physical_Address_Extension

第二和第三..我不太确定今天它是如何工作的。但是看看http://en.wikipedia.org/wiki/Virtual_memory

于 2012-07-24T07:10:05.300 回答
0

您的一个严重误解是虚拟内存和内存之间的区别。从进程 POV 来看,没有区别,进程只访问内存,而操作系统负责在物理 (RAM) 和虚拟内存之间交换部分数据。

1)一个进程的地址空间可以达到4GB并不意味着每个进程都分配了4GB。操作系统根据需要为它们分配内存。

2) 操作系统以块为单位提供内存 (*1)。当您执行 malloc 时,管理程序内存的 malloc 函数在内部获取进程内存中所需的空间并返回指针(可能在进程中他们向操作系统请求额外的内存,但这不是必需的)。

3)从一开始,这是一个操作系统问题。每个操作系统都可以决定他们对哪些部分进行虚拟化,哪些部分不进行虚拟化,其中涉及减少交换次数的复杂策略。

*1 请注意,我谈论的是内存,而不是 VM。应用程序不知道其内存的哪些部分是虚拟的或物理的,它对它们是透明的。

于 2012-07-24T07:17:55.297 回答