什么是连续的内存块?

565*_*741 38 c memory heap heap-fragmentation

就像在标题中一样,什么是连续的内存块?

Mic*_*eyn 56

这是一个五个字节的连续内存块,从位置1到位置5:

替代文字

它代表一起在存储器在它们之间没有间隙字节(白色)字节(色光蓝色).

这是一组非连续的五个字节:

替代文字

它被分段成三个组字节(着色黄色)与间隙在位置4和6在位置1开始有三个字节的连续块,从位置1跨越到3.有每一个字节的两个字节的块的分别在5和7号位置.

位置0处的未使用块以及位置7之外的任何后续块通常可以被忽略,因为它们插入在从位置1到7的跨越感兴趣的字节之间.


Ste*_*sop 49

其中一个地址没有任何空白.你可以把它想象成一个"块",把中间的差距想象成"两个块".

这个术语在数组的定义中表现为"连续".这意味着元素是端到端布局的,没有间断,并且它们之间没有填充(每个元素内部可能有填充,但元素之间不存在填充).因此,5个4字节元素的数组看起来像这样(每个字节有1个下划线字符,|符号不代表内存):

 ____ ____ ____ ____ ____
|____|____|____|____|____|
Run Code Online (Sandbox Code Playgroud)

它看起来不像这样:

 ____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|
Run Code Online (Sandbox Code Playgroud)

它也不是这样的:

 ____ ____ ____                                           ____ ____
|____|____|____| ... somewhere completely different ...  |____|____|
Run Code Online (Sandbox Code Playgroud)

在所有情况下,"看起来像"意味着"就C中可见的地址而言".某些东西在虚拟地址空间中可能是连续的,但在物理RAM中不是连续的.就此而言,物理RAM地址空间中的某些东西可能是连续的,但在物理RAM中实际上并不相邻.其中一半可以在这里的一个RAM芯片上,另一半在另一个RAM芯片上.但C内存模型无法"看到"其中任何一个.


Cod*_*aos 5

一块内存块,不会被其他内存中断.或者更确切地说,它需要不间断的虚拟地址空间块.地址空间的真正RAM支持不需要是连续的.

如果分配大内存块,这很重要.操作系统必须将它作为一个连续的块提供给你,但是如果内存如此碎片化,只有较小的部分是空闲的,那么即使总可用内存大于请求的空间,也无法满足这种内存分配.

这对64位应用程序来说不是一个大问题,因为那里的地址空间很大.但是在32位进程中,可能会发生堆变得如此碎片化(在释放的块之间仍存在不一致的块)更大的分配失败.