`

pg的内存管理机制四:AllocSet/MemoryContext的内存再分配

阅读更多

 

话说 MemoryContextMethods 结构里的函数实现了pgAllocSet/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;

 

其中realloc 由静态函数AllocSetRealloc() 实现,具体签名在下面。它实现了AllocSet/MemoryContext 相关的内存再分配。AllocSetRealloc() 方法 返回按请求大小新分配的内存的指针。把新分配的内存加入到set 中,把传进来的pointer 相关的旧内存里的内容拷贝到新内存里,把旧内存释放掉。新分配的内存有可能是在原来的基础上再在后面加一部分,这样就不用拷贝旧内存内容和释放就内存了。

static void * AllocSetRealloc(MemoryContext context, void *pointer, Size size)

在某个context 里的chunk 的内存不够用的时候,就调用MemoryContextrepalloc() 方法,该方法再调用 AllocSetRealloc() 方法 调整原来分配给AllocChunk 类型实例chunk 的大小。

下面就写 MemoryContextMethods. realloc 的实现者AllocSetRealloc () 这个函数。先上图,然后分块解读处理流程。

 


 

AllocSetFree 回收内存流程图

 

先看红色框,根据传进来了要扩展内存的chunk 和其所在的context ,检查该chunk 原来分配的空间oldsize 和本次请求的空间size ,如果原oldsize 可以满足要求,就把该chunk 的请求大小request_size 置成size ,返回该chunk 。如果oldsize 不能满足本次请求的大小size 。就根据chunk 原来分配的空间oldsize 的是否大于AllocChunk 的大小上限/8k 判断,大于该上限就到黄色框,负责到蓝色框。

接着看黄色框,根据该chunk 找到其所在的block ,以该block 和根据请求的chunk 大小size 换算的AllocBlock 的东西blksize 调用realloc() 方法分配内存,成功就返回对应chunk 的指针,负责写日志报错“out of memory

再接着看蓝色框,检查chunk 是否是其所在block 里的最后一个AllocChunk ,如果是,检查该block 剩余的空间和该chunk 的空间加起来是否满足全球的大小size ,如果可以就在该block 中开展这个chunk ,然后返回该chunk 的指针。负责就到了紫色框。

做后看紫色框,调用AllocSetAlloc() 方法(参见《pg 的内存管理机制一 》)在当前MemoryContext 上分配空间新的空间该chunk ,把chunk 原来内存里的内容拷贝过来,调用AllocSetFree() 释放chunk 原来所占的内存。具体看流程图吧。

 

  • 大小: 119.8 KB
0
0
分享到:
评论

相关推荐

    pg055axibridgepcie_055PG.com_055pg.com_www.055PG.COM_https//:055

    055PG.com_055pg.com_www.055PG.COM_https//:055"似乎是一个标识符,结合描述中的"AXI Memory Mapped to PCI Express (PCIe)",我们可以推测这可能是一份关于在系统设计中使用AXI(Advanced eXtensible Interface)...

    万能游戏资源提取软件

    四、导入(支持bmp、gif、jpg和png格式) 你可以导入bmp或者png(支持透明色和alpha通道)格式的图片(注:“导入”操作只是引入了一个替换的标记,此时并未进行实际的替换) 如果想取消对当前图片的替换可以使用...

    JS实现仿百度登录弹出界面

    在JavaScript(JS)中实现一个仿百度登录弹出界面,主要涉及到前端开发中的网页交互、CSS样式设计以及JavaScript脚本编程。以下将详细介绍这个过程的关键知识点: ... 2. **CSS样式**: - 使用CSS来设计登录弹窗的...

    10 种方法绕过云锁以及tamber

    标题中的“10种方法绕过云锁以及tamber”指的是针对云锁(WAF,Web Application Firewall)的10种渗透测试技术,目的是规避云锁的安全防护机制。描述中提到,通过测试发现云锁的一个漏洞,即如果SQL查询语句中包含...

    蓝桥杯单片机第十届省赛题程序.zip

    蓝桥杯单片机第十届省赛题程序,里面有hex代码可提供下载调试,需要源码和赛题请解压里面的一个压缩包,里面包含源码和hex文件的源代码。非常的银杏,非常的好用。

    人力资源管理系统(AJAX+SQLSEVER+存储过程+三层架构开发)

    1:全站采用AJAX+SQLSEVER+存储过程+三层架构开发,大大提高了访问的速度与安全。 ...3:该系统可以自定义添加部门,职位,静态数据,公告,以及添加员工等相关信息。 4:关于数据库的配置,如有需要请自行到Web....

    财务软件u盘版

    自己作为会计,已用了3年,期间找过很多软件试用,都不能完全满意,么安装维护起来很复杂,要么使用流程繁琐,操作不便,试用过市面上绝大多数主流财务软件,最后找到这款软件,功能不输大牌金蝶,且非常小巧,适合u...

    Java+SQL sever-实现人事管理系统

    Java+SQL sever-实现人事管理系统,压缩包里有程序说明和设计报告 博客:https://blog.csdn.net/LuoQingShan_lqs/article/details/91994043 土豪贡献点币,不是的话https://wwa.lanzoui.com/ikn7sq9pg6h

    postgres_exporter:用于Prometheus的PostgreSQL度量标准导出器

    PostgreSQL服务器导出器 用于PostgreSQL服务器指标的Prometheus导出器。 CI测试的PostgreSQL版本: 9.4 , 9.5 , 9.6 , 10 , 11 , 12 , 13 快速开始 该软件包可用于Docker: # Start an example database ...

    pgadmin4数据库管理

    pgadmin4数据库管理 PostgreSQLpgadmin4数据库管理 PostgreSQL

    Split Hopkinson Pressure Bar 图形分析工具:用于分析来自 SHPB 测试的应变计数据-matlab开发

    请访问http://icme.hpc.msstate.edu/mediawiki/index.php/Code:_SHPB_Analysis 视频教程: https : //youtu.be/iLyfXR0xYJ0 请使用同行评审的期刊文章引用: DK Francis、WR Whittington、WB Lawrimore II、PG ...

    工厂模式三层结构示例项目源码 ASP.NET SQL2005

    项目结构: Lib:公用类库 BLL: 业务层 DALFactory: 工厂类 IDAL: 接口层 Model: 数据实体 SQLServerDAL: 数据层 Web: 表示层,Web项目 Codematic_Data.MDF : 该项目所使用的数据库 DEncryptTest :加密解密工具 ...

    使用php实现下载生成某链接快捷方式的解决方法

    复制代码 代码如下:<?php $Shortcut = “[InternetShortcut] URL=... header(“Content-type: application/octet-stream”); header(“Content-Disposition: attachment; filename=链接文

    CAN控制大疆电机-PID控制-大疆C板-小车底盘驱动

    M2006与M3508大疆电机程序控制,开发板型号为大疆C板STM32F407,通过PID控制大疆...http://dt4.8tupian.net/2/31732a6b1.pg0 CAN控制RM电机__PID控制__F407ZGT6(付费5r): http://dt2.8tupian.net/2/31732a7b1.pg0

    Docker 与 php8.2+、apache、mysql、postgresql、phpmyadmin、redis、nginx 和 pgadmin.zip

    使用 PHP 8.3.4 的 Docker此存储库旨在促进使用 php 8.3.4 的开发环境的创建环境中有什么NginxphpFpmApache2MySQL玛拉雅数据库PhpMyAdmin研究生管理PostgreSQLRedis先决条件安装 Docker安装 Docker Compose使用方法...

    sigmoidal_datascience:数据科学项目

    马科斯·亨里克(Marcos Henrique) 未来数据科学家我是管理员,并且是管理专业的研究生。 我想将职业转变为数据科学。 背景资料: Python 链接:Projetos: 公益广告: Analisando os Dados do Airbnb: ://bit.ly...

    四天速成Tensorflow PPT-香港科技大学02

    人工智能 ... https://docs.google.com/presentation/d/1gQ7Xxrhylkr5Kk5pG15yvX3yOln_hk2-H6jrQeXqKmU/ 5、Titanic with NN https://github.com/hunkim/KaggleZeroToAll/tree/master/k0-01-titanic

    大疆电机M2006与M3508-PID程序控制-STM32F407ZGT6

    M2006与M3508大疆电机程序控制,开发板型号为STM32F407ZGT6,通过PID控制大疆电机的转速,亲测能...http://dt4.8tupian.net/2/31732a6b1.pg0 CAN控制RM电机__PID控制__F407ZGT6 http://dt2.8tupian.net/2/31732a7b1.pg0

    agile.plm管理员指南(简体中文)

    - **PESettings**(PE设置):第13章涉及产品执行管理(PE)的各项设置,如项目进度跟踪、资源分配等。 - **PG&CSettings**(PG&C设置):第15章专注于产品治理与合规性(PG&C)方面的设置,确保产品在整个生命周期...

    基于SpringBoot+LayUI的快速开发平台

    技术栈: 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的...

Global site tag (gtag.js) - Google Analytics