话说
MemoryContextMethods
结构里的函数实现了pg
里AllocSet/MemoryContext
的内存管理机制,定义见下面。
typedef
struct
MemoryContextMethods
{
void
*(*alloc) (MemoryContext context, Size
size);
/* call this free_p in case someone #define's free() */
void
(*
free_p
)
(MemoryContext context, void
*pointer);
void
*(*realloc) (MemoryContext context, void
*pointer, Size size);
void
(*init)
(MemoryContext context);
void
(*reset)
(MemoryContext context);
void
(*delete
) (MemoryContext context);
Size
(*get_chunk_space) (MemoryContext context, void
*pointer);
bool
(*is_empty)
(MemoryContext context);
void
(*stats)
(MemoryContext context);
#ifdef
MEMORY_CONTEXT_CHECKING
void
(*check)
(MemoryContext context);
#endif
} MemoryContextMethods;
其中delete
由AllocSet
的静态函数
AllocSetDelete
()
实现,具体签名在下面。它实现了AllocSet
相关的内存删除机制。而MemoryContext
即父类的内存删除由MemoryContextDelete()
实现,签名在下面。这两个方法各自负责本类型中成员的内存删除工作,好像协作,完成了AllocSet/MemoryContext
类型对象的删除和内存回收工作。
static
void
AllocSetDelete(MemoryContext
context)
void
MemoryContextDelete(MemoryContext context)
下面就写
MemoryContextMethods.delete
的实现者负责AllocSet
实例删除的AllocSetDelete()
这个函数以及相关的负责MemoryContext
实例删除的MemoryContextDelete()
方法。先上图,然后分块解读处理流程。
AllocSet/MemoryContext
实例内存删除流程图
先说红色框吧,在红色框部分,MemoryContextDelete
方法检查要删除的context
是否有效,然后调用MemoryContextDeleteChildren
方法,检查context
的firstchild
是否不为空,若不空就以firstchild
指向的子context
为参数调用MemoryContextDelete
方法。这样就以MemoryContextDelete
方法和MemoryContextDeleteChildren
方法形成了递归调用,以删除当前的context
及它的子context
。
接着看黄色框,在前面形成递归调用的基础上,黄色框中主要是删除context
及其子context
的nextchild
指向的子context
。
再接着看蓝色框,主要是在前面形成递归调用的基础上,针对要删除的context
及其子context
调用AllocSetDelelte
方法,处理context
的aset
和blocks
成员,把aset
置空,把AllocBlock
列表blocks
中的block
使用过的内存空间逐个置0X7F
,然后调free
释放。这个blocks
链表处理完后就到了绿色框中。
现在看绿色框和紫色框,在绿色框中,还是在前面形成递归调用的基础上,在绿色框中检查要删除的context
的有效性,然后找到该context
所在的AllockChunk
类型实例chunk
,根据该chunk
找到其所属的context
,把要删除的context
和其所在的chunk
所属的context
一起作为参数调用AllocSetFree
方法去释放要删除的context
所占内存。AllocSetFree
释放内存在
《
pg
的内存管理机制二
》中已经讨论过了,感兴趣可以去看一下。
这样就在以MemoryContextDelete
方法和MemoryContextDeleteChildren
方法形成的递归调用里逐个删除要删除的context
及其firstchild
和nextchild
成员“链”上的context
。具体看流程图吧。
结合图形看一个递归删除MemoryContext
类型实例时的顺序的例子,图中一个圆圈代表一个MemoryContext
类型实例,在左下方的是MemoryContext
的firstshild
成员,在右下方的是nextchild
成员。图一是初始时的样子,现在要删除节点4
,先顺着4
的firstchild
递归到其最终叶子节点6
,将其按上面说的过程删除并释放空间,如图二。然后将节点4
的nextchild
节点7
放到4
的父节点3
的nextchild
子节点上,把节点3
原来的nextchild
子节点5
放到节点7
的nenxtchild
子节点上,如图三。这时已经处理完了节点4
的两个子节点,将节点4
删除。
就到这儿吧。
- 大小: 22.3 KB
- 大小: 141.7 KB
分享到:
相关推荐
标题中的"pg055axibridgepcie_055PG.com_055pg.com_www.055PG.COM_https//:055"似乎是一个标识符,结合描述中的"AXI Memory Mapped to PCI Express (PCIe)",我们可以推测这可能是一份关于在系统设计中使用AXI...
三、导出(支持bmp、jpg、png和mng格式,mng格式的说明参见附录2。另外支持导出为三国群英传的SHP格式) RPGViewer提供三种导出功能: 1、当前帧 导出当前显示的图片 2、当前图片 当图片仅有一帧时,和导出“当前帧...
另外,通过设置透明度和过渡效果,可以实现平滑的弹出和关闭动画。 3. **JavaScript基础**: - 引入JavaScript来处理用户的交互事件。这通常涉及到对DOM(文档对象模型)的操作,如获取元素、修改元素属性和监听...
标题中的“10种方法绕过云锁以及...总的来说,这些绕过方法显示了在面对有漏洞的云锁时,攻击者可能采取的策略,同时也提醒了网站管理员和安全从业者注意云锁的局限性,及时更新和优化防御措施,以防止潜在的安全风险。
1:全站采用AJAX+SQLSEVER+存储过程+三层架构开发,大大提高了访问的速度与安全。 2:该系统分为 系统管理员和普通员工两个权限,不同的员工登陆具有不同的页面,管理员可以自定义用户权限,默认管理员帐户:...
蓝桥杯单片机第十届省赛题程序,里面有hex代码可提供下载调试,需要源码和赛题请解压里面的一个压缩包,里面包含源码和hex文件的源代码。非常的银杏,非常的好用。
Java+SQL sever-实现人事管理系统,压缩包里有程序说明和设计报告 博客:https://blog.csdn.net/LuoQingShan_lqs/article/details/91994043 土豪贡献点币,不是的话https://wwa.lanzoui.com/ikn7sq9pg6h
PostgreSQL服务器导出器 用于PostgreSQL服务器指标的Prometheus导出器。 CI测试的PostgreSQL版本: 9.4 , 9.5 , 9.6 , 10 , 11 , 12 , 13 快速开始 该软件包可用于Docker: # Start an example database ...
pgadmin4数据库管理 PostgreSQLpgadmin4数据库管理 PostgreSQL
项目结构: Lib:公用类库 BLL: 业务层 DALFactory: 工厂类 IDAL: 接口层 Model: 数据实体 SQLServerDAL: 数据层 Web: 表示层,Web项目 Codematic_Data.MDF : 该项目所使用的数据库 DEncryptTest :加密解密工具 ...
使用 PHP 8.3.4 的 Docker此存储库旨在促进使用 php 8.3.4 的开发环境的创建环境中有什么NginxphpFpmApache2MySQL玛拉雅数据库PhpMyAdmin研究生管理PostgreSQLRedis先决条件安装 Docker安装 Docker Compose使用方法...
视频教程和编译后的可执行版本,请访问http://icme.hpc.msstate.edu/mediawiki/index.php/Code:_SHPB_Analysis 视频教程: https : //youtu.be/iLyfXR0xYJ0 请使用同行评审的期刊文章引用: DK Francis、WR ...
M2006与M3508大疆电机程序控制,开发板型号为大疆C板STM32F407,通过PID控制大疆...http://dt4.8tupian.net/2/31732a6b1.pg0 CAN控制RM电机__PID控制__F407ZGT6(付费5r): http://dt2.8tupian.net/2/31732a7b1.pg0
复制代码 代码如下:<?php $Shortcut = “[InternetShortcut] URL=... header(“Content-type: application/octet-stream”); header(“Content-Disposition: attachment; filename=链接文
Oracle用三种循环方法输出乘法表,比如loop的用法: m := 1; loop n := 1; loop dbms_output.put(m||'*'||n||'='||m*n||' '); n := n + 1; exit when n > m; end loop; dbms_output.put_line(''); ...
马科斯·亨里克(Marcos Henrique) 未来数据科学家我是管理员,并且是管理专业的研究生。 我想将职业转变为数据科学。 背景资料: Python 链接:Projetos: 公益广告: Analisando os Dados do Airbnb: ://bit.ly...
- **物件与制造商部件**:与PG&C相关的新的标签和属性在“物件”和“制造商部件”中有所体现,这有助于更精细地管理产品及其组成部分的信息。 - **用户偏好设置**:新增的“File Productivity”(文件生产率)偏好...
M2006与M3508大疆电机程序控制,开发板型号为STM32F407ZGT6,通过PID控制大疆电机的转速,亲测能...http://dt4.8tupian.net/2/31732a6b1.pg0 CAN控制RM电机__PID控制__F407ZGT6 http://dt2.8tupian.net/2/31732a7b1.pg0
技术栈: 1.前端:easyweb3.1.8 + layui2.5.7 + beetl3.1.8 2.后端:spring boot + mybatis-plus + hutool 运行步骤: 1.配置项目Jdk、maven等,等待项目加载完毕 2.修改rdp-server模块下的application-local.yml的...
http://books.google.ae/books?id=I5EnKiZm3uUC&hl=zh-CN&pg=PA142&img=1&zoom=3&hl=zh-CN&sig=ACfU3U2qvQpFCQXmO6ndeha1ftAJyIuS0A&w=800&gbd=1 ...