再入门一下linux堆

date
Mar 3, 2020
URL
slug
heap-start
status
Published
tags
二进制
summary
老文章迁移
type
Post
 

关于堆的常识性内容

在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。
Linux的堆是glibc集成ptmalloc2实现的,主要是通过 malloc/free 函数来分配和释放内存块

malloc

malloc(size_t n) size_t 无符号数
动态分配内存,用多少分配多少,不会浪费资源。

free

free 函数会释放由 p 所指向的内存块 这个内存块有可能是通过 malloc 函数得到的,也有可能是通过相关的函数 realloc 得到的。
此外,该函数也同样对异常情况进行了处理
  • 当 p 为空指针时,函数不执行任何操作。
  • 当 p 已经被释放之后,再次释放会出现乱七八糟的效果,这其实就是 double free
  • 除了被禁用 (mallopt) 的情况下,当释放很大的内存空间时,程序会将这些内存空间还给系统,以便于减小程序所使用的内存空间。
malloc 和 free并不是最底层与系统交互的函数
这些函数背后的系统调用主要是 (s)brk 函数以及 mmap, munmap 函数。
notion image
 
notion image
 
 
notion image
 
prev_size 如果连续的上一个chunk为free状态,则prev_size 存有上一块chunk的size 包括header
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image
 
notion image

© Somet1mes 2021 - 2024