Key-Value型单写多读锁池软件模块及其运行方法

文档序号:6369697阅读:149来源:国知局
专利名称:Key-Value型单写多读锁池软件模块及其运行方法
技术领域
本发明涉及并行计算领域中锁池软件模块和方法,具体涉及ー种Key-Value型单写多读锁池软件模块及其运行方法。
背景技术
锁是多任务操作系统提供的ー种重要资源,常见的有临界区、信号量、互斥量等多种形式,其核心功能是在并行程序设计领域,当两个或多个线程面临同时访问某一个资源(内存、Socket、IO等)的可能吋,临时性宣告该资源在某个时刻被某个线程占用(Lock),防止其他线程的冲突性访问,以保证每个访问动作均在自己需要的权限内得以完整地完成,避免程序bug。 在大型服务器开发领域,由于要应对大量客户端的高速、大并发、海量数据访问,内部数据模块、通信模块等资源的访问和变动非常密集,需要高效和海量的锁资源支持,才能保证数据访问的完整性和安全性,以及保证资源访问的效率。传统的锁操作程序设计模式一般分为两种I、定义一把“大锁”,保护ー个完整的数据结构,比如一把锁保护一棵树型数据结构、一个队列、一个堆栈中的所有数据,所有对该数据结构的访问均需通过这一把锁实现,这对操作系统资源占用很少,但会导致大并发访问时锁碰撞过于密集,访问效率很低。2、定义很多把“小锁”,保护数据结构中细分的、很小范围的子数据,比如一把锁仅仅保护一个树形数据结构中的一片“叶子”,程序中锁与数据资源按照1:1数量配置,这可以降低锁碰撞以及提升访问效率。但由于锁本身也是操作系统的资源,在海量数据的组织中,系统资源消耗会很大,会导致系统因资源不足而崩溃,或程序被迫设置上限,无法保护太多的资源。上述两种方案都不完美,要么性能低下,要么资源浪费严重,二者很难折中。目前软件业界缺乏一种高效率的、低系统资源占用的,针对海量数据的锁保护手段。这严重制约了高并发海量数据应用服务器的性能和規模。另外,传统操作系统提供的锁资源,其加锁方法比较“粗犷”,仅有加锁(Lock)和解锁(Unlock)两种操作方式,并不细分外部应用具体的数据访问行为。这导致毎次加锁均是无条件“排他”的,无法并发,性能不高。但在实际工作中,数据访问通常有“读”、“写”两种需求,研究表明,在“写”方式下,确实需要“排他”的锁保护,防止bug,而“读”方式下,由于被保护的数据资源并未被修改,可以允许多重“读”并发,即允许多个线程同时读某个资源,以提升程序的并发效率。这需要单写多读锁逻辑,即“细分”的应用层锁操作行为,明确区别“写动作”和“读动作”,加以不同的处理,实现“唯一写”和“并发读”的锁保护能力。目前,大多数多任务操作系统并未提供“单写多读锁”资源,软件业界也没有统ー的标准,需要程序员在开发工作中自行实现。但由于单写多读锁逻辑开发难度较大,业界程序员水平又參差不齐,实做中经常出现问题,影响了程序开发工作效率。
软件业界目前比较缺乏较为通用的,具有较高抽象性的、提供友好的应用程序开发接ロ API,可以跨平台、跨语言调用的单写多读锁资源解决方案。

