PostgresSQL ---- 内存上下文(简述)

什么是内存上下文?

一个内存上下文就相当于一个进程环境,每个内存上下文中都定义了这个内存上下文所占内存块的具体位置、大小等相关信息以及与其他内存上下文之间的关联信息。

内存上下文的主要成员有那些?

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容