什么是连续的内存块?

时间:2010-10-30 15:32:30

标签: c memory heap heap-fragmentation

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

6 个答案:

答案 0 :(得分:53)

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

alt text

它表示内存中的字节(浅蓝色),它们之间没有间隙字节(白色)。

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

alt text

它被分成三组字节(黄色),位置4和6处有间隙字节。从位置1开始,有一个三个字节的连续块,从1到3的位置。还有两个块。每个字节分别在位置5和7处。

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

答案 1 :(得分:45)

其占用的地址没有任何空白。你可以把它想象成一个“块”,把中间的差距想象成“两个街区”。

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

 ____ ____ ____ ____ ____
|____|____|____|____|____|

看起来不像这样:

 ____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|

它看起来都不是这样的:

 ____ ____ ____                                           ____ ____
|____|____|____| ... somewhere completely different ...  |____|____|

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

在分配内存的上下文中,当您调用内存分配器并请求24个字节的内存时,它必须能够找到至少24个字节的未分配内存的单个块。

如果它有一个16字节的内存从一个地址x开始,另外8个字节从地址y开始,那么y > x + 16y < x - 8(这将创建一个间隙),然后分配器无法满足您的24字节请求,即使总共有24个字节可用。

另见Fragmentation

答案 4 :(得分:2)

当存储块由单个线性地址空间的起始和结束地址定义且没有空洞时,它是完全连续的。

答案 5 :(得分:1)

内存由大量字节块组成。每个块都有其自己的地址。 当进程请求内存时,可以通过两种方式分配内存:

  1. 连续内存分配
  2. 非连续内存分配

在连续内存分配中,分配了连续(一个接一个)的块,称为连续内存块。
在不连续的内存分配中,分配了位于不同位置的单独块。