gpt4 book ai didi

通过mmap分配的内存是否可以覆盖数据段

转载 作者:IT王子 更新时间:2023-10-29 01:04:16 26 4
gpt4 key购买 nike

malloc 函数同时使用了sbrkmmap 函数。现在 sbrk 函数增加或减少数据段。所以它是线性增长的。现在我的问题是,这种线性是否始终保持不变,或者例如,mmap 调用可以分配与数据段重叠的内存?

我说的是在多核系统上运行的多线程程序。 This blog讨论了sbrk 用于多线程程序的一些严重缺陷,并指出使用sbrk 分配的内存可能会与使用mmap< 分配的内存混合在一起(sbrk 堆可能变得不连续,因为 mmaped 区域或共享对象阻碍了堆的增长)。

最佳答案

那篇博文只见树木不见森林;只有 malloc 实现被允许使用非零参数调用 sbrk。更准确地说,如果应用程序代码使用非零参数调用 sbrk,Unix 的大多数 malloc 实现将停止正常运行(我的意思是“您的程序将崩溃”)。如果您想直接从操作系统进行大量分配,您必须使用 mmap 来完成。

(的确,在多线程程序中,malloc 必须在其对 sbrk 的调用内部包裹一个互斥量,但这是一个实现细节。POSIX 说 malloc 是线程安全的,这对应用程序程序员来说很重要。)

mmap 不会分配重叠brk 区域的内存,除非您使用MAP_FIXED。如果您使用 MAP_FIXED 并且您的程序崩溃了,您可以保留所有部分。

内核试图避免这样做,但正常操作中的 mmap 可以想象地分配靠近 brk 区域顶部的内存。如果发生这种情况,将与 mmap 区域发生冲突的后续 sbrk 调用将失败。它不会分配不连续的内存。 malloc 的良好实现应该检测到这种情况并开始对所有内容使用 mmap。我还没有实际尝试过,但是编写一个测试程序会很容易。

关于通过mmap分配的内存是否可以覆盖数据段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9366493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com