上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
第6章 线程本地堆的实现
6.1 Heap概述
在前面的介绍中提到,一个用户线程可以通过两种方式获取内存。一种方式是调用KMemAlloc函数,从内核内存空间中分配内存,这种方式下,可以申请页面尺寸大小(在IA32构架下,为4KB)的内存,也可以申请任何大小的内存。但一般情况下,核心内存是供操作系统核心和设备驱动程序使用的,不建议用户应用程序直接申请。另外一种方式是调用VirtualAlloc函数,从整个系统的线性空间中分配内存,这种方式下,需要在调用VirtualAlloc函数的时候提供一个VIRTUAL_ALLOC_ALL标志,这样就使得操作系统把申请的线性地址空间区域与物理内存对应起来,从而可以当做常规内存使用(若申请的线性地址空间区域没有对应的物理内存,则在访问这些内存的时候,会导致异常)。但采用VirtualAlloc函数来分配内存,最小尺寸也是页面尺寸(IA32构架下是4KB),不能申请更小尺寸的内存。
因此,上述两种内存分配方式都不适合应用程序直接采用,一个比较可行的做法就是另外实现一个内存分配器,这个分配器通过VirtualAlloc函数,从线性空间中申请大块内存,然后作为一种资源自己管理,并提供用户接口,供应用程序调用来申请小块内存。这种管理内存的方式,我们称为“堆”(heap)。在本章中,我们就对堆的实现进行详细描述。