libc 2.27 堆管理机制

这篇博客详细介绍了Linux下内存分配的流程,包括malloc如何从tcachebins、fastbins、smallbins、largebins和topchunk中寻找合适的chunk,以及内存回收时free的处理方式,涉及tcache、fastbin、unsortedbin、smallbin和largebin的管理。此外,还讨论了mmap和sbrk在内存扩展中的作用。

chunk可以分成allocated chunk,free chunk,top chunk,last remainter chunk

  • allocated chunk:当前chunk是被应用层用户所使用的
  • free chunk:当前chunk是空闲的,没有被应用层用户所使用
  • top chunk:不属于任何的bins,主要是当我们在free的bins中没有找到我们所需的bins时,就从top bins中划分出我们所需的bins。当top bins不够时,需要使用brk分配
  • last remainter chunk

由于在libc2.26之后引入tcachebins,所以堆分配机制和之前不太相同

tcachebins——tcachebins是一个长度为64的字节数组,每个字节数组对应一条链表。所以tcachebins只能存放0x0-0x400大小的堆,且每个链表长度为7。并且类似于fastbins,是一个单链表。在释放大小为0x0-0x400大小的堆的时候,首先会被释放入对应长度tcachebins对应的链表中,当长度超出7后,再放入fastbin或unsortbins中。malloc的时候当发现malloc对应大小的堆,先从tcachebins中取出。注意当如果从fastbin中取出了一个块,那么会把剩余的块放入tcache中直至填满tcache(smallbin中也是一样)。如果进入了unsortedbin,且chunk的size和当前申请的大小精确匹配,那么在tcache未满的情况下会将其放入到tcachebin中

fastbins——fastbins上有7个单链表,是bins数组上的前十位,存放大小为0x20-0x80的堆,存放时不合并

sortbins——当有大于0x400或在0x80-0x400的时候tcachebins以存放满,多余的堆将让放入sortbins。

smallbins——通常是在对sortbins和fastbins整理后

### 问题分析 glibc(GNU C Library)是 Linux 系统中最基础的 C 运行时库之一,负责提供诸如系统调用、内存管理、字符串处理等核心功能。版本 2.27 是 glibc 的一个重要版本,通常与特定 Linux 发行版(如 Ubuntu 18.04)绑定。如果用户在安装或运行某个程序时遇到“glibc 2.27 missing”错误,这意味着目标程序依赖该版本的 glibc,而当前系统中安装的版本较低或未安装。 ### 可能的解决方案 #### 1. 升级操作系统或安装兼容发行版 glibc 是系统核心组件,不建议手动随意升级,否则可能导致系统不稳定或崩溃。最安全的方式是升级整个操作系统或安装支持 glibc 2.27 的 Linux 发行版。例如: - Ubuntu 18.04 LTS(长期支持版本)默认提供 glibc 2.27 - CentOS 8、Debian 10 等也支持 glibc 2.27 #### 2. 使用容器或虚拟机 如果无法直接升级系统,可以考虑使用容器化技术(如 Docker)或虚拟机(如 VirtualBox)来运行一个支持 glibc 2.27 的环境。例如,在 Docker 中运行 Ubuntu 18.04 容器: ```dockerfile docker run -it ubuntu:18.04 ``` #### 3. 手动编译安装 glibc 2.27 虽然不推荐,但在某些情况下可以尝试手动编译安装 glibc 2.27。需要注意的是,glibc 与其他系统组件高度耦合,因此必须小心处理依赖关系。 **步骤概述:** 1. 下载 glibc 2.27 源码包: ```bash wget https://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz ``` 2. 解压并进入源码目录: ```bash tar -xzf glibc-2.27.tar.gz && cd glibc-2.27 ``` 3. 创建构建目录并配置编译选项: ```bash mkdir build && cd build ../configure --prefix=/usr/local/glibc-2.27 ``` 4. 编译并安装: ```bash make -j$(nproc) && sudo make install ``` 5. 设置运行时链接路径: ```bash export LD_LIBRARY_PATH=/usr/local/glibc-2.27/lib:$LD_LIBRARY_PATH ``` #### 4. 使用第三方软件仓库(如 Linuxbrew) 某些第三方软件包管理器(如 [Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux))可以提供 glibc 2.27 的兼容版本,并通过沙箱机制避免影响系统全局环境。 #### 5. 检查程序依赖 如果程序明确依赖 glibc 2.27,但当前系统中只有更高版本(如 2.31 或更高),可以尝试检查该程序是否真的需要该版本。某些程序可能只是静态链接了 glibc,导致误报。 ### 注意事项 - **不要直接替换系统 glibc**,这可能导致系统无法启动。 - 使用 `ldd` 命令检查程序依赖: ```bash ldd your_program ``` - 使用 `strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_` 查看当前系统 glibc 支持的版本。 ### 参考信息 - CUDA Toolkit 10.1 支持的 Linux 发行版中,Ubuntu 18.04 和 CentOS 7.6 等均包含 glibc 2.27[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值