2018-07-20 创建人:Ruo_Xiao
邮箱:xclsoftware@163.com
一、动态内存分配器
- 显式分配器,要求显式地释放任何已分配的块。
栗子:malloc和free,new和delete。 - 隐式分配器(垃圾收集器),要求分配器检测一个已分配块何时不再被程序所使用,那么就释放这个块。自动释放未使用的已分配的块的过程叫做垃圾收集。
二、虚拟内存中动态分配的内存的位置
- 动态内存分配器维护着一个进程的虚拟内存区域,称为堆(heap)。
- 内核维护着一个变量brk(读作“break”),他指向堆的顶部。
- 分配器将堆视为不同大小的块(block)的集合来维护。每个块都是一个连续的虚拟内存片(chunk),要么是已分配的,要没是空闲的。
三、分配器要求和目标
要求
1、起始地址必须是某个数的倍数。
栗子:
32bit模式下,malloc返回的块的地址总是8的倍数。
64bit模式下,malloc返回的块的地址总是16的倍数。
2、内存块的大小。
必须是该数据类型所占大小的整数倍。
栗子:
int *p = (int *)malloc(3);
其p指向的块的大小4个字节。(3+1)
3、处理任意请求序列。
4、立即响应请求。
5、不修改已分配的块。
目标
- 最大化吞吐率:单位时间内完成的请求数。
- 最大化内存利用率。
四、碎片
- 内部碎片:在一个已分配的块比有效载荷大时发生的,即:已分配块的大小和它们有效载荷大小之差的和。
- 外部碎片:当空闲内存合计起来足够满足一个分配请求,但是没有一个单独的空闲快足够大可以来处理这个请求时发生的。
注:有效载荷,即:程序员要分配的内存大小。
(SAW:Game Over!)