SQlite源码分析

内存分配器

教材介绍的DBMS内存管理往往全部集中在缓冲池上.实际上,数据库系统也分配了大量的内存用于其他任务.正确地管理这些内存不仅是编程上的负担,也关系到性能问题.例如,Selinger风格的查询优化可使用大量的内存用来建立动态编程过程中的状态.查询操作符如哈希连接、排序在运行时会分配大量内存。商业系统中的内存分配可通过使用基于上下文的内存分配器来更有效、更容易地调试。

内存的上下文是内存中的数据结构,维护了一个连续的虚拟内存的区域列表,通常称其为内存池。每个区域都可以有一个小的头部,头部包含了一个上下文标签或一个指向上下文头部结构的指针.基本的内存上下文API包括如下调用:

  • 创建给定名称或类型上下文

上下文的类型可以让分配器知道如何有效处理内存分配.例如,用于查询优化器的上下文所使用的内存数量会以较小的增量逐渐增加,而用于哈希连接的上下文是以批量的方式来分配内存的.基于这样的知识,分配器会每次选择分配更大或更小的区域.

  • 分配上下文中的一块内存
  • 删除上下文中的一块内存
  • 删除上下文
  • 重置上下文