发明内容
为了克服上述现有技术存在的缺点,本发明的目的在于提供ー种Key-Value型单写多读锁池软件模块及其运行方法,能够使用很少的操作系统资源(物理锁资源、内存等),提供海量“单写多读逻辑锁”资源供应用层使用,以实现高效的“小锁”应用模型,满足软件业界的在多任务环境下的高性能开发需求。为了达到上述目的,本发明所采用的技术方案是ー种Key-Value型单写多读锁池软件模块,包括相互耦合,联动工作的如下子模块应用程序调用接ロ 定义本模块的操作方法,供其他计算机编程语言调用,实现功 能输出;单写多读操作逻辑层提供单写多读算法逻辑,为实现的每一把逻辑锁提供单写多读操作特性;Hash管理模块接受任意数据类型的Key键值,快速索引查找对应的单写多读逻辑锁,实现多个单写多读逻辑锁的精确访问;动态内存池模块实现内部单写多读逻辑锁数据的动态申请和释放;系统物理锁资源向操作系统申请的锁资源,本模块程序运行时调用其加解锁方法,提供本模块自身功能的多线程安全保护。所述锁池软件模块提供海量单写多读逻辑锁供其他应用程序开发使用,所述单写多读逻辑锁包含两个特征数据,一个写标志位和一个读计数器,可以存储、描述“唯一写”和“多重读”的工作状态值,其核心数据属于内存数据,可以在Hash管理模块中被索引管理,也可以被动态内存池模块动态申请和释放,其逻辑定义如下I)写标志置位为1,表示目前该逻辑锁处干“写”状态,禁止其他的“写”或“读”动作进入,即无法再次设置写标志位为I,或者叠加读计数器;2)读计数器叠加,不为0,表示目前有“读”动作,不允许其他的“写”动作进入,SP无法设置写标志位为1,但其他的“读”动作可以并发,这体现在读计数器的值不断増加。ー种Key-Value型单写多读锁池软件模块的运行方法,包括如下步骤步骤I :应用程序以任意数据作为Key,调用本软件模块应用程序调用接ロ,提出锁访问请求,所述请求包括加写锁、解写锁、加读锁、解读锁以及查询锁读写状态,应用程序调用接ロ接到访问请求,转到单写多读操作逻辑层实现服务;步骤2 :单写多读操作逻辑层服务方式如下对于“加写锁”或“加读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,如果不存在,则向动态内存池模块申请ー个单写多读逻辑锁,然后推入Hash管理模块进行索引管理,此时该单写多读逻辑锁视为已经存在;如果存在,则直接进行加锁操作,返回操作结果;对于“解写锁”或“解读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回,不做任何事,存在则进行解锁操作,解锁完毕后检查其是否还有其他加锁状态,如果无,则从Hash管理模块中删除该单写多读逻辑锁的索引,并向动态内存池模块释放该单写多读逻辑锁资源;对于读取锁状态动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回锁未使用状态,存在则读取单写多读逻辑锁内真实的数据状态返回;上述所有动作都在同一把系统物理锁保护下完成,以保证所有动作操作时不被打断,确保本软件模块自身的多线程安全性。所述的运行方法包括如下应用程序调用接ロ以及相关单写多读逻辑层程序流程:
写锁状态查询接ロ 查询Key指定的单写多读逻辑锁的写锁状态,具体程序流程如下a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果找到,读取其中写标志,赋值给返回值d)如果没有找到,将返回值直接设置为0,表示未加锁e)解本模块系统物理锁,返回返回值;读锁状态查询接ロ 查询Key指定的单写多读逻辑锁的读计数器值状态,具体程序流程如下a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果找到,读取其中读计数器,赋值给返回值d)如果没有找到,将返回值直接设置为0,表示未加锁e)解本模块系统物理锁,返回返回值;尝试加写锁接ロ 为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,失败返回假,或成功加锁后返回真,具体程序流程如下a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,试图创建单写多读逻辑锁,如果创建失败返回值设置为假,跳转到g)d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚建立的单写多读逻辑锁,返回值设置为假,跳转到g)e)如果找到或者创建成功,检查该锁是否已经加上读锁或者写锁,如果已经加上锁,返回值设置为假f)如果可以加锁,则将写标志设置为I实现加锁,同时返回值设置为真g)解本模块系统物理锁h)检查返回值,如果为假,表示加锁未成功,函数直接返回假,结束i)如果返回值为真,表示写锁加成功,则需要设置无限死循环,不断调用读锁状态查询接ロ,检测是否所有的读锁均已经解除,直到获得读计数器为0,方跳出循环,返回真;
确定加写锁接ロ 为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,循环等待,直到成功加锁为止,具体程序流程如下a)设置无限死循环,不断调用尝试加写锁接ロb)失败则循环继续c)成功则跳出循环,返回真;解除写锁接ロ为Key指定的单写多读逻辑锁解除写锁,具体程序流程如下a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,不做任何事d)如果找到,设置写标志为0,摧毁单写多读逻辑锁,同时从Hash管理模块删除该锁索引,释放资源e)解本模块系统物理锁,返回;尝试加读锁接ロ 为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,失败返回假,或成功加锁后返回真,具体程序流程如下a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,试图创建,如果创建失败返回值设置假,跳转到g)d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚创建的单写多读逻辑锁,返回值设置为假,跳转到g)e)如果找到或者创建成功,检查该锁是否已经加上写锁,如果已经加锁,返回值设置为假f)如果可以加锁,则将读计数器+1实现加锁,同时返回值设置为真g)解本模块系统物理锁,返回返回值;确定加读锁接ロ 为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,循环等待,直到成功加上读锁为止,具体程序流程如下a)设置无限死循环,不断调用尝试加读锁b)失败则循环继续c)成功则跳出循环,返回真;解除读锁接ロ为Key指定的单写多读逻辑锁解除读锁,具体程序流程如下a)加本模块系统物理锁 b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,不做任何事d)如果找到,读计数器-1,如果此时读计数器已经〈=0,摧毁单写多读逻辑锁,同时从Hash管理模块删除该锁索引,释放资源e)解本模块系统物理锁,返回。所述锁池软件模块的应用程序调用接口供所有具有调用操作系统API能力的计算机编程语目程序调用,包括C、C++、汇编、Java、C#、VB。所述锁池软件模块提供不同操作系统的版本,实现跨操作系统平台功能,能够在Windows、Linux以及其他ー些类Unix平台下工作,模块产品可以组织为如下形式,实现功能输出. h头文件定义(应用程序开发接ロ声明定义)(Windows, Linux, Unix like). dll 动态链接库(Windows)· so 动态链接库(Linux, Unix like). obj 目标链接文件(Windows, Linux, Unix like).lib 浄态链接库(Windows, Linux, Unix like)本发明和现有技术相比,具有如下优点 本发明定义的单写多读逻辑锁其功能比普通的操作系统锁要強大,其特点是细分了外部对数据资源的操作类型,对于“写,,操作,实现完全排他性的“唯一写”原则,此时相当于操作系统锁的加锁Lock,而对于“读”操作,允许有条件地“并发读”,则可以提高多线程软件系统的并发工作效率。再配合C/C++语言的动态内存管理原理,本发明定义一把单写多读逻辑锁只有在使用时才真正实例化为有效的内存数据,不使用时及时释放回系统内存,则可以用很少的内存开销,实现海量的单写多读逻辑锁供应用程序使用。


