c - 为什么内存碎片是 64 位机器上的一个问题?

标签 c memory-management memory-fragmentation

在 32 位机器中,每个进程都有一个 4GB 的虚拟空间。在这种情况下,人们可能会担心我们可能会因碎片化而遇到麻烦。但是在 64 位机器的情况下,理论上我们有一个巨大的可寻址虚拟内存,那么为什么内存碎片在 64 位机器中仍然是一个问题(如果是)?

最佳答案

您尝试访问的每个虚拟地址都由操作系统映射到物理内存。物理内存按页分配(例如 4K 大小)。如果您设法在偏移量 1000000*n 处分配一个字节,并为从 1 到 1000000 的 n 执行此操作(我认为您可以使用 mmap 执行此操作),那么操作系统将不得不用一百万来支持它pages 物理内存,大约 4G。该物理内存将无法用于其他任何用途。如果您连续分配了字节,那么您的百万字节只需要大约 1M 的物理内存(256 页)。

如果您出于正当理由分配 4G,然后取消分配其中的一部分,保留分配的每个页面的一部分,您可能会遇到类似的糟糕情况。操作系统实际上无法将释放的内存重新用于其他用途,因为没有完全空闲的物理页面。所以这是一个碎片化问题。

理论上,您可以想象虚拟地址 1000000 和 2000000 将映射到物理内存的同一页,从而避免碎片化。但实际上,出于充分的理由,虚拟内存映射是逐页完成的。您可以在这里阅读更多相关信息:http://en.wikipedia.org/wiki/Page_table .

关于c - 为什么内存碎片是 64 位机器上的一个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8542601/

相关文章:

c - 调用strcat()时如何使用malloc?

c - 具有多个字符数组问题的结构

c - 编写 C 动态库 [DSOs] 的良好实践(二进制兼容性 + 内存管理)

c++ - 哪种内存分配算法最适合性能和时间要求严格的 C++ 应用程序?

.net - System.Threading.OverlappedData 导致大量内存碎片(异步等待)

C程序奇怪的输出和错误的输出

objective-c - Obj-C __block 变量保留行为

c++ - 将 operator new 和 operator delete 与自定义内存池/分配器一起使用

c# - 一次构建一个大字符串并将其传递给 response.write 或为每个片段调用 response.write 是否更有效

c - 初始化数组中的结构