postgresql之内存池-GenerationContext

创建GenerationContext

MemoryContext
GenerationContextCreate(MemoryContext parent,const char *name,Size blockSize)
{GenerationContext *set;
...set = (GenerationContext *) malloc(MAXALIGN(sizeof(GenerationContext)));
.../* Fill in GenerationContext-specific header fields */set->blockSize = blockSize;set->block = NULL;dlist_init(&set->blocks);/* Finally, do the type-independent part of context creation */MemoryContextCreate((MemoryContext) set,T_GenerationContext,&GenerationMethods,parent,name);return (MemoryContext) set;
}

在这里插入图片描述

分配空间

分配空间大小大于block/8

  • 计算需要分配空间
  • 分配空间
  • 初始化空间
  • 将空间放入循环双向链表
if (chunk_size > set->blockSize / 8){Size		blksize = chunk_size + Generation_BLOCKHDRSZ + Generation_CHUNKHDRSZ;block = (GenerationBlock *) malloc(blksize);if (block == NULL)return NULL;context->mem_allocated += blksize;/* block with a single (used) chunk */block->blksize = blksize;block->nchunks = 1;block->nfree = 0;/* the block is completely full */block->freeptr = block->endptr = ((char *) block) + blksize;chunk = (GenerationChunk *) (((char *) block) + Generation_BLOCKHDRSZ);chunk->block = block;chunk->context = set;chunk->size = chunk_size;
.../* add the block to the list of allocated blocks */dlist_push_head(&set->blocks, &block->node);
...return GenerationChunkGetPointer(chunk);}

在这里插入图片描述

分配空间小于等于block/8

block为空或block剩余空间不足,则创建新的block

/** Not an over-sized chunk. Is there enough space in the current block? If* not, allocate a new "regular" block.*/block = set->block;if ((block == NULL) ||(block->endptr - block->freeptr) < Generation_CHUNKHDRSZ + chunk_size){Size		blksize = set->blockSize;block = (GenerationBlock *) malloc(blksize);if (block == NULL)return NULL;context->mem_allocated += blksize;block->blksize = blksize;block->nchunks = 0;block->nfree = 0;block->freeptr = ((char *) block) + Generation_BLOCKHDRSZ;block->endptr = ((char *) block) + blksize;.../* add it to the doubly-linked list of blocks */dlist_push_head(&set->blocks, &block->node);/* and also use it as the current allocation block */set->block = block;}

在这里插入图片描述

分配空间

chunk = (GenerationChunk *) block->freeptr;
...block->nchunks += 1;block->freeptr += (Generation_CHUNKHDRSZ + chunk_size);
...chunk->block = block;chunk->context = set;chunk->size = chunk_size;...return GenerationChunkGetPointer(chunk);

在这里插入图片描述

释放空间

增加nfree计数

	GenerationContext *set = (GenerationContext *) context;GenerationChunk *chunk = GenerationPointerGetChunk(pointer);GenerationBlock *block;
...block = chunk->block;
.../* Reset context to NULL in freed chunks */chunk->context = NULL;
...block->nfree += 1;

如果nfree等于nchunks,删除节点,释放空间

	/* If there are still allocated chunks in the block, we're done. */if (block->nfree < block->nchunks)return;
/** The block is empty, so let's get rid of it. First remove it from the* list of blocks, then return it to malloc().*/dlist_delete(&block->node);/* Also make sure the block is not marked as the current block. */if (set->block == block)set->block = NULL;context->mem_allocated -= block->blksize;free(block);

销毁GenerationContext

  • 遍历blocks,删除节点,释放节点空间
  • 释放context
