重新学习C语言内存管理
凌晨九点 Lv2

前言

在学习完操作系统MIT6.828后重新学习C语言的内存管理问题。

关于标准库 malloc 和 free

在C标准库中对内存的管理是通过为每个空闲内存提供一个小的数据结构来管理的,大致的伪代码如下

1
2
3
4
struct block {
int size; //内存块的大小
struct block* next; //下一个内存块的指针
}

也就是说这是一个记录空闲空间的循环链表(自己实现的JOS实际上也是这样管理内存)。

malloc 的过程

malloc 会根据申请内存的大小,在其中找到一个足够大的块,将这个块移出链表,并将指针返回。如果没有足够大的块,就会像操作系统申请空间,如果仍然无法满足会返回分配失败

在malloc的过程中还存在多个块满足条件如何选择的问题,此时会涉及到三种策略:

  1. best-fit : 分配大小最合适的块
  2. firtst-fit : 分配最先找到的满足条件的块
  3. next-fit : 在每次遍历过程中记录位置,分配记录位置后下一个满足的块

free 的过程

free 会将参数中指定的内存块加入到空闲块链表中,同时检查临近(物理空间)的块是否空闲,如果空闲会合并为一个更大的块。

使用时注意

  • malloc 二维数组的时候首先分配一维的指针,在循环分配空间,不能分配连续的空间