
消息中间件
socrates
C/C程序员PythonPostgreSQL爱好者
展开
-
AMPS:AES模块源码解读
AES(Advanced Encryption Standard,高级加密标准)是一个对称密钥加密算法,密钥长度则可以是128,192或256比特。 算法思路(详细信息请见维基百科): AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块原创 2013-01-23 23:48:58 · 5741 阅读 · 0 评论 -
AMPS:内存管理(一)
高效的内存管理是卓越的软件产品的必备特征,如果在分配和释放内存时包含了代价高昂的查找、排序、重新组合操作,内存处理可能会成为系统性能的瓶颈。AMPS内存管理子系统的设计目标如下:内存管理必须快且系统开销小。在不引入垃圾收集器的前提下尽可能地减少内存泄露。内存分配后保持相对长的时间来减小释放引起的系统开销。 AMPS通过以下方法达到如上目标: 应用协议服务器通常以突然爆发的原创 2013-01-14 23:21:38 · 1331 阅读 · 0 评论 -
AMPS:内存管理(二)
对于底层的内存管理,AMPS提供了另外一种优化机制,一旦使用底层的内存分配函数(如C的malloc)为内存对象分配好一个大的buffer后,当这个内存对象销毁时,AMPS将这个本来要ree掉buffer存储在一个内部按内存块大小化分的free链表中,这样,当有新的内存对象需要分配时,AMPS先检查这个链表中是否有满足条件(即是否满足所申请的大小)的内存对象,如果有,从此链表中获取,从而避免了调用m原创 2013-01-15 22:51:45 · 1779 阅读 · 0 评论 -
AMPS:定时器管理
定时器模块是协议服务器的关键组件之一,几乎每个协议软件都设计有超时机制。在多线程的软件中,定时器的最大问题是去除了异步,这使得保护每个会话相关的数据结构变得不可避免。APMS提供了基本的定时器管理API,主要的设计目标如下: 定时器实现必须高效,在定时器相关的任何操作中不应该有查找或排序。且启动、停止、超时处理必须的时间复杂度必须为O(1)。 定时器实现必须可测量,必须支持长时间的超时原创 2013-01-16 23:29:37 · 1883 阅读 · 0 评论 -
AMPS:Trace模块源码解读
从本节起,开始分析AMPS各模块的源码,其中主要地方均加了中文注释。 跟踪功能与通常软件使用的日志功能类似,但记录的信息比日志更详细,通过它可以看出整个代码的运行轨迹,AMPS支持多以下几种跟踪级别: ERROR WARNING DEBUG DEBUG_2 INFO 并支持如下三种跟踪模式: 终端界面显示模式 文件记录模式 以上两种模式并存 下面是原创 2013-01-19 00:51:30 · 1691 阅读 · 0 评论 -
AMPS:队列源码解读
队列概念很简单,就是排队,先进先出,通常有链表形式和数组形式(即链接类型和顺序类型),它也是软件构建的一个基本数据结构,看看AMPS中的队列实现。 AMPS_Queue.h#ifndef __HEADER_AMPS_QUEUE_H#define __HEADER_AMPS_QUEUE_H#ifdef __cplusplusextern "C" {#endif#includ原创 2013-01-19 20:35:38 · 2808 阅读 · 0 评论 -
AMPS:单向链表源码解读
像单向链表、双向链表、堆、栈等这些基本的数据结构在大型软件中均有很广泛的使用,所以今天看一下AMPS中单向链表的操作函数库,其定义了单向链表的非常多的操作API,且提供了回调函数接口,从而使链表结构用于不同类型的结点,且可以使用户自定义的函数来实现链表排序、结点操作。所以这部分的代码可以做为常用的工具代码,可以在其他项目中广泛应用。 先看看AMPS提供的单链表操作接口有哪些?如下,由函数名称就原创 2013-01-19 12:42:55 · 2743 阅读 · 0 评论 -
AMPS:双向链表源码解读
本节在上节单向链表的基础上看看AMPS中对双向链表的实现,与单向链表相同,双向链表在软件中的使用也相对比较广泛,在后面要讲到的Hash表、定时器、内存管理等模块中都会见到以双向链表作为基本数据结构。其实,双向链表在实现上使用了很多单向链表的操作,仅在插入、删除结点时需要多操作几步,所以理解了单向链表,这块就比较好理解了。 同样,AMPS提供了以下API对双向链表进行操作: AMPS原创 2013-01-19 16:36:34 · 2928 阅读 · 0 评论 -
AMPS:堆源码解读
堆是一种比较复杂的数据结构,也就是通常所说的完全二叉树,分为最大堆和最小堆,定义如下:最大堆:根结点的键值是所有堆结点键值中最大者的堆。 最小堆:根结点的键值是所有堆结点键值中最小者的堆。 而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。 最大-最小堆是最大层和最小层交替出现的二叉原创 2013-01-20 17:09:26 · 2864 阅读 · 0 评论 -
AMPS:字符串操作源码解读
字符串处理在软件中非常普遍,AMPS使用C语言编写,所有没有像 标准C++提供的string一样的类型,所以对字符串的处理就是对char *这样的指针处理,为了处理方便,AMPS定义了自己的String类型,如下:typedef struct _AMPSString t_AMPSString;struct _AMPSString{ unsigned char* puchData;原创 2013-01-21 23:42:36 · 3197 阅读 · 0 评论 -
AMPS:定时器模块源码解读
Timer模块的实现比较复杂,需要结合前面的文章《AMPS:定时器管理》才能有所理解,下面看看AMPS中的定时器实现,有些细节方面我也没有想清楚。 AMPS_Timer.h#ifndef __HEADER_AMPS_TIMER_H__#define __HEADER_AMPS_TIMER_H__#ifdef __cplusplus extern "C" {#endif#原创 2013-01-27 22:54:27 · 3168 阅读 · 0 评论 -
AMPS:应用程序模型
建立于AMPS之上的应用程序核心模型是独立的、无阻塞、事件驱动的。其显著特点如下: 应用程序为一个有限状态机(FSM),当事件发生时改变状态。 应用程序由一组模块组成。 每个模块又细分为一个函数,称做事件句柄,每一个事件句柄处理一个有限状态机状态切换的事件。 对于阻塞的操作,处理必须中止,如果不这样,那就不能使用异步单线程框架,可以通过I/O Agent来实现。 有I/O操作原创 2013-01-13 21:15:01 · 1483 阅读 · 0 评论 -
AMPS:Cache模块源码解读
这里讲的Cache并不是通常说的计算机存储系统中的高速缓存,而是软件层面的缓存,它的做用主要是为了提高数据处理的效率。在AMPS中,Cache的结构如下:/*Cache结构*/struct _AMPSCache{ void* pvHASHTable; /*Hash表,用于查找*/ void* pvHeap; /*堆,用于增删改*/ int nCacheSize;原创 2013-01-27 16:33:11 · 2795 阅读 · 0 评论 -
AMPS:数据库访问模块源码解读
AMPS做为一个中间件,也提供了访问数据库的接口,目前支持MySQL和Oracle(对我所喜爱PostgreSQL却默认不支持,看来我的爱好属于非主流哈~),下面要看的是DBEngine库,它只做一件事情,就是封装了不同数据库操作的差异,提供一个数据库统一访问接口。下节再看针对不同数据库的具体操作。AMPS_DBEngine.h#ifndef __HEADER_AMPS_DB_ENGI原创 2013-01-25 00:12:10 · 3154 阅读 · 0 评论 -
AMPS:MD5模块源码解读
MD5是用于确保信息传输完整一致性的一个哈希算法。 其算法思想如下(摘自维基百科): MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。 是 XOR, AND, OR , NOT 的符号。原创 2013-01-23 22:16:43 · 3121 阅读 · 0 评论 -
AMPS:日志模块源码解读
看看AMPS中的日志模块,有两种写日志的方法,一是直接使用封装好的API函数写,另一种是通过应用层注册的日志回调函数,利用事件管理机制来写。 AMPS_Log.h#ifndef __HEADER_AMPS_LOG_H__#define __HEADER_AMPS_LOG_H__#include #include "AMPS_SystemAPI.h"#include "AMP原创 2013-01-24 23:34:29 · 2969 阅读 · 0 评论 -
AMPS:MySQL数据库操作模块源码解读
本节看看在AMPS中对MySQL数据库的访问操作,它使用MySQL提供的C API接口进行访问,具体各API的使用可参考http://dev.mysql.com/doc/refman/5.6/en/c-api-function-overview.html。 下面看看AMPS中的实现: AMPS_MySQL.h#ifndef __HEADER_AMPS_MYSQL_ENGINE_H#原创 2013-01-25 21:50:03 · 3383 阅读 · 0 评论 -
AMPS:Oracle数据库操作模块源码解读
本节看看AMPS中对Oracle数据库进行操作的方法,使用的是Oracle的C访问接口OCI,关于OCI各函数的中文说明可参考这篇文章http://www.cnblogs.com/joeblackzqq/archive/2011/04/24/2026461.html 下面看看AMPS中Oracle操作各函数实现: AMPS_Oracle.h#ifndef __HEADER_AMPS_D原创 2013-01-25 23:09:38 · 3343 阅读 · 0 评论 -
AMPS:事件管理
1、AMPS中的事件类型有请求、响应、通知。2、模块间通信: Figure 1(a)中module1产生一个请求R1,module2注册了这个请求,事件调度程序将这R1传送给module2,module处理请求后产生RES1,module1注册了RES1,所以结果被传送到module1。 Figure1(b)中module广播消息到所有模块,它产生带有信息的通知事件N1,m原创 2013-01-11 22:41:50 · 1044 阅读 · 0 评论 -
AMPS:非阻塞模块和I/O代理
AMPS中模块分为非阻塞、阻塞和I/O 代理两种类型。 无阻塞模块:如发送和接收网络消息,或者读写文件。 阻塞模块和I/O代理: 有些场景下阻塞可能无法实现,例如DNS查询或者数据库交互。这种场景下,AMPS要求开发者以I/O代理的形式创建模块,I/O代理准备I/O请求,并花大量时间等待操作完成,它由一个事件调度器和一个线程池组成。池中的每个线程关联原创 2013-01-13 22:49:15 · 1079 阅读 · 0 评论 -
AMPS:内存管理模块源码解读(一)
在AMPS中,使用内存池来管理内存,具体机制见之前的文章《AMPS:内存管理(二)》,在代码中,使用了两种实现方式,第一种是数组+单链表。今天先看看这个方式下的内存池实现。AMPS_MemoryMgt.h#ifndef __HEADER_AMPS_MEMORY_MGMT_H__#define __HEADER_AMPS_MEMORY_MGMT_H__#include "AMPS_原创 2013-01-27 12:39:44 · 3274 阅读 · 0 评论 -
AMPS:内存管理模块源码解读(二)
上节看了AMPS中通过数组+单链表实现的内存池,本节看看另一个实现方式。此方法思路如下:其内存池结构为一个存放已分配内存信息的双链表,一个表示内存池大小的变量,一个指向当前内存链表结点的指针链表,如下:/*内存池结构*/struct _newMMContext{ t_AMPSDList* memBuffList; /*结点链表*/ int nSizeOfBuff;原创 2013-01-27 15:28:39 · 3128 阅读 · 0 评论 -
AMPS:哈希表源码解读
Hash表也是一种常用的数据结构,AMPS中的Hash表并不是给使用者提供一个散列函数,而是仅提供一个创建和维护Hash表这样一个结构的一组函数,针对不同的应用或者数据,由用户自己定义其要使用的散列函数,AMPS中,Hash表组成结构是如下的拉链式结构。下面看看AMPS中对Hash操作的代码:AMPS_Hash.h#ifndef __HEADER_AMPS_HASH_H#原创 2013-01-21 22:24:51 · 3521 阅读 · 0 评论