41

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

4

6 回答 6

62

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

替代文字

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

这是一组不连续的感兴趣的五个字节:

替代文字

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

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

于 2010-10-30T15:57:55.960 回答
53

一个在它占用的地址中没有任何间隙。您可能可以将其视为“块”,并将中间有间隙的东西视为“两个块”。

该术语出现在数组的定义中,即“连续”。这意味着元素是端到端布局的,它们之间没有不连续性和填充(每个元素内部可能有填充,但元素之间没有填充)。所以一个由 5 个 4 字节元素组成的数组看起来像这样(每个字节 1 个下划线字符,| 符号不代表内存):

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

它看起来不像这样:

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

它看起来也不像这样:

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

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

于 2010-10-30T15:34:37.220 回答
6

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

如果您分配一个大的内存块,这一点很重要。操作系统必须将其作为连续块提供给您,但如果内存碎片太多以至于只有较小的部分可用,那么即使总可用内存大于请求的空间,也无法满足此内存分配。

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

于 2010-10-30T15:35:57.750 回答
3

当一个内存块由一个线性地址空间的起始地址和结束地址定义并且没有空洞时,它就是连续的。

于 2010-10-30T15:45:17.247 回答
2

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

如果它有 16 个字节的内存从一个地址开始x,另外 8 个字节从一个地址开始,y这样y > x + 16y < x - 8(这会产生一个间隙),那么即使总共有 24 个字节空闲,分配器也无法满足您对 24 个字节的请求.

另见分片

于 2010-10-30T15:36:26.990 回答
1

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

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

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

于 2020-03-20T15:41:35.107 回答