PostgreSQL数据库动态共享内存管理器——Dynamic shared memory areas

news2024/9/27 16:54:02

dsm.c提供的功能允许创建后端进程间共享的共享内存段。DSA利用多个DSM段提供共享内存heap;DSA可以利用已经存在的共享内存(DSM段)也可以创建额外的DSM段。和系统heap使用指针不同的是,DSA提供伪指针,可以转换为backend-local指针,但是该伪指针可以在后端进程之间共享,可以用于构建共享数据结构。
每个DSA管理多个DSM段,可以向其中添加新段,不需要时detach它们。每个段包含多个4KB页,一个free page manager(用于跟踪空闲页的连续运行)以及一个页面映射page map(用于跟踪分配给每个页面的对象的来源)。分配超过8KB的空间请求通过通过选择一个段并在其空闲页管理器中查找连续的空闲页来处理。较小的分配请求使用选定大小的对象池来处理。每个池由多个16页(64KB)超级块组成,以与大型对象相同的方式分配。大型对象和新超级块的分配由单个LWLock进行串行化,但从预先存在的超级块分配小型对象时,每个池使用一个LWLock。目前,每个大小类有一个池,因此有一个锁。提高并发性的每核心池和减少由此产生的碎片的策略是未来研究的领域。每个超级块都用一个“span”来管理,它跟踪超级块的空闲列表。自由请求是通过查看页面映射来处理的,以查找分配地址的跨度,这样小对象就可以返回到适当的自由列表中,大对象页面可以直接返回到自由页面映射中。在分配时,用于选择段和超级块的简单启发式方法试图鼓励集中占用的内存,从而增加了整个超级块变为空并返回到空闲页管理器的可能性,而整个段变为空并且返回到操作系统的可能性。Each DSA area manages a set of DSM segments, adding new segments as required and detaching them when they are no longer needed. Each segment contains a number of 4KB pages, a free page manager for tracking consecutive runs of free pages, and a page map for tracking the source of objects allocated on each page. Allocation requests above 8KB are handled by choosing a segment and finding consecutive free pages in its free page manager. Allocation requests for smaller sizes are handled using pools of objects of a selection of sizes. Each pool consists of a number of 16 page (64KB) superblocks allocated in the same way as large objects. Allocation of large objects and new superblocks is serialized by a single LWLock, but allocation of small objects from pre-existing superblocks uses one LWLock per pool. Currently there is one pool, and therefore one lock, per size class. Per-core pools to increase concurrency and strategies for reducing the resulting fragmentation are areas for future research. Each superblock is managed with a ‘span’, which tracks the superblock’s freelist. Free requests are handled by looking in the page map to find which span an address was allocated from, so that small objects can be returned to the appropriate free list, and large object pages can be returned directly to the free page map. When allocating, simple heuristics for selecting segments and superblocks try to encourage occupied memory to be concentrated, increasing the likelihood that whole superblocks can become empty and be returned to the free page manager, and whole segments can become empty and be returned to the operating system.

dsa_create/dsa_create_in_place

dsa_create函数在新的一个DSM段中创建一个新的shared area。dsa_create_in_place函数在已经存在的共享内存空间上创建一个新的shared area。

dsa_area *dsa_create(int tranche_id){
	dsm_segment *segment = dsm_create(DSA_INITIAL_SEGMENT_SIZE, 0); /* Create the DSM segment that will hold the shared control object and the first segment of usable space. */	
	dsm_pin_segment(segment); /* All segments backing this area are pinned, so that DSA can explicitly control their lifetime (otherwise a newly created segment belonging to this area might be freed when the only backend that happens to have it mapped in ends, corrupting the area). */

	/* Create a new DSA area with the control object in this segment. */
	dsa_area   *area = create_internal(dsm_segment_address(segment), DSA_INITIAL_SEGMENT_SIZE, tranche_id, dsm_segment_handle(segment), segment);

	/* Clean up when the control segment detaches. */
	on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place, PointerGetDatum(dsm_segment_address(segment)));

	return area;
}
dsa_area *dsa_create_in_place(void *place, size_t size,int tranche_id, dsm_segment *segment){
	dsa_area   *area = create_internal(place, size, tranche_id, DSM_HANDLE_INVALID, NULL);

	/* Clean up when the control segment detaches, if a containing DSM segment was provided. */
	if (segment != NULL)
		on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place, PointerGetDatum(place));
	return area;
}

请添加图片描述

dsa_attach/dsa_attach_in_place

dsa_allocate dsa_free

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hbase基础概念

HBase 一、HBase的数据模型1.HBase数据存储结构2.HBase存储概念3.HBase基本架构 二、HBase Shell1.DDL(Data Definition Language)2.DML(Data Manipulation Language) 三、HBase组成架构1. Master架构2. RegionServer架构 四、HBase读写流程1.写流程MemS…

AI数字人:金融数字化转型的“关键先生”

今年年初ChatGPT的火热,在全球掀起一阵生成式AI(AIGC)热潮。国外的OpenAI、国内的百度等企业,都在AIGC上强力布局。 各种应用场景中,AIGC助力的数字人引起了市场注意。 事实上,数字人不是个新鲜事。早在1…

Linux 系统下 “Verilog” 编程配置

文章目录 简介Verilog HDLIverilogGtkwave 环境搭建软件的安装Vim 之 Verilog 语法高亮配置 简单的计数器示例计数器程序的编写仿真测试 简介 Verilog HDL Verilog HDL 是一种用于设计数字电路的硬件描述语言,它可以用来描述数字电路的功能和结构,并且可…

