AntDB内存管理之内存上下文之内存上下文机制是怎么实现的

4. 内存上下文机制是怎么实现的

下文将针对内存上下文机制进行代码说明。本次以AntDB的代码为例,来解析内存上下文的实现方式。

4.1 最基础的数据结构


MemoryContextData和MemoryContextMethods是内存上下文机制里最基础的2个数据结构。定义如下图4所示(只针对特定成员进行说明,其他的变量说明可以参照代码)。

图4:MemoryContextData和MemoryContextMethods

※1:这个结构体只是个指针的集合而已,并没有实现。开发者可以根据这个框架自己提供一套实现方式。AntDB已经实装的一套通用的实现:AllocSetMethods。另外AntDB也提供了GenerationMethods和SlabMethods的实现方式,但这2个需要在特定的使用场景下进行使用。接下来的说明都是以AllocSetMethods为前提的。

4.2 通用的实现AllocSetContext

AntDB提供了一个通用的内存上下文实现:AllocSetContext。代码中的内存操作几乎都是通过这个类型的内存上下文来处理的。

首先,我们了解一下AllocSetContext的定义,如下图5所示。

图5:AllocSetContext

4.2.1 内存操作方法

其次,我们看一下header成员。从图5可以看出来,内存操作相关的方法都存放在了header成员里;另外,构建内存上下文的树形关系用的成员变量,比如parent,firstchild等,也都在header里面。

内存上下文可以提供的内存操作有以下几种。

- AllocSetAlloc:内存申请

- AllocSetFree:内存释放

- AllocSetRealloc:内存重分配

- AllocSetReset:内存上下文重置

- AllocSetDelete:内存上下文删除

- AllocSetGetChunkSpace:检查内存片的大小

- AllocSetIsEmpty:检查内存上下文是否为空

- AllocSetStats:获取内存上下文的状态信息

- AllocSetCheck:检查所有内存

4.2.2 内存块


接下来,我们就了解一下内存上下文的实际内存在哪里。

图6:内存上下文的实际内存块

blocks成员是一个链表,内存上下文的内存都放在blocks成员里。内存上下文申请内存时是以block(也可称作大内存)的方式,一次申请一块大内存。申请的block会加入到AllocSetContext的blocks链表中。

内存上下文提供的内存申请函数AllocSetAlloc,是以chunk(内存片,也可称作小内存)的方式分配内存给使用者。即该操作会把block根据需要分成一片一片,然后把内存片的地址提供给调用者。我们调用函数palloc得到的就是这个内存片的地址。

4.2.3 内存上下文实例的整体结构

上文已经分别介绍完了内存上下文的2个重要成员header和blocks。据此,我们可以在脑中画出一个内存上下文实例大概的全貌。请参照下图7。

图7:内存上下文实例的整体结构

前面树形图中(图3)看到的TopMemoryContext、ErrorContext等,从内存角度看的话,就是图7所显示的模样。

相关推荐

  1. python内存管理

    2024-01-08 19:18:02       39 阅读
  2. Python如何实现内存管理

    2024-01-08 19:18:02       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 19:18:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 19:18:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 19:18:02       82 阅读
  4. Python语言-面向对象

    2024-01-08 19:18:02       91 阅读

热门阅读

  1. 若依用户端与管理端认证分离

    2024-01-08 19:18:02       69 阅读
  2. 【论文阅读】Variational Graph Auto-Encoder

    2024-01-08 19:18:02       52 阅读
  3. 【2024】Linux漏洞修复合集

    2024-01-08 19:18:02       39 阅读
  4. 统信专业版编译electron问题总结

    2024-01-08 19:18:02       100 阅读
  5. 三、C#面向对象编程(封装与抽象类)

    2024-01-08 19:18:02       60 阅读
  6. API接口:技术、应用与实践

    2024-01-08 19:18:02       57 阅读