5

在 32 位 Linux 系统上,一个进程最多可以访问 4 GB 的虚拟地址空间;然而,在保留任何这些方面,流程似乎在不同程度上是保守的。因此,使用 malloc 的程序偶尔会通过系统调用 sbrk/brk 来扩展其数据段。甚至这些页面还没有在物理内存中声明。我不完全理解的是为什么我们首先需要 sbrk,为什么不给我 4 GB 地址空间以避免任何 sbrk 调用,因为在我们触摸/声明这些块之前,它本质上是一个免费操作,对吗?

4

2 回答 2

5

如果您对文件进行内存映射(在 Linux 下很常见),会发生什么?它必须位于地址空间中的某个位置,因此必须有一些方法来定义“使用”和“未使用”部分。
共享内存(实际上只是映射没有实际文件的文件)是相同的。它必须去某个地方,并且操作系统必须确保它可以放置它而不会覆盖某些东西。

此外,出于明显(和不太明显)的效率原因,最好保持参考的局部性。如果您被允许在您的地址空间中的任何位置写入和读取,您可以打赌有些人会这样做。

于 2012-04-25T09:42:17.860 回答
4

我想到了几个原因:

  • 访问未映射的内存时不再出现段错误
  • 翻译后备缓冲区( TLB) 会更大,可能需要更多时间来设置它
  • 如果您在新的共享库或 mmap() 中加载某些内容,则无论如何都必须取消映射其中的一些内存
于 2012-04-25T09:45:26.557 回答