话说
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;
其中realloc
由静态函数AllocSetRealloc()
实现,具体签名在下面。它实现了AllocSet/MemoryContext
相关的内存再分配。AllocSetRealloc()
方法
返回按请求大小新分配的内存的指针。把新分配的内存加入到set
中,把传进来的pointer
相关的旧内存里的内容拷贝到新内存里,把旧内存释放掉。新分配的内存有可能是在原来的基础上再在后面加一部分,这样就不用拷贝旧内存内容和释放就内存了。
static
void
* AllocSetRealloc(MemoryContext context, void
*pointer, Size size)
在某个context
里的chunk
的内存不够用的时候,就调用MemoryContext
的repalloc()
方法,该方法再调用
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
分享到:
相关推荐
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通道)格式的图片(注:“导入”操作只是引入了一个替换的标记,此时并未进行实际的替换) 如果想取消对当前图片的替换可以使用...
在JavaScript(JS)中实现一个仿百度登录弹出界面,主要涉及到前端开发中的网页交互、CSS样式设计以及JavaScript脚本编程。以下将详细介绍这个过程的关键知识点: ... 2. **CSS样式**: - 使用CSS来设计登录弹窗的...
标题中的“10种方法绕过云锁以及tamber”指的是针对云锁(WAF,Web Application Firewall)的10种渗透测试技术,目的是规避云锁的安全防护机制。描述中提到,通过测试发现云锁的一个漏洞,即如果SQL查询语句中包含...
蓝桥杯单片机第十届省赛题程序,里面有hex代码可提供下载调试,需要源码和赛题请解压里面的一个压缩包,里面包含源码和hex文件的源代码。非常的银杏,非常的好用。
1:全站采用AJAX+SQLSEVER+存储过程+三层架构开发,大大提高了访问的速度与安全。 ...3:该系统可以自定义添加部门,职位,静态数据,公告,以及添加员工等相关信息。 4:关于数据库的配置,如有需要请自行到Web....
自己作为会计,已用了3年,期间找过很多软件试用,都不能完全满意,么安装维护起来很复杂,要么使用流程繁琐,操作不便,试用过市面上绝大多数主流财务软件,最后找到这款软件,功能不输大牌金蝶,且非常小巧,适合u...
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
请访问http://icme.hpc.msstate.edu/mediawiki/index.php/Code:_SHPB_Analysis 视频教程: https : //youtu.be/iLyfXR0xYJ0 请使用同行评审的期刊文章引用: DK Francis、WR Whittington、WB Lawrimore II、PG ...
项目结构: Lib:公用类库 BLL: 业务层 DALFactory: 工厂类 IDAL: 接口层 Model: 数据实体 SQLServerDAL: 数据层 Web: 表示层,Web项目 Codematic_Data.MDF : 该项目所使用的数据库 DEncryptTest :加密解密工具 ...
复制代码 代码如下:<?php $Shortcut = “[InternetShortcut] URL=... header(“Content-type: application/octet-stream”); header(“Content-Disposition: attachment; filename=链接文
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 8.3.4 的 Docker此存储库旨在促进使用 php 8.3.4 的开发环境的创建环境中有什么NginxphpFpmApache2MySQL玛拉雅数据库PhpMyAdmin研究生管理PostgreSQLRedis先决条件安装 Docker安装 Docker Compose使用方法...
马科斯·亨里克(Marcos Henrique) 未来数据科学家我是管理员,并且是管理专业的研究生。 我想将职业转变为数据科学。 背景资料: Python 链接:Projetos: 公益广告: Analisando os Dados do Airbnb: ://bit.ly...
人工智能 ... 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大疆电机程序控制,开发板型号为STM32F407ZGT6,通过PID控制大疆电机的转速,亲测能...http://dt4.8tupian.net/2/31732a6b1.pg0 CAN控制RM电机__PID控制__F407ZGT6 http://dt2.8tupian.net/2/31732a7b1.pg0
- **PESettings**(PE设置):第13章涉及产品执行管理(PE)的各项设置,如项目进度跟踪、资源分配等。 - **PG&CSettings**(PG&C设置):第15章专注于产品治理与合规性(PG&C)方面的设置,确保产品在整个生命周期...
技术栈: 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的...