什么是连续内存块?

Posted

技术标签:

【中文标题】什么是连续内存块?【英文标题】:What is a contiguous memory block? 【发布时间】:2011-05-02 20:12:39 【问题描述】:

就像标题一样,

【问题讨论】:

【参考方案1】:

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

    连续内存分配 非连续内存分配

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

漂亮的可视化。你用什么来创建这些图像?【参考方案3】:

它占用的地址没有任何间隙。你大概可以把它想象成一个“块”,把中间有空隙的东西想象成“两个块”。

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

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

看起来不像:

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

而且看起来也不像这样:

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

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

【讨论】:

不应该是每个 4 字节元素 1 个下划线字符吗?【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

另见Fragmentation。

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于什么是连续内存块?的主要内容,如果未能解决你的问题,请参考以下文章

C ++中连续内存的含义是啥?

将多个内存块呈现为单个连续块的容器

在连续的内存块中创建具有可变元素的链表

连续内存分配:内存碎片与分区的动态分配

使用单个连续的内存块索引3维数组

如何减小内存碎片