2012-04-25 113 views
5

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

回答

5

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

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

+0

“共享内存(这其实只是一个映射文件,而无需实际的文件)是一样的。它必须去某个地方,操作系统必须确保它可以放置它,而不会覆盖某些东西。“我明白你说的(我认为),因为malloc调用mmap(匿名和私有),我相信并且可能或可能会不要调用sbrk,但是如果在程序中,init malloc已经完成了brk(4GB),它将系统调用删除到sbrk等等。但是你不能再映射额外的内存映射文件或者用不同的标志创建共享内存。我开始明白 – 2012-04-25 09:51:28

+0

“另外,为了明显(并且不太明显)的效率原因,最好保持参考的位置。”但是如果我从1gb中取出一些内存到4gb块中并将3.9gb放入4gb块中,它可能会一旦新鲜的分配是seg故障(刚刚清零的权利),在物理记忆中关闭? – 2012-04-25 09:52:55

+0

它可能,它可能不会,你不知道。 – Damon 2012-04-25 10:30:01

4

有一对夫妇的浮现在脑海中的原因:

  • 你会不再得到段错误访问映射的内存
  • Translation lookaside buffer(TLB)时将更大,可能需要更多的时间来进行设置高达
  • 你不得不如果你在一个新的共享库或MMAP加载取消映射一些内存反正()的东西