06 2012 档案
摘要:分层状态机的设计:对于状态较多的状态机,通常的设计会维护一个庞大的二维矩阵,所有状态耦合在一起,这往往导致维护困难,由于可能存在许多公共的特性,也会导致许多状态具有相同的处理函数。针对这些问题我们可以通过设计分层状态机来解决,主要的思想就是根据不同的功能模块设计出多个状态机,各个状态机分布在不同的层次上。上层状态机调用下层状态机时,上层状态机入栈,下层状态机变为当前处理状态机。通常我们使用堆栈来保存当前状态机的上层状态机信息。下图描述一个分层状态机设计实现:如上图所示,假设L1为上层状态机,L1状态机在L1_STATE2中可以通过L1L2_EVENT1事件触发进入L2状态机,L2状态机在L2_
阅读全文
摘要:有限状态机(FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。通常FSM包含几个要素:状态的管理、状态的监控、状态的触发、状态触发后引发的动作。本文主要阐述一下状态机的几种设计方法。1:switch case/if else设计方法curEvent = getEvent();curState = getCurState();switch(curState){ case state1: { switch(curEvent ) { TODO... setCurSt...
阅读全文
摘要:内存池的实现:1:内存池的初始化:对每个子池进行初始化流程,将子池的入口放入内存池中,初始化block状态。void initPools(){ initPool(POOL1,(void*)pool1,POOL1_BLOCK_NUM,POOL1_BLOCK_SIZE); initPool(POOL2,(void*)pool2,POOL2_BLOCK_NUM,POOL2_BLOCK_SIZE); initPool(POOL3,(void*)pool3,POOL3_BLOCK_NUM,POOL1_BLOCK_SIZE); return;}void initPool(unsig...
阅读全文
摘要:http://www.cnblogs.com/chencheng
阅读全文
摘要:源码中在开始BTREE事务的时候,首先会调用btreeIntegrity(p)检测状态的正确性,其实现如下:#define btreeIntegrity(p) \ assert( p->inTrans!=TRANS_NONE || p->pBt->nTransaction<p->pBt->nRef ); \ assert( p->pBt->nTransaction<=p->pBt->nRef ); \ assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->
阅读全文
摘要:一个成功的软件系统,往往需要根据需求在不同的系统平台上运行,为了解决系统在多个平台的移植带来的风险,业务架构往往会设计相应的平台适配层来隔离不同平台的差异,如何设计一个易于扩展的平台适配层,是软件设计人员需要考虑的问题。设计1:1: 提供平台接口文件os.h2:定义如下:#ifdef OS1#define OS_Fun OS1_Fun#endif#ifdef OS2#define OS_Fun OS2_Fun#endifvoid OS_Fun();3:通过定义不同的系统宏,这个头文件展开后也就成了对应的平台的接口层。4:业务代码直接调用OS_Fun()这个统一的接口即可。5:该设计只需要一个通
阅读全文
摘要:FACADE这种设计模式本身比较简单,核心思想就是外部系统同本系统的需要通过门面来进行通信,这样可以屏蔽业务细节,不管系统内部如何变化,怎么复杂,但是对外系统呈现一个简单的结构。对于软件模块采用消息通行机制的分布式系统,通常的架构设计为底层平台开放模块消息处理的注册接口,各个模块将自己的消息处理函数进行注册,我们可以把这个消息入口看成子系统的一个门面,所有的发往某个模块的消息都通过注册的消息处理函数来入口void ModuleMsgFun(){ switch(sendModule) { case module1: TODO... .... case modulen: TODO... }}这个M
阅读全文
摘要:计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0.
阅读全文
摘要:sqlite的分词器模块需要对输入的字符串映射为系统中的标示符,其对关键字映射使用了hash算法,其对hash冲突的解决十分巧妙。1:最常规的解决办法:写一堆判断对每个输入字符串判断是否匹配,如果匹配就映射为系统中的关键字。由于sqlite的关键字有100多个,如果每个字符串进行比较判断,无疑效率很低2:使用hash算法: 首先构造一个散列函数,该函数计算字符串得到一个hash映射表的入口地址。 在入口地址中存放对应的记录. 由于对不同的字符串进行散列后可能得到一个相同的入口地址,这就要求我们要对冲突进行解决.2.1以前遇到类似的问题,基本使用了链地址法来解决冲突的问题。例如:typedef
阅读全文

浙公网安备 33010602011771号