图I为写锁状态查询流程图。图2为读锁状态查询流程图。图3为尝试加写锁流程图。图4为确定加写锁流程图。图5为解除写锁流程图。图6为尝试加读锁流程图。图7为确定加读锁流程图。图8为解除读锁流程图。
具体实施例方式下面结合具体实施方式
和附图对本发明作进ー步详细说明。本发明ー种Key-Value型单写多读锁池软件模块,包括相互耦合,联动工作的如下子模块应用程序调用接ロ 定义本模块的操作方法,供其他计算机编程语言调用,实现功能输出;单写多读操作逻辑层提供单写多读算法逻辑,为实现的每一把逻辑锁提供单写多读操作特性;Hash管理模块接受任意数据类型的Key键值,快速索引查找对应的单写多读逻辑锁,实现多个单写多读逻辑锁的精确访问;动态内存池模块实现内部单写多读逻辑锁数据的动态申请和释放;系统物理锁模块向操作系统申请的锁资源,程序中调用其加解锁方法,提供本模块自身功能的多线程安全保护。
所述锁池软件模块提供海量单写多读逻辑锁供其他应用程序开发使用,所述单写多读逻辑锁包含两个特征数据,一个写标志位和一个读计数器,可以存储、描述“唯一写”和“多重读”的工作状态值,其核心数据属于内存数据,可以在Hash管理模块中被索引管理,也可以被动态内存池模块动态申请和释放,其逻辑定义如下I)写标志置位为1,表示目前该逻辑锁处干“写”状态,禁止其他的“写”或“读”动作进入,即无法再次设置写标志位为I,或者叠加读计数器;2)读计数器叠加,不为0,表示目前有“读”动作,不允许其他的“写”动作进入,SP无法设置写标志位为1,但其他的“读”动作可以并发,这体现在读计数器的值不断増加;
/+/中写多读逻辑锁数据结构体
t.ypedef struct —TONY—X 丨AO—MULTI—READ—SINGLEJRITE—L0CIB0DY一{
unsigned short m_nReadCoont : 15 ; //读计数器 0^32767 unsigned short ra—bWriteFlag : I ; //写标志位 I 0 }SMRSfLockBody;
const unsigned long SMRSWLockBodySi2e=aizeof(SMRSWLockBody); /72 Bytes本发明Key-Value型单写多读锁池软件模块的运行方法,包括如下步骤步骤I :应用程序以任意数据作为Key,调用本软件模块应用程序调用接ロ,提出锁访问请求,所述请求包括加写锁、解写锁、加读锁、解读锁以及查询锁读写状态,应用程序调用接ロ接到访问请求,转到单写多读操作逻辑层实现服务;步骤2 :单写多读操作逻辑层服务方式如下对于“加写锁”或“加读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,如果不存在,则向动态内存池模块申请ー个单写多读逻辑锁,然后推入Hash管理模块进行索引管理,此时该单写多读逻辑锁视为已经存在;如果存在,则直接进行加锁操作,返回操作结果;对于“解写锁”或“解读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回,不做任何事,存在则进行解锁操作,解锁完毕后检查其是否还有其他加锁状态,如果无,则从Hash管理模块中删除该单写多读逻辑锁的索引,并向动态内存池模块释放该单写多读逻辑锁资源;对于读取锁状态动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回锁未使用状态,存在则读取单写多读逻辑锁内真实的数据状态返回;上述所有动作都在同一把系统物理锁保护下完成,以保证所有动作操作时不被打断,确保本软件模块自身的多线程安全性。所述的运行方法包括如下应用程序调用接ロ以及相关单写多读逻辑层程序流程:写锁状态查询接ロ 查询Key指定的单写多读逻辑锁的写锁状态,具体程序流程如图I所示a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果找到,读取其中写标志,赋值给返回值
d)如果没有找到,将返回值直接设置为0,表示未加锁e)解本模块系统物理锁,返回返回值;
/VpKey: Key数据内存地址指针
//nKeySi ze : Key 数据长度 /+/返回码
/./ true : Key指向的单写多读锁已经加上写锁 // false :Key指向的舉写多读锁未加写锁或不存在 bool GetWrite !,void* pKey, int nKeySi ze);读锁状态查询接ロ 查询Key指定的单写多读逻辑锁的读计数器值状态,具体程序流程如图2所示a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果找到,读取其中读计数器,赋值给返回值d)如果没有找到,将返回值直接设置为0,表示未加锁e)解本模块系统物理锁,返回返回值;
/ / pKoy: Key数据内存地址指针
/./nKeySi ze : Key数裾长度 //返冋码
1' >0:Key指向的单写多读锁已经加上渎锁,返回值为并发的读锁数量
,/ O:Key指向的Φ.写多读锁未加读锁或不存在
int betRead U7Oid* pKey, mt nKeybizej ;尝试加写锁接ロ 为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,失败返回假,或成功加锁后返回真,具体程序流程如图3所示a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,试图创建单写多读逻辑锁,如果创建失败返回值设置为假,跳转到g)d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚建立的单写多读逻辑锁,返回值设置为假,跳转到g)e)如果找到或者创建成功,检查该锁是否已经加上读锁或者写锁,如果已经加上锁,返回值设置为假f)如果可以加锁,则将写标志设置为I实现加锁,同时返回值设置为真g)解本模块系统物理锁h)检查返回值,如果为假,表示加锁未成功,函数返回假,直接结束i)如果返回值为真,表示写锁加成功,则需要设置无限死循环,不断调用读锁状态查询接ロ,检测是否所有的读锁均已经解除,直到获得读计数器为0,方跳出循环,返回真;//pKey: Key数据内存地址指针
//nKeySi ze : Key数据长度 //返回码:
/7 true :Key指向的单写多读锁成功加上写锁11 false : Key指向的中-写多读锁加写锁失畋bool Try2KnabIeWrite、ν€πd* pKey,mt nKeySize);确定加写锁接ロ 为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,循环等待,直到成功加锁为止,具体程序流程如图4所示a)设置无限死循环,不断调用尝试加写锁接ロ Try2EnableWriteb)失败则循环继续c)成功则跳出循环,返回真;
/VpKey: Key数据内存地址指针
//nKeySi ze : Key 数据长度 /+/返回码尤意义
bool EnabIeWr11eι,νο d* pivey, int nKeybize);解除写锁接ロ 为Key指定的单写多读逻辑锁解除写锁,具体程序流程如图5所示a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,不做任何事d)如果找到,设置写标志位为0,摧毁单写多读逻辑锁,同时从Hash管理模块删除该锁索引,释放资源e)解本模块系统物理锁,返回;
//pKey: Key数据内存地址指针
/VnKeySize :Key数据於度 /./返回码无怠义
bool DisableWritc(void* pKey, int nKeySize);尝试加读锁接ロ 为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,失败返回假,或成功加锁后返回真,具体程序流程如图6所示a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,试图创建,如果创建失败返回值设置假,跳转到g)d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚创建的单写多读逻辑锁,返回值设置为假,跳转到g)e)如果找到或者创建成功,检查该锁是否已经加上写锁,如果已经加锁,返回值设置为假f)如果可以加锁,则将读计数器+1实现加锁,同时返回值设置为真g)解本模块系统物理锁,返回返回值;
//pKey: Kcy数据内存地址指针
//nKeySi ze : Key 数据长度/7返冋码
Iltrue :Key指向的单写多读锁成功加上读锁 // false :Key指向的中写多读锁加读锁失败 bool Try2AddRead(void* pKey, int nKeySize);确定加读锁接ロ 为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,循环等待,直到成功加上读锁为止,具体程序流程如图7所示a)设置无限死循环,不断调用尝试加读锁Try2AddReadb)失败则循环继续c)成功则跳出循环,返回真;
//pKey: Key数据内存地址指针
//nKeySi ze : Key数据长度 /7返问码无意义
bool AadRead(void^ pKey, mt nKeyMze);解除读锁接ロ为Key指定的单写多读逻辑锁解除读锁,具体程序流程如图8所示a)加本模块系统物理锁b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁c)如果未找到,不做任何事d)如果找到,读计数器-1,如果此时读计数器已经〈=0,摧毁单写多读逻辑锁,同时从Hash管理模块删除该锁索引,释放资源e)解本模块系统物理锁,返回。
//pKey: Key数据内存地址指针
//nKeySizc : Key 数据长度 //返國码:无意义
bool Dec-Readvvoid^ pKey, int nKeySi ze);所述锁池软件模块的应用程序调用接口供所有具有调用操作系统API能力的计算机编程语目程序调用,包括C、C++、汇编、Java、C#、VB。所述锁池软件模块提供不同操作系统的版本,实现跨操作系统平台功能,能够在Windows、Linux以及其他ー些类Unix平台下工作,模块产品可以组织为如下形式,实现功能输出. h头文件定义(应用程序开发接ロ声明定义)(Windows,Linux,Unix like). dll 动态链接库(Windows). so 动态链接库(Linux, Unix like). obj 目标链接文件(Windows,Linux,Unix like).lib 静态链接库(Windows,Linux,Unix like)本发明开发步骤、
本发明利用C语言的结构体,定义ー个单写多读逻辑锁,保存单写多读逻辑相关信息。利用C语言的编译宏定义,抽象不同操作系统平台不同锁资源的访问函数,提供标准调用方法,实现跨平台移植能力。开发C语言函数,提供单写多读逻辑相关的标准访问函数加解“写”锁和加解“读”锁,状态查询函数等。所有函数均可针对上述单写多读逻辑锁操作。开发动态内存管理模块,即内存池,这步可以省略,直接使用C语言的malloc、free函数,或者C++语言的new、delete函数实现,本发明采用发明人自行设计的内存池,仅仅是为了回收重用内存,避免内存碎片,满足服务器7*24小时长时间运行需求。这不是本发明权利重点,不再赘述。开发Hash管理模块,这步也可以省略,直接使用C++语言的Map类实现,本发明采用发明人自行设计的Hash池模块,是为了保持更大的灵活度和高效性。这不是本发明权利重点,不再赘述。将前述单写多读逻辑锁指针索引定义为Hash管理模块的Value,使Hash管理模块的每一片“叶子”都是ー个单写多读逻辑锁的索引。而Key则不限定,应用层可以使用任意数据作为Key,在Hash池中寻访到对应的单写多读逻辑锁,实现操作。任意数据可以是一段ニ进制数据,ー个C语言结构体,一个字符串,ー个整数,或其他数据,由应用层程序员规划,只要保证唯一性即可,即ー个Key只能对应一把逻辑锁,两个不同的Key必定对应不同的逻辑锁。设计一把系统物理锁,与上述逻辑锁联动,确保Hash池的检索、单写多读锁体的操作均通过该系统物理锁完成,使所有的锁池操作本身是多线程安全的。设计标准应用程序调用接ロ,规范本发明软件模块的访问行为,提供统ー的调用界面,供不同应用层使用。程序设计过程中关注跨平台性,不允许调用各操作系统特有的函数,仅允许使用标准C/C++语言提供的功能函数,再经过不同的编译器,编译为obj、lib、dll、SO等各种ニ进制代码模块,允许应用层跨平台、跨语言编译链接调用,实现功能输出。应用实例本发明在Rython实时/历史数据库平台系统中,应用了多个实例。在其中ー个特定应用实例中,需要针对数千个数据文件内不同的数据段落做锁保护,以确保高并发下的数据资源安全访问。经过计算,锁需求的数量规模为4亿把锁。毫无疑问,传统的“小锁”模型在这么大的规模下,将会引发严重的系统资源瓶颈,不可实现,而系统的性能需求又不允许使用低效率的“大锁”模型。经过对本发明的应用,系统获得了高达4亿把的逻辑锁供使用,同时支持超过15万次/秒的并发读写访问,且实际占用的系统资源很少,实现了上述需求。
权利要求
1.ー种Key-Value型单写多读锁池软件模块,其特征在于包括相互耦合,联动工作的如下子模块 应用程序调用接ロ 定义本模块的操作方法,供其他计算机编程语言调用,实现功能输出; 单写多读操作逻辑层提供单写多读算法逻辑,为实现的每一把逻辑锁提供单写多读操作特性; Hash管理模块接受任意数据类型的Key键值,快速索引查找对应的单写多读逻辑锁,实现多个单写多读逻辑锁的精确访问; 动态内存池模块实现内部单写多读逻辑锁数据的动态申请和释放; 系统物理锁模块向操作系统申请的锁资源,程序中调用其加解锁方法,提供本模块自身功能的多线程安全保护。
2.根据权利要求I所述锁池软件模块,其特征在于提供海量单写多读逻辑锁供其他应用程序开发使用,所述单写多读逻辑锁包含两个特征数据,一个写标志位和一个读计数器,可以存储、描述“唯一写”和“多重读”的工作状态值,其核心数据属于内存数据,可以在Hash管理模块中被索引管理,也可以被动态内存池模块动态申请和释放,其逻辑定义如下 1)写标志置位为I,表示目前该逻辑锁处干“写”状态,禁止其他的“写”或“读”动作进入,即无法再次设置写标志位为1,或者叠加读计数器; 2)读计数器叠加,不为O,表示目前有“读”动作,不允许其他的“写”动作进入,即无法设置写标志位为1,但其他的“读”动作可以并发,这体现在读计数器的值不断増加。
3.权利要求I所述锁池软件模块的运行方法,其特征在于包括如下步骤 步骤I :应用程序以任意数据作为Key,调用本软件模块应用程序调用接ロ,提出锁访问请求,所述请求包括加写锁、解写锁、加读锁、解读锁以及查询读取锁状态,应用程序调用接ロ接到访问请求,转到单写多读操作逻辑层实现服务; 步骤2 :单写多读操作逻辑层服务方式如下 对于“加写锁”或“加读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,如果不存在,则向动态内存池模块申请ー个单写多读逻辑锁,然后推入Hash管理模块进行索引管理,此时该单写多读逻辑锁视为已经存在;如果存在,则直接进行加锁操作,返回操作结果; 对于“解写锁”或“解读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回,不做任何事,存在则进行解锁操作,解锁完毕后检查其是否还有其他加锁状态,如果无,则从Hash管理模块中删除该单写多读逻辑锁的索引,并向动态内存池模块释放该单写多读逻辑锁资源; 对于读取锁状态动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回锁未使用状态,存在则读取单写多读逻辑锁内真实的数据状态返回; 上述所有动作都在同一把系统物理锁保护下完成,以保证所有动作操作时不被打断,确保本软件模块自身的多线程安全性。
4.根据权利要求3所述的运行方法,其特征在干包括如下应用程序调用接ロ以及相关单写多读逻辑程序流程 写锁状态查询接口 查询Key指定的单写多读逻辑锁的写锁状态,具体程序流程如下 a)加本模块系统物理锁 b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁 c)如果找到,读取其中写标志,赋值给返回值 d)如果没有找到,将返回值直接设置为O,表示未加锁 e)解本模块系统物理锁,返回返回值; 读锁状态查询接口 查询Key指定的单写多读逻辑锁的读计数器值状态,具体程序流程如下 a)加本模块系统物理锁 b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁 c)如果找到,读取其中读计数器,赋值给返回值 d)如果没有找到,将返回值直接设置为O,表示未加锁 e)解本模块系统物理锁,返回返回值; 尝试加写锁接口 :为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,失败返回假,或成功加锁后返回真,具体程序流程如下 a)加本模块系统物理锁 b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁 c)如果未找到,试图创建单写多读逻辑锁,如果创建失败返回值设置为假,跳转到g) d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚建立的单写多读逻辑锁,返回值设置为假,跳转到g) e)如果找到或者创建成功,检查该锁是否已经加上读锁或者写锁,如果已经加上锁,返回值设置为假 f)如果可以加锁,则将写标志设置为I实现加锁,同时返回值设置为真 g)解本模块系统物理锁 h)检查返回值,如果为假,表示加锁未成功,函数返回假,直接结束。
i)如果返回值为真,表示写锁加成功,则需要设置无限死循环,不断调用读锁状态查询接口,检测是否所有的读锁均已经解除,直到获得读计数器为O,方跳出循环,返回真; 确定加写锁接口 为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,循环等待,直到成功加锁为止,具体程序流程如下 a)设置无限死循环,不断调用尝试加写锁接口 b)失败则循环继续 c)成功则跳出循环,返回真; 解除写锁接口 为Key指定的单写多读逻辑锁解除写锁,具体程序流程如下 a)加本模块系统物理锁 b)根据Key进行Hash查找 ,寻找对应的单写多读逻辑锁 c)如果未找到,不做任何事 d)如果找到,设置写标志为O,摧毁该单写多读逻辑锁,从Hash管理模块删除该锁索弓丨,释放资源 e)解本模块系统物理锁,返回; 尝试加读锁接口 :为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,失败返回假,或成功加锁后返回真,具体程序流程如下 a)加本模块系统物理锁 b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁 c)如果未找到,试图创建,如果创建失败返回值设置假,跳转到g) d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚创建的单写多读逻辑锁,返回值设置为假,跳转到g) e)如果找到或者创建成功,检查该锁是否已经加上写锁,如果已经加锁,返回值设置为假 f)如果可以加锁,则将读计数器+1实现加锁,同时返回值设置为真 g)解本模块系统物理锁,返回返回值; 确定加读锁接口 :为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,循环等待,直到成功加上读锁为止,具体程序流程如下 a)设置无限死循环,不断调用尝试加读锁 b)失败则循环继续 c)成功则跳出循环,返回真; 解除读锁接口 :为Key指定的单写多读逻辑锁解除读锁,具体程序流程如下 a)加本模块系统物理锁 b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁 c)如果未找到,不做任何事 d)如果找到,读计数器-1,如果此时读计数器已经〈=0,摧毁该单写多读逻辑锁,从Hash管理模块删除该锁索引,释放资源 e)解本模块系统物理锁,返回。
5.权利要求I所述锁池软件模块的应用程序调用接口供所有具有调用操作系统API能力的计算机编程语目程序调用,包括C、C++、汇编、Java、C#、VB。
6.权利要求I所述锁池软件模块提供不同操作系统的版本,实现跨操作系统平台功能,能够在Windows、Linux以及其他一些类Unix平台下工作,模块产品可以组织为如下形式,实现功能输出 .h头文件定义(应用程序开发接口声明定义)(Windows, Linux, Unix like) .dll动态链接库(Windows) .so 动态链接库(Linux, Unix like) obj 目标链接文件(Windows, Linux, Unix like) .lib 静态链接库(Windows, Linux, Unix like)。
全文摘要
一种Key-Value型单写多读锁池软件模块及其运行方法,该模块包括相互耦合,联动工作的应用程序调用接口、单写多读操作逻辑层、Hash管理模块、动态内存池模块以及系统物理锁资源;提供海量单写多读逻辑锁供其他应用程序开发使用;其运行方法为首先应用程序以任意数据作为Key,调用应用程序调用接口,提出锁访问请求包括加写锁、解写锁、加读锁、解读锁以及查询锁读写状态,应用程序调用接口接到访问请求,转到单写多读操作逻辑层实现服务;本发明能够使用很少的操作系统资源,提供海量单写多读锁资源供应用层使用,以实现高效的“小锁”应用模型,满足软件业界的在多任务环境下的高性能开发需求。
文档编号G06F9/46GK102681892SQ20121015072
公开日2012年9月19日 申请日期2012年5月15日 优先权日2012年5月15日
发明者李伟伟, 杨东, 王文庆, 王毅, 肖舸, 葛新 申请人:西安热工研究院有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1