7、核心:可扩展的共享内存数组结构-分块映射表和数组头

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        这篇是重点,如何构建可扩展的数组结构。

目录

一、分块映射表

二、数组头


一、分块映射表

        如果不支持增长,很简单,只需要一个全局变量存地址就可以了,不需要分块映射表。

        为了支持增长,需要维护一个数组,存储每个块的ID和对应的数据范围:

	struct struct_T_ARRAY_VMAP{int shm_id;//共享内存ID,第一个总是和array_head在一起,其余块只有数据T_SHM_SIZE handle_begin;//此块对应的handle范围[handle_begin,handle_end)T_SHM_SIZE handle_end;};struct struct_T_ARRAY_VMAP_S{long size;//使用的个数struct_T_ARRAY_VMAP m_vmaps[T_ARRAY_VMAP_MAX_SIZE];void clearVMAP(){memset(this, 0, sizeof(struct_T_ARRAY_VMAP_S));}bool AddVMAP(int _shm_id, T_SHM_SIZE oldCapacity, T_SHM_SIZE blocksize){if (size + 1 >= T_ARRAY_VMAP_MAX_SIZE)return false;m_vmaps[size].shm_id = _shm_id;m_vmaps[size].handle_begin = oldCapacity;m_vmaps[size].handle_end = oldCapacity + blocksize;++size;return true;}};

        注意,分块映射表是共享内存数据头的一部分,共享内存ID和地址的关系在私有内存存储(要深刻理解哪些属于“共享”、哪些属于私有)。

        T_ARRAY_VMAP_MAX_SIZE是个宏,定义最大分块数。

        分块映射表不复杂,只是个定长数组,带有有效数据个数。

        从可伸缩性的角度,数组长度也可以放在数据里面,这样如果修改了数组长度仍然可以正确操作,只不过相对于实际的数据量(百万千万以上级,数据很少就没必要用共享内存),这点空间微不足道,直接设置到足够大就可以了。毕竟,系统能支持的共享内存块数量和共享内存总量都是很有限的。

二、数组头

        数组头需要包含足够信息让程序连接到共享内存后能正确访问数据,数组头里的灵活信息越多,兼容性越好,当然程序也越复杂。

        数组头结构:

		struct array_head_new{CMeta meta;sstring<64> name;T_SHM_SIZE capacity;T_SHM_SIZE size;struct_T_ARRAY_VMAP_S vmaps;//分块影射表long ____;//用来确保array_head用8字节对齐T_USER_HEAD userhead;};

        这是新版数组头,所以名字带个“new”。

        CMeta,是元数据描述结构,一个256字节的数据,包含全球唯一ID、字节序、int大小等信息。详见我的相关文章。

        sstring<64> name,这是共享内存的名字,预定义的。名字和ID对应,但ID只在程序的私有内存使用,不进入共享内存。

        容量、大小,总的容量和大小。

        分块映射表,前面已经介绍过。数组头仅仅出现在第一个块,后续的块只有数据。

        long ____,这是一个无意义的数据,仅仅用来保证按照long来对齐。(这可能是个BUG,因为以前仅仅在64位的linux上运行,long就是8字节,但其他系统未必如此)

        T_USER_HEAD userhead,用户提供的数据头。整个系统是基于模板的,这个类型来自模板参数。


(这里是结束)

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

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

相关文章

关于pip Install与conda install

conda解决依赖的问题很弱&#xff0c;环境包多了以后经常要解决依赖几分钟到十几分钟。我个人感觉比较好的实践是conda创建虚拟环境&#xff0c;装torch/tensorflow等比较难装的包&#xff0c;基础环境配好以后&#xff0c;后面装包一律用pip。 conda&#xff0c;pip&#xff0…

Netty Websocket

一、WebSocket 协议概述 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务端主动向客户端推送数据&#xff0c;从而实现了实时通信。WebSocket 建立在 HTTP 之上&#xff0c;但与 HTTP 的轮询&#xff08;Polling&#xff09;和长轮询&#xff08;Long Pol…

python的tkinter、socket库开发tcp的客户端和服务端

一、tcp通讯流程和开发步骤 1、tcp客户端和服务端通讯流程图 套接字是通讯的利器&#xff0c;连接时要经过三次握手建立连接&#xff0c;断开连接要经过四次挥手断开连接。 2、客户端开发流程 1&#xff09;创建客户端套接字 2&#xff09;和服务端器端套接字建立连接 3&#x…

Linux·基本指令(下)

1. mv 指令 (move) 语法&#xff1a;mv[选项] 源文件或目录 目标文件或目录 功能&#xff1a;将源文件或目录剪贴到一个新位置&#xff0c;或给源文件或目录改名但不会改变其内容 常用选项&#xff1a; -f &#xff1a;force 强制&#xff0c;如果目标文件已经存在&#xff0c;…

HCIE-AI大模型直通车火热报名中

第一阶段&#xff1a;HCIA-AI Solution Architect&#xff08;直播&#xff0c;39课时&#xff09; 该阶段详细介绍 AI 大模型所需基础技术栈&#xff0c;包含深度学习基础、计算机视觉技术、自然语言处理技术、华为开源深度学习框架 MindSpore、注意力制、Transformer 架构&am…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计&#xff0c;单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

CentOS Stream 卸载 Podman 并安装 Docker 的方法

目录 卸载 Podman 安装 Docker Podman 是一个无守护进程的容器引擎&#xff0c;旨在提供与 Docker 类似的命令行接口&#xff0c;但不需要守护进程运行。Podman 是 Red Hat 的开源项目&#xff0c;具有安全性、兼容性和灵活性等优点。 CentOS Stream 默认安装了 Podman 来代…

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、简介 二、项目结构 三、代码结构 1.生成框架 Spring Initializr 快速生成一个初始的项目代码&#xff0c;会生成一个demo文件 打开intellj idea&#xff0c;导入demo文件 2.目录结构 源码都放在src-ma…

“论软件维护方法及其应用”精选范文,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后&#xff0c;直至软件被淘汰的整个时间范围内&#xff0c;为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中&#xff0c;软件需要维护的原因是多种多样的&#xff0c; 根据维护的原因不同&#xff0c;可以将软件维护…

Lua基础知识入门

1 基础知识 标识符&#xff1a;标识符的定义和 C语言相同&#xff1a;字母和下划线_ 开头&#xff0c; 下划线_ 大写字母一般是lua保留字&#xff0c; 如_VERSION 全局变量&#xff1a;默认情况下&#xff0c;变量总是认为是全局的&#xff0c;不需要申明&#xff0c;给一个变…

window服务器thinkphp6 路由错误index.php

一&#xff0c;问题说明 访问——站点/index.php/admin/system/global————出现404错误 不想去掉index.php&#xff0c;想要保留这个————必须配置伪静态 默认的伪静态&#xff0c;是不要index.php&#xff0c;用来隐藏index.php&#xff0c;&#xff08;通过伪静态加…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代&#xff0c;视频已成为我们记录生活、分享快乐的重要工具。然而&#xff0c;大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下&#xff0c;轻松减小视频文件大小&#xff1f;今天&#xff0c;就让我们一起探索苹果电脑上的几种高效视频压缩…

Java中的方法重载详解

Java中的方法重载详解 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 方法重载的定义和特点 方法重载&#xff08;Method Overloading&#xff09;指在同一个类中&#xff0c;允许有多个同名方…

HP Superdome2小型机监控指标解读

监控易是一款专注于IT基础设施监控的软件&#xff0c;能够实时监控服务器的各项性能指标&#xff0c;确保服务器的稳定运行。针对HP Superdome2小型机&#xff0c;监控易通过IPMI和网页抓取数据的方式&#xff0c;监测包括服务器温度、风扇及电压等在内的关键指标&#xff0c;为…

Postfix+Dovecot+Roundcube开源邮件系统搭建系列1-2:系统搭建目标+MariaDB数据库配置(MySQL)

1. 系统搭建目标 通过本系列文章&#xff0c;最终可以部署一套提供如下服务的邮件系统&#xff1a; SMTP服务&#xff1a;由Postfix提供&#xff0c;监听25、465、587端口。POP3服务&#xff1a;由Dovecot提供&#xff0c;监听110、995端口。IMAP服务&#xff1a;由Dovecot提…

springboot3.2 RedisCacheManager配置

1、启用并配置 添加 EnableCaching 注解 并配置 RedisCacheManager package config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import c…

Java基础笔记(面试题)

一、Tomcat中为什么要使用自定义类加载器 Tomcat中可以放多个Java项目的jar文件&#xff0c;如果每个jar文件中都有一个User的类&#xff0c;那么User类在没有自定义类加载器的情况下是只能加载一次&#xff1b;想要加载多次&#xff0c;只能自定义类加载器 二、JDK、JRE、JVM…

项目管理进阶之RACI矩阵

前言 项目管理进阶系列续新篇。 RACI&#xff1f;这个是什么矩阵&#xff0c;有什么用途&#xff1f; 在项目管理过程中&#xff0c;如Team规模超5以上时&#xff0c;则有必要采用科学的管理方式&#xff0c;满足工作需要。否则可能事倍功半。 Q&#xff1a;什么是RACI矩阵 …

【简单介绍Gitea】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【Rust】使用日志记录利器flexi_logger

Flexi_logger简介 ​flexi_logger​是一个功能强大且灵活的日志记录库&#xff0c;用于Rust语言的应用程序。它提供了丰富的配置选项和功能&#xff0c;适用于各种日志记录需求&#xff0c;从简单的控制台输出到复杂的文件日志管理。以下是对flexi_logger​的一些关键功能和特…