最近看了几个malloc和free的问题,总结一下。
malloc和free由谁提供?
一般来讲,它们是C Standard Library提供的而不是由操作系统的内核实现。例如微软的是msvcrt,Linux下是glibc。当然也有第三方库函数,比如jemalloc、tcmalloc。所以每个malloc和free的实现都有所不同,而且这些实现和内核之间是保留有一定自由度的。比如每次malloc是多大空间,每次free之后又归还多少给OS,都是依据不同实现而定的。本文malloc/free的讨论都是基于Linux/glibc的。
操作系统中的内存管理
在操作系统的课程中讲到过空闲内存管理的策略,一种方式是使用位图,用一个bit代表固定大小的一片内存区域(比如4B),0表示未分配,1表示已分配。这种方法存在一些问题:
- 每次只能分配区块大小的整数倍的空间,如果申请空间不是整数倍,其中有部分被浪费。
- 每个区块的大小该如何定义?过大的话浪费过多,过小的话位图表太大。
- 每次