68-内存管理(6)
说说执行体的内存池的事吧!和前面提到的系统内存池一样,在执行体内也有内存池这样的模块。相比系统的内存池的管理粒度,执行体的粒度是很小的了。因为在这个层面,windows更需要实现灵活的、可适应各种大小的内存需求的内存池。执行体内存池的对象是由数据结构来描述,在这个数据结构中申明的变量都与执行体的对象有很大的关系。和系统内存池对象一样,执行体内存池的对象也分换页和非换页两种方式。也要进行相应的初始化工作,有相关的函数分别执行初始化相关的非换页内存池对象和换页内存池对象。在执行体有个叫initializepool的函数,该函数组成有些意思,在代码执行前段部分完成非换页内存池的初始化,在后半部分则完成换页内存池的初始化。其实这种方式正是一个合理的内存分配过程,先执行非换页的内存池申请,再执行换页内存池申请。执行体内的内存池管理算法主要分为2种,我所知道的是一种叫快查方法,原理则很简单主要是将空闲的内存链表记录这各种需要分配的内存,当内存池需要更多内存时,它可以向对应的系统内存池申请更多的一面,当内存释放时,让释放的内存的与相邻的尽量合并,以形成更多的内存块,前面所说内存管理大致都是类似的模式。这种快查表都是依附线程池对象生存的,这些表里通常都是8字节倍数大小的空闲链表。全局变量限定了内存分配的范围,如果内存分配超过了规定的大小,则在执行体内的内存池去找系统内存池去要内存。在执行体内最小的内存块为8个字节,快表就是保存着8、16、24直到4080大小的空闲内存块。如果用户要申请大于4080但小于4090的话,就可以直接使用整个页面。
未完待续...........