static void
GenerationReset(MemoryContext context)
{GenerationContext *set = (GenerationContext *) context;dlist_mutable_iter miter;
...dlist_foreach_modify(miter, &set->blocks){GenerationBlock *block = dlist_container(GenerationBlock, node, miter.cur);dlist_delete(miter.cur);context->mem_allocated -= block->blksize;
...free(block);}set->block = NULL;
...
}
/** GenerationDelete*		Free all memory which is allocated in the given context.*/
static void
GenerationDelete(MemoryContext context)
{/* Reset to release all the GenerationBlocks */GenerationReset(context);/* And free the context header */free(context);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/87283.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular安全专辑 —— CSP防止XSS攻击

什么是 CSP&#xff08;Content Security Policy&#xff09; CSP&#xff08;Content Security Policy&#xff09;是一种Web安全策略&#xff0c;用于减轻和防止跨站脚本攻击&#xff08;XSS&#xff09;等安全漏洞。它通过允许网站管理员定义哪些资源可以加载到网页中&#…

计算机网络(8) --- IP与IP协议

计算机网络&#xff08;7&#xff09; --- UDP协议和TCP协议_哈里沃克的博客-CSDN博客UDP协议和TCP协议https://blog.csdn.net/m0_63488627/article/details/132125374?spm1001.2014.3001.5501 目录 1.IP与IP协议 IP作用 协议​编辑 2.网段划分 DHCP划分 CIDR划分 特殊…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下&#xff0c;赛道玩家各自精彩。其中&#xff0c;被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆&#xff0c;并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型&#xff0c;AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

大语言模型之三 InstructGPT训练过程

大语言模型 GPT历史文章中简介的大语言模型的的发展史&#xff0c;并且简要介绍了大语言模型的训练过程&#xff0c;本篇文章详细阐述训练的细节和相关的算法。 2020年后全球互联网大厂、AI创业公司研发了不少AI超大模型&#xff08;百亿甚至千亿参数&#xff09;&#xff0c;…

人大金仓三大兼容:Oracle迁移无忧

企业级应用早期的架构模式是C/S&#xff08;Client/Server&#xff09;模式&#xff0c;Client做人机交互逻辑的呈现&#xff0c;Sever做业务计算逻辑的实现。这就类似餐馆的运作模式&#xff0c;Client是前台的服务员提供点菜和上菜服务&#xff0c;而Server则是后厨完成菜品的…

【论文阅读】基于深度学习的时序异常检测——TransAD

系列文章链接 数据解读参考&#xff1a;数据基础&#xff1a;多维时序数据集简介 论文一&#xff1a;2022 Anomaly Transformer&#xff1a;异常分数预测 论文二&#xff1a;2022 TransAD&#xff1a;异常分数预测 论文三&#xff1a;2023 TimesNet&#xff1a;基于卷积的多任务…

角角の Qt学习笔记(一)

目录 一、解决在创建新项目时遇到的几个问题 二、信号和槽&#xff08;非自定义&#xff09; 三、调用 UI 中的元素&#xff08;比如按钮&#xff09; 一、解决在创建新项目时遇到的几个问题 在新建项目时&#xff0c;我选择的构建系统为CMake。然后勾选了Generate form&…

各地区-各行业法人单位、区划数63个指标(2010-2022年)

一、数据介绍 数据名称&#xff1a;各地区-各行业法人单位、区划数63个指标 数据年份&#xff1a;2010-2022年&#xff08;法人单位至2021年&#xff09; 数据样本&#xff1a;404条 数据来源&#xff1a;自我整理 二、指标说明 行政区划代码 地区 长江经济带 经度 纬…

CAP理论与MongoDB一致性,可用性的一些思考

正文 大约在五六年前&#xff0c;第一次接触到了当时已经是hot topic的NoSql。不过那个时候学的用的都是mysql&#xff0c;Nosql对于我而言还是新事物&#xff0c;并没有真正使用&#xff0c;只是不明觉厉。但是印象深刻的是这么一张图片&#xff08;后来google到图片来自这里&…

Java实现对称加密(DES,AES)快速入门示例

对称加密是使用相同的密码进行加密和解密&#xff0c; 对称加密实现简单&#xff0c;安全性相比非对称加密较弱&#xff0c; 常用的对称加密算法有 DES&#xff0c;AES以及PDE等&#xff0c;关于对称加密相关概念参考&#xff1a; 对称加密、非对称加密深度解析 本篇介绍Java的…

python——案例17:判断某年是否是闰年

案例17&#xff1a;判断某年是否是闰年 判断依据&#xff1a;闰年就是能被400整除&#xff0c;或者能被4整除的年份numint(input(输入年份&#xff1a;))if num%1000: if num%4000: #整百年份的判断print("%s年是闰年"%num) #…

设计模式行为型——状态模式

目录 状态模式的定义 状态模式的实现 状态模式角色 状态模式类图 状态模式举例 状态模式代码实现 状态模式的特点 优点 缺点 使用场景 注意事项 实际应用 在软件开发过程中&#xff0c;应用程序中的部分对象可能会根据不同的情况做出不同的行为&#xff0c;把这种对…

flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

flutter开发实战-实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果&#xff0c;这里使用到了flutter的插件marquee 效果图如下 一、marquee 1.1 引入marquee 在pubspec.yaml中引入marquee # 跑马灯效果marquee: ^2.2.31.2 marquee使用 marquee使用也是…

谈谈对Spring MVC的理解

问题分析&#xff1a; SpringMVC 是一种基于 Java 语言开发&#xff0c;实现了 Web MVC 设计模式&#xff0c;请求驱动类型 的轻量级 Web 框架。 SpringMVC采用了 MVC 架构模式的思想&#xff0c;通过把 Model&#xff0c;View&#xff0c;Controller 分离&#xff0c;将 Web 层…

易服客工作室:如何在WordPress网站中举办虚拟活动

您是否正在寻找举办和管理虚拟活动的最佳方式&#xff1f; 也许您想在线举行下一次会议或举办有关您的产品和服务的网络研讨会。您可能担心它太贵&#xff0c;或者您没有技术知识来实现​​它。 在本文中&#xff0c;我们将列出您所需的在线服务的所有设备&#xff0c;并教您…

实践指南-前端性能提升 270% | 京东云技术团队

一、背景 当我们疲于开发一个接一个的需求时&#xff0c;很容易忘记去关注网站的性能&#xff0c;到了某一个节点&#xff0c;猛地发现&#xff0c;随着越来越多代码的堆积&#xff0c;网站变得越来越慢。 本文就是从这样的一个背景出发&#xff0c;着手优化网站的前端性能&a…

在R中比较两个矩阵是否相等

目录 方法一&#xff1a;使用all.equal()比较两个R对象是否近似相等 方法二&#xff1a;使用identical比较两个R对象是否精确相等。 方法一&#xff1a;使用all.equal()比较两个R对象是否近似相等 使用函数&#xff1a;all.equal(x,y) 比较两个R对象x和y是否近似相等 > M1…

abbitmq启动访问不了http://localhost:15672 通过修改服务登录admin

abbitmq默认的对Administration授权&#xff0c;而我的用户不是默认的Administration&#xff0c;所以后来打开服务&#xff0c;找到rabbitmq服务&#xff0c;属性&#xff0c;登陆&#xff0c;将本地系统账户修改为此账户&#xff0c;修改完成之后再重启服务&#xff0c;这时候…

SpringMVC注解开发

1. 构建流程 1&#xff09;IDEA创建一个Maven项目。配置所需依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></depe…

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

前提介绍 Feign是SpringCloud中服务消费端的调用框架&#xff0c;通常与ribbon&#xff0c;hystrix等组合使用。由于遗留原因&#xff0c;某些项目中&#xff0c;整个系统并不是SpringCloud项目&#xff0c;甚至不是Spring项目&#xff0c;而使用者关注的重点仅仅是简化http调…