malloc 不保证返回物理上连续的内存
malloc does not guarantee returning physically contiguous memory
我正在阅读有关虚拟内存的内容,我的结论如下:
malloc(size);
- malloc 不保证 return 物理上连续的内存。它保证 return 几乎连续的内存。当 size > 4KB 时尤其如此,因为 4KB 是页面的大小。 (在 Linux 系统上)。
我是对还是错?请解释。
malloc does not guarantee returning physically contiguous memory
是
It guarantees returning virtually contiguous memory
是
Especially it is true when size > 4KB because 4KB is a size of page.
( On Linux systems).
作为连续内存并不意味着它也将是页面对齐的。分配的内存可以从堆中的任何地址开始。因此,无论 OS 使用页面大小,它都不会影响 malloc 的分配性质。
malloc 只是从堆中分配内存,在虚拟内存系统中,完全将内存分配给进程不同的部分(文本、数据、bss、堆、堆栈)实际上是连续的。进程的每个部分都使用 mmap 分配了一个虚拟内存区域。
在扩展堆的情况下,它基本上分配了一个由 brk() 系统调用分配的虚拟内存区域。如果大小大于 4kb,则不受影响。
虽然 linux 有 HUGETLB 页面的概念以避免频繁的 TLB 未命中,但这是 Linux 的内部概念。
我正在阅读有关虚拟内存的内容,我的结论如下:
malloc(size);
- malloc 不保证 return 物理上连续的内存。它保证 return 几乎连续的内存。当 size > 4KB 时尤其如此,因为 4KB 是页面的大小。 (在 Linux 系统上)。
我是对还是错?请解释。
malloc does not guarantee returning physically contiguous memory
是
It guarantees returning virtually contiguous memory
是
Especially it is true when size > 4KB because 4KB is a size of page. ( On Linux systems).
作为连续内存并不意味着它也将是页面对齐的。分配的内存可以从堆中的任何地址开始。因此,无论 OS 使用页面大小,它都不会影响 malloc 的分配性质。
malloc 只是从堆中分配内存,在虚拟内存系统中,完全将内存分配给进程不同的部分(文本、数据、bss、堆、堆栈)实际上是连续的。进程的每个部分都使用 mmap 分配了一个虚拟内存区域。
在扩展堆的情况下,它基本上分配了一个由 brk() 系统调用分配的虚拟内存区域。如果大小大于 4kb,则不受影响。 虽然 linux 有 HUGETLB 页面的概念以避免频繁的 TLB 未命中,但这是 Linux 的内部概念。