什么是内存上下文?
一个内存上下文就相当于一个进程环境,每个内存上下文中都定义了这个内存上下文所占内存块的具体位置、大小等相关信息以及与其他内存上下文之间的关联信息。
内存上下文的主要成员有那些?
MemoryContext header; /* 标准内存上下文字段 */
AllocBlock blocks; /* 大内存块链表的头指针 */
AllocChunk freelist[ALLOCSET_NUM_FREELISTS]; /* 自由的小内存块链表 */
Size allocChunkLimit; /* 小内存块大小最大值 */
- header:每个内存上下文都拥有,它记录了该内存上下文已经分配的内存大小,父节点,子节点信息等。
- blocks:指向大小超过allocChunkLimit的内存块的链表
- freelist:指向大小不超过allocChunkLimit的内存块的链表
- allocChunkLimit:用来区分Block还是Chunk的临界值。
内存上下文有什么作用?
系统中的内存分配操作在各种语义的内存上下文中进行,所有在内存上下文中分配的内存空间都通过内存上下文进行记录。因此可以很轻松地通过释放内存上下文来释放其中的所有内容,而不用费心地去释放其中的每一块内存,使得内存分配和释放更加快捷和可靠。
每个内存上下文中内存分配和释放是怎样的?
当大于allocChunkLimit时:
内存分配(palloc)是调用malloc函数分配新的内存块。
内存释放(pfree)是调用free函数释放该内存块。
当小于allocChunkLimit时:
内存分配(palloc)会先去freelist中找现成的符合要求的chunk块来使用,找不到的话就看看blocks中的第一个block块够不够用,还不够用的话就去调用malloc分配新的内存块。
内存释放(pfree)时将内存块缓存到freelist。