一般在内核术语中的“碎片”都是基于物理内存而言的,我没有太看懂你得出碎片是针对地址空间这个结论的逻辑。但我认为,既然你知道了malloc是用户空间调用的,那么你所谓的碎片也是从用户空间的视角而言的,但对于用户空间,看到的只有地址空间,其访问的所有地址都是要经过页表的转换后才访问的物理页面,而且malloc分配的地址空间一定的连续的,那么这个所谓的碎片对于用户空间也就没有任何意义了。不知道你纠结的这个“碎片”在你心目中到底是什么意义,另外,你说的“如果地址空间都不连续就更谈不上物理空间连续”,这个逻辑也是有问题的,地址空间和物理空间没有这种所谓的联系。物理空间连不连续,是内核在管理物理内存的时候要考虑的,跟用户空间完全没有关系,在用户态的视角,只看到地址空间就足够了。
我的意思不是强调虚拟地址的连续性和物理地址连续性的关系,而是说在堆里面,如果不存在一块能够满足用户malloc要求的连续地址,那么malloc就会失败,就更谈不上去获取一块连续的物理内存了。我的观点malloc中的碎片是基于虚拟内存就是基于这一点的。。。
> 如果不存在一块能够满足用户malloc要求的连续地址,那么malloc就会失败,
这句话没问题。
> 就更谈不上去获取一块连续的物理内存了。
这个“就更谈不上”的连词有问题,因为后者跟前者之间没有任何关系,这种表述就有问题了,你的言下之意就是:如果malloc成功了,那么,就可能谈得上去获取一块连续的物理内存了。这种说法是有问题的,你还是没有理解用户态跟连续物理内存间没有关系的意义。即使用户态分配的连续地址空间,经过缺页异常后获取的物理页面恰好是连续的,这也是没有谈论的意义的,物理地址连不连续对用户空间没有任何影响,也不是用户空间可以左右的。
个人认为没必要把碎片这个词明确界定到是物理地址空间还是虚拟地址空间。提到内存碎片,主要考虑的是两个方面:
1,内存碎片不能有效利用而被直接或间接的浪费。
2,内存碎片破坏了局部性原理,导致性能的降低。
这些应该都是针对物理内存来说的。很少有说因为“地址空间碎片”不够导致内存申请失败,相比地址空间,物理内存更紧缺,提到内存碎片当然是指物理内存。