我的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上验证过。
(未完待续)