云服务器AccessKey执行命令

人之所以痛苦,在于追求错误的东西。如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。 好好的管教你自己,不要管别人。 漏洞实战 查看所有实例信息 A.exe -a xxx -s xxx ecs -list执行命令 A.exe -a…

新能源汽车充电桩最重要的模块设备是什么

你是否曾经遇到过充电桩无法给你电动汽车提供电源的问题?或者你曾经怀疑过为什么充电桩速度如此缓慢?其实,这一切都可能与充电桩最重要的模块设备——控制主板有关。 交流充电桩由充电桩外壳、控制主板、刷卡模块、计费控制、显示屏、通信模块、继电器、开关电源等…

JumpServer堡垒机

文章目录 JumpServer堡垒机堡垒机介绍堡垒机产生的原因堡垒机主要功能 Jumpserver安装与配置Jumpserver Web界面用户管理资产管理添加Linux主机 命令过来规则创建审计台操作说明会话审计日志审计 工作台操作说明邮箱配置 JumpServer堡垒机 堡垒机介绍 下图来自百度百科 堡垒机…

面试常问八股文之java篇

JAVA篇 1、为什么重写equals方法的时候要重写hashCode方法? 为了不违背“相同对象必须要有相同hash值"的约定,对于基本数据类型比较的是数值是否相等,对于引用类型数据比较的是对象地址是否同等,在object中equal方法也是默…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候,通常使用的方式是域名,而不是IP地址,因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器,DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

软件升级相关

文章目录 一、升级方案1、移动端升级2、window 升级SquirrelSparkle 一、升级方案 1、移动端升级 腾讯Bugly ,支持Android 平台、iOS平台、Cocos2D、Unity3D。 2、window 升级 windows的exe的打包及升级工具 Squirrel Squirrel 是一款免费的开源exe升级工具&a…

NFT市场泡沫破裂了吗?投资NFT是否仍然安全?

近期,NFT市场的价格出现了明显的下跌趋势,许多人开始担心NFT市场是否已经进入了泡沫破裂的阶段。但是,我们需要认真分析这个问题,并且探讨投资NFT是否仍然安全。 NFT(Non-Fungible Token)是一种非同质化代币…

JMerter安装配置以及使用(笔记记录)

JMerter安装配置以及使用(笔记记录) 安装JDK安装JMeterJMeter使用元件执行的顺序参数详解参数配置之CSV数据文件设置断言响应断言JSON断言 数据提取XPath提取器JSON提取器 JMeter属性JMeter录制脚本JMeter直连数据库逻辑控制器如果(IF&#x…

reference文献引用列表要求

目录 1、基本要求 2、文献格式 3、引用技巧 4、特殊情况: 有新闻和网络文章的引用: 1、基本要求 对于每一篇paper,我们需要按照文中出现的顺序,列出文中引用的所有文献。 对于文献的引用有如下要求: a】顺序要求…

【node.js】03-http模块

目录 一、什么是http模块 二、创建基本的WEB服务器 三、req请求对象 四、res响应对象 五、根据不同的url响应不同的JSON内容 一、什么是http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法,…

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积…

MonsterInsights Pro 8.18.0 Google Analytics + All Addons Pack

MonsterInsights适用于 WordPress 的 Google Analytics(分析)插件,功能强大 MonsterInsights 是适用于 WordPress 的最佳 Google Analytics(分析)插件。这些功能使 MonsterInsights 成为市场上功能最强大且用户友好的 …

网络通信原理(第十八课)

网络通信原理(第十八课) 4.1 回顾 1.什么是TCP/IP 目前应用广泛的网络通信协议集 国际互联网上电脑相互通信的规则、约定。 2.主机通信的三要素 IP地址:用来标识一个节点的网络地址(区分网络中电脑身份的地址,如人有名字) 子网掩码:配合IP地址确定网络号 IP路由:网…

Linux笔记——磁盘进行分区与挂载介绍

系列文章目录 Linux笔记——管道相关命令以及shell编程 文章目录 系列文章目录 前言 分区与挂载 1 分区 1.1 分区示意图​编辑 1.2 分区介绍 2 硬盘的挂载 3 增加一块硬盘 3.1 增加一块硬盘 3.2 硬盘进行分区 3.3 格式化磁盘 4 卸载 5 查看磁盘使用情况 6 一些…

javascript 7种继承-- 原型链继承分析(1)

文章目录 概要继承的进化史技术名词解释原型链的作用原型链继承案列分析源代码解析效果图预留问题小结 概要 这阵子在整理JS的7种继承方式,发现很多文章跟视频,讲解后都不能让自己理解清晰,索性自己记录一下,希望个位发表需要修改…

10分钟实现任务调度平台搭建

日常项目中,会有很多需要定时执行的任务,而这些任务的变化比较多,可能随时都要调整,那么对调度的灵活性要求比较高。我们传统的Spring Task或者Quartz,可以实现定时任务调度,但是内置在代码里,修…

Matlab Kappa系数和总体精度OA计算

axlsread(D:\homework\精度验证产品.xlsx); Predicteda(:,1); vala(:,2); g0; for i1:size(a,1) %记录验证结果是否与实际值一致if(Predicted(i)val(i))gg1;end end OAg/(size(a,1));% 计算混淆矩阵 confusion_matrix confusionmat(val, Predicted);% 计算总样本数 total_sa…