AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 411408
Accepted
Muno
Muno
Asked: 2017-12-18 06:56:08 +0800 CST2017-12-18 06:56:08 +0800 CST 2017-12-18 06:56:08 +0800 CST

堆什么时候用于动态内存分配?

  • 772

每一篇关于内存分配的文章似乎都解释了如何mmap使用或如何sbrk使用,而不考虑如何将这些与堆关联起来。

我已经收集到堆在内存分配中的作用几乎是微不足道的——事实上,我不确定它的作用:D,我请求有人让我感到困惑。


这是我的理解:

1) 当内存被分配时,未初始化数据段的末尾,BSS,被扩展。这种扩展(例如将地址移动x到x-n)是调用 的结果sbrk。在这个模型中,内存被分配到将 BSS 段头的位置减少了的n字节(假设每个地址对应一个字节) 。sbrk这个模型现在已经过时了。有些人将堆定义为所有此类扩展的聚合空间。其他人没有——在后一种情况下,堆有什么作用?

2)在现代内存分配方案中,堆确实存在(出于什么原因,我也不确定)。为了分配内存,malloc内部用于mmap将数据存储到作为页面集合的内存区域中。这些内存区域独立于堆。


TLDR:

对于旧系统:如果内存分配存储在增加末端 BSS 的偏移量后获得的地址空间中,那么堆是否有任何用途?

对于较新的系统:假设 mmap 主要用于内存分配,那么堆的用途是什么?

在这两种情况下,堆真的有用吗?

c memory
  • 2 2 个回答
  • 1653 Views

2 个回答

  • Voted
  1. Best Answer
    Johan Myréen
    2017-12-18T07:30:41+08:002017-12-18T07:30:41+08:00

    mmap并且sbrk是内核提供的用于为进程分配地址空间的系统调用。这些调用改变了虚拟地址到物理页框的映射。在这些映射的地址限制之外寻址内存是一个严格的禁忌,并且会导致分段错误。这是内核提供给进程的低级接口,以brk地址结尾的内存区域通常称为堆。

    内核不知道mallocor free,这些是 libc 中的库函数。Libc 维护数据结构并记录从内存分配的角度来看哪些内存区域是空闲的,例如 . 如果可以通过重用先前释放的内存区域来满足对的调用,则调用malloc不一定会导致调用sbrk或mmap(取决于 Libc 如何实现动态内存分配)来扩展映射。malloc

    • 2
  2. Jander
    2017-12-23T13:21:31+08:002017-12-23T13:21:31+08:00

    “堆”是一个高级概念,而不是低级实现。malloc()在 C 中,堆是用于提供分配的任何内存池。

    这是一个有趣、简单的内存分配器实现:

    static char *heap[1000000];
    int top = 0;
    
    void *malloc(int size) {
        void *ret = &heap[top];
        top += size;
        return ret;
    }
    
    void free(void *ptr) {
        /* Eh; freeing is too hard */
        return;
    }
    

    这是一个糟糕的分配器,但对于正确类型的程序,如果你的系统和编译器容忍内存对齐之类的事情,它有点工作。它的堆是heap[]数组,它在编译时使用数组声明来构建它,而不是用sbrk()or组装一个mmap()。

    “真正的”分配器的工作方式相同。当malloc()被调用时,它会占用其内存池(其堆)的一小部分并将其保留用于该分配。有两个重要的区别:

    • 真正的分配器知道如何free()分配,以便以后可以再次使用它。
    • 真正的分配器可以通过在其所有现有块都已满时向操作系统请求更多内存(使用sbrk()or )来增加其堆的大小。mmap()
    • 0

相关问题

  • RAM清理操作无需重新启动

  • 来自“git status -z -u”的高内存使用?

  • 基于 OpenCV 的程序优化嵌入式 linux OS [关闭]

  • 内存资源监控程序

  • 进程是否可以分配高速缓存,以便内核在必要时可以占用它?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve