在32位Linux系统上,一个进程最多可以访问4 GB的虚拟地址空间;但是,进程似乎在不同程度上保守地保留了这些空间。因此,使用malloc的程序偶尔会通过syscall sbrk/brk来增加其数据段。即使是那些页面也还没有在物理内存中声明。我不完全理解的是为什么我们首先需要sbrk,为什么不给我4 GB的地址空间来避免任何sbrk调用,因为在我们接触/声明这些块之前,它本质上是一个免费的操作对吧?
发布于 2012-04-25 17:42:18
如果对文件进行内存映射会发生什么(在Linux下这是一件很常见的事情)?它必须位于地址空间中的某个位置,因此必须有某种方法来定义“已使用”和“未使用”部分。
共享内存(实际上只是映射一个文件,而不是实际的文件)是相同的。它必须到某个地方,并且操作系统必须确保它可以在不覆盖任何东西的情况下放置它。
此外,出于明显的(和不明显的)效率原因,最好保持引用的局部性。如果允许您只对地址空间中的任何位置进行写入和读取,您可以打赌有些人会这样做。
发布于 2012-04-25 17:45:27
有几个原因浮现在脑海中:
当你访问未映射的内存时,你将不再得到段错误
,无论如何你都必须取消其中一些内存的映射
https://stackoverflow.com/questions/10312893
复制相似问题