一个基于共享内存的内存数据库:1 介绍
初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
一、共享内存概述
1.1 什么是共享内存
共享内存是UNIX系统进程间共享信息的最灵活、最高效的方式。
一般实现为同一块物理内存通过IPC函数映射到不同的进程的地址空间,每个进程对共享内存的修改都直接反映到其它进程。共享内存可以在进程终止后持续存在,只要没有用IPC函数删除或关闭主机,共享内存将一直存在。由于多个进程可以同时修改共享内存,因此还需要使用适当的机制进行同步(例如信号量)。
1.2 使用共享内存的好处
在大型业务系统中,对于时间和空间的要求可能同时趋于极限,既要求尽可能高的处理速度,又要求不超出给定的内存需求。实际情况可能是时间和空间都逼近于主机极限。
能够在时间和空间上同时提高性能的手段就是使用共享内存。共享内存是普通内存,访问机制和私有内存相同,因此具有相同的访问效率。共享内存是对进程间共享的,相同的数据只需要在共享内存中存储一份,不需要每个进程一份拷贝,节省了内存空间。共享内存超越进程存在,因此可以一次构造数据然后不断访问,不需要每次都构造,也可以把构造数据的程序和读取数据的程序分开,对于实时系统而言,这是相当关键的特性。


1.3 使用共享内存的难点
使用共享内存的代价是编程复杂度的增加。使用共享内存所需的技术绝不仅仅是几个IPC函数那么简单。
怎样保证多进程修改不冲突?使用一把锁还是多把锁?使用读优先还是写优先?
怎样保证代码版本正确?使用错误格式的程序可能会毁掉数据。
怎样保证系统可靠?任何一个程序的地址访问错误都可能错误涂改共享内存数据。
由于共享内存连接入进程的地址是不确定的,因此一个普通指针存储在共享内存是无意义的,任何使用指针的数据类型都不能存储在共享内存,基本上说,只有基本数据类型int、float、char等和它们的数组可以放入共享内存,通常使用的C++类型string、vector、set、map等等都是无法使用的。
难道需要退回到C时代吗?
本系统的实践表明,使用一些高级编程技巧可以在共享内存中实现标准的STL容器从而极大地减低客户代码的编程复杂度,而经过仔细规划的安全机制可以显著地提高系统可靠性。
本系统使用了大量深度编程技术,部分技巧即使不是独创的也是很少见的。
二、共享内存数据库
2.1 为什么要开发共享内存数据库
首先我已经实现了一整套共享内存基础结构。详见专题共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客。
实现了统一管理的C++基础共享内存容器,包括数组、set集合、字符串压缩存储、LRU队列等,这些全部都是以兼容STL(C++标准模板库)的方式,最大化地利用模版的运行时高效性和STL的功能来解决C++程序员的需要。
但是这些容器的使用必须由C++代码完成,所有数据结构在程序编译后不可修改,不能在程序运行时增加新的结构,对于系统变动频繁的系统来说,这是很不方便的。
为此,开发灵活性和功能上接近大型数据库而性能又远高于大型数据库的内存数据库就存在需求。
2.2 几种主要的内存数据库产品
eXtremeDB,商业软件 并非磁盘数据库的裁剪,而是专门设计的,号称最快、最可靠,并有最全面的接口(包括两种SQL和两种API),多种索引、事件触发、目标日志。
SolidDB,将基于内存和磁盘的全事务处理数据库引擎、载体级高可用性及强大的数据复制功能紧密地融为一体。
Altibase,提供极限性能、容错能力和事务管理的方便性,特别是在通信、网上银行、证券交易、实时应用和嵌入式系统领域。
TimesTen,可作为高速缓存或嵌入式数据库被部署在应用程序层中,它利用标准的 SQL 接口对完全位于物理内存中的数据存储区进行操作。
SQLite,开源软件,小型SQL数据库,最著名的用途是作为应用程序的磁盘文件。并发性很差,是库锁(锁定整个数据库文件)。GPL,不允许用于非开源商业软件。
其他还有H2 database 、Berkeley DB、FastDB、MonetDB等。
总体而言,商业产品提供了高可靠性和并发性,性能远低于定制的共享内存(作为基础技术的Active共享内存就是一种定制共享内存),TimesTen的“Ten”据说就是能够达到磁盘数据库的十倍的意思,而“十倍”对于定制共享内存来说完全可以忽略不计的。
开源软件可靠性、并发性都差一些,但一般速度就更快一点。
这就是完善程度和速度之间的矛盾,每完善一步速度就减低一点。
自行开发的优势就是可以根据自己的需要来掌握完善程度和性能要求的折衷尺度。
2.3 主要设计目标
速度 远高于文件和数据库(低于现在的C++定制结构)
空间 估计高于大型数据库(低于现在的C++定制结构)
实时性 表级备份恢复,意味着实时间歇取决于表的大小
并发性 库、表、记录三级锁定
三种数据类型 整数、浮点数、字符串,不支持NULL
表和索引 无限制,不同表索引名可相同
表的列 无限制
索引 必须包含主键PK,非主键可以重复
创建表 直接定义表结构
创建索引 通过指定索引列实现
函数化查询 给定索引的查询,可查询部分关键字,= > < >= <=
文件备份恢复 全表操作,非记录级 外围功能
SQL支持 简单sql将在较高版本支持,工作量巨大 高级功能
三、运行环境
支持Sun、HP、IBM的UNIX小型机上使用,采用主机自带的C++编译器。需要使用STL。支持Linux,在CenOS和Ubuntu上验证过。
(未完待续)
相关文章:
一个基于共享内存的内存数据库:1 介绍
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
可视化编程 制作在线点名程序,人工和随机生成两种模式
以下是对这段代码的分析: 一、功能概述 这是一个使用 Python 的 Tkinter 库创建的图形用户界面(GUI)应用程序,主要功能是进行在线点名和随机抽奖。可以模拟在一个有六排六列座位布局的场景中进行点名操作和不同规模的随机抽奖。 二、主要函数和变量 窗口设置和变量初始化:…...
pdb在CDB间搬迁 dblink 与rman
create pluggable database <pdb_name> from <pdb_name><dblink> relocate availability max create_file_destxxxxx;-----改变目录 How to relocate a PDB from one CDB to another with minimal down time -12.2 Release (Doc ID 2396518.1) GOAL How to …...
Linux系统中的fork与vfork的区别
目录 一、引言 二、fork与vfork的基本概念 1.fork() 2.vfork() 三、fork与vfork的区别 1.内存分配策略 2.执行顺序 3.性能 4.安全性 四、总结 本文将详细介绍Linux系统中fork与vfork这两个系统调用的区别,帮助读者更好地理解它们在实际编程中的应用。 一、引言…...
特殊类的设计和类型转换
文章目录 特殊类1.请设计一个类,不能被拷贝2. 请设计一个类,只能在堆上创建对象3. 请设计一个类,只能在栈上创建对象 (★)4. 请设计一个类,不能被继承5. 请设计一个类,只能创建一个对象(单例模式…...
ES模块导入、导出学习笔记
ES模块导入、导出学习笔记 1、命名导出、导入1.1、声明时直接导出1.2、先声明,再导出 2、默认导出2.1、声明时直接导出2.2、先声明,再导出 3、命名导出 VS 默认导出3.1、命名导出3.2、默认导出3.3、同时使用 4、使用 as 关键字4.1、在 import 中使用 as4…...
Bagging: 数量,而不是质量。
由 AI 生成:过度简化的树、引导聚合、集成方法、弱学习器、减少方差 集成方法 — 数量,而不是质量 一、说明 机器学习中的集成方法是指组合多个模型以提高预测性能的技术。集成方法背后的基本思想是聚合多个基础模型(通常称为弱学习器&#…...
维信小程序禁止截屏/录屏
一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机: 用户截屏,被禁用 用户录屏,录制的是空白内容/黑色内容的视频。 二、微信小…...
不同大模型代码解释对比
包含ChatGPT,讯飞星火,通义千问,腾讯元宝,智谱清言。 目标是想让大模型解释一个用于预处理人体骨骼关节三维坐标数据样本进行填补空帧的Python函数。 def f_padding_none(data):s data.copy()# print(pad the null frames with…...
Python函数的编写
函数实现 首先,我们来看一个简单的Python函数,它使用os和os.path模块来遍历当前目录及其所有子目录,并列出所有文件的名称。 import os def list_all_files(startpath): """ 列出指定路径(包括其子目录ÿ…...
Linux下的常用命令分享 二(ubuntu 16.04)
1、ls -l的返回值说明 以图中为例,说明对于cc.txt.tar.gz文件,文件拥有者即创建该文件的人可以对该文件进行读写操作,但不能执行该文件,文件组成员用户可以进行读写操作,但不能执行该文件,其他用户只可读&…...
FPGA随记——OSERDESE2和IERDESE2
http://t.csdnimg.cn/yNvxf---看这个篇吧 这个挺好的 OSERDESE2 模块要求复位信号高电平有效,并且 需要将异步复位信号同步到串行时钟域。 除了用原语调用,还可以用High Speed SelectIO Wizard这个IP 进行调用 针对具体select IO这个IP的使用和介绍&…...
Xmind思维导图领衔,三款常备神器助你2024年思维升级!
到了2024年,信息多得让人眼花,新东西学都学不完。要在这么多信息里保持清醒,快速学东西,对大家来说是个考验。好在,科技帮了我们大忙,比如思维导图软件,它们直观又灵活,帮我们提高思…...
SEO服务值得吗?提升销售和营销策略的5种方法
在不久之前,搜索引擎优化(SEO)通常被视为一个独立的实体,企业把提升排名和推动自然流量作为重点。随后,AI登场了,让每个人都忙于弄清“游戏”的新规则,一些公司因此质疑SEO服务是否值得。答案是…...
传统CV算法——角点特征点提取匹配算法实战
harris角点 角点可以是两个边缘的角点;角点是邻域内具有两个主方向的特征点;角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。或者说,角点就是多条轮廓线之间的交点。…...
小米电视使用adb 卸载自带应用教程
小米电视使用ADB(Android Debug Bridge)卸载自带应用的教程如下。请注意,在操作过程中请确保谨慎行事,避免误删系统关键应用导致电视无法正常使用。 准备工作 下载ADB工具: 在电脑上下载ADB工具。ADB是Android Debug …...
编译FFmpeg动态库
编译FFmpeg动态库 环境 macOS High SierraFFmpeg 4.3android-ndk-r21b 编译so库 下载FFmpeg4.3源代码,进入源码目录创建build_android.sh脚本,ffmpeg从4.0起新增了target-osandroid,所以不用再修改configure文件。 注意: ndk…...
yum的基本使用方法
yum(全称 "Yellow dog Updater Modified")是基于RPM包管理器的软件包管理系统,主要用于Fedora和Red Hat系列的Linux发行版中。它允许用户安装、更新、删除以及搜索软件包,并能自动处理软件包之间的依赖关系。下面是一些…...
Nginx+Keepalive集群实战
随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。 Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如果为最前端时单台Nginx会存在单点故障,也就…...
[数据集][目标检测]街道乱放广告牌检测数据集VOC+YOLO格式114张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):114 标注数量(xml文件个数):114 标注数量(txt文件个数):114 标注类别…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
