C 为什么64位机器上存在内存碎片问题?

C 为什么64位机器上存在内存碎片问题?,c,memory-management,memory-fragmentation,C,Memory Management,Memory Fragmentation,在32位机器中,每个进程获得4GB虚拟空间。在这种情况下,人们可能会担心,由于碎片化,我们可能会面临麻烦。但是在64位机器的情况下,理论上我们有一个巨大的可寻址虚拟内存,那么为什么在64位机器中内存碎片仍然是一个问题(如果是的话)

在32位机器中,每个进程获得4GB虚拟空间。在这种情况下,人们可能会担心,由于碎片化,我们可能会面临麻烦。但是在64位机器的情况下,理论上我们有一个巨大的可寻址虚拟内存,那么为什么在64位机器中内存碎片仍然是一个问题(如果是的话)
在某些情况下,虽然这并不重要,但在这里或那里使用额外的兆字节并不会让您丧命,但在更大的应用程序中,这一切都会累加起来。这取决于这样一种情况,即根据您正在编写的代码或项目的目标,尽可能少的碎片是否重要。

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

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


理论上,您可以想象虚拟地址1000000和2000000将映射到物理内存的同一页,从而避免碎片。但在实践中,出于充分的理由,虚拟内存映射是逐页进行的。您可以在这里阅读更多信息:。

但是“内存碎片”呢?对此的回答可能包括malloc、操作系统和硬件如何分配和映射虚拟内存…@pst我所理解的问题只是问后果,而不是它最初是如何发生的(尽管我可能读错了)。这不是64位操作系统上的问题。这不是答案吗?现有的答案似乎暗示这在64位中是一个问题,因为64位有一个疯狂的虚拟地址空间。这些都不重要吗?除非你有TB的ram,并继续使用50TB的内存进行此操作?请仔细阅读:它解释了当你有碎片时物理页会被浪费的原因。是的,但问题是“为什么内存碎片在64位机器上是一个问题?”所以答案的开头应该是“不是”?您没有抓住要点:64位机器上的内存碎片问题与32位机器上的内存碎片问题一样严重。位的数量决定了虚拟地址空间的可能大小,而内存碎片的危险在于浪费物理内存(64位机器上的物理内存和32位机器上的物理内存一样有限),在Windows上,我认为这只是虚拟地址空间过于分散的问题,在64位上这几乎是不可能的