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

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

Info

Publication number
CN102681892A
CN102681892A CN2012101507211A CN201210150721A CN102681892A CN 102681892 A CN102681892 A CN 102681892A CN 2012101507211 A CN2012101507211 A CN 2012101507211A CN 201210150721 A CN201210150721 A CN 201210150721A CN 102681892 A CN102681892 A CN 102681892A
Authority
CN
China
Prior art keywords
lock
worm
logic
read
key
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN2012101507211A
Other languages
English (en)
Other versions
CN102681892B (zh
Inventor
肖舸
葛新
李伟伟
杨东
王毅
王文庆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xian TPRI Power Station Information Technology Co Ltd
Original Assignee
Thermal Power Research Institute
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Thermal Power Research Institute filed Critical Thermal Power Research Institute
Priority to CN201210150721.1A priority Critical patent/CN102681892B/zh
Publication of CN102681892A publication Critical patent/CN102681892A/zh
Application granted granted Critical
Publication of CN102681892B publication Critical patent/CN102681892B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Storage Device Security (AREA)

Abstract

一种Key-Value型单写多读锁池软件模块及其运行方法,该模块包括相互耦合,联动工作的应用程序调用接口、单写多读操作逻辑层、Hash管理模块、动态内存池模块以及***物理锁资源;提供海量单写多读逻辑锁供其他应用程序开发使用;其运行方法为:首先应用程序以任意数据作为Key,调用应用程序调用接口,提出锁访问请求包括加写锁、解写锁、加读锁、解读锁以及查询锁读写状态,应用程序调用接口接到访问请求,转到单写多读操作逻辑层实现服务;本发明能够使用很少的操作***资源,提供海量单写多读锁资源供应用层使用,以实现高效的“小锁”应用模型,满足软件业界的在多任务环境下的高性能开发需求。

Description

Key-Value型单写多读锁池软件模块及其运行方法
技术领域
本发明涉及并行计算领域中锁池软件模块和方法,具体涉及一种Key-Value型单写多读锁池软件模块及其运行方法。
背景技术
锁是多任务操作***提供的一种重要资源,常见的有临界区、信号量、互斥量等多种形式,其核心功能是在并行程序设计领域,当两个或多个线程面临同时访问某一个资源(内存、Socket、IO等)的可能时,临时性宣告该资源在某个时刻被某个线程占用(Lock),防止其他线程的冲突性访问,以保证每个访问动作均在自己需要的权限内得以完整地完成,避免程序bug。
在大型服务器开发领域,由于要应对大量客户端的高速、大并发、海量数据访问,内部数据模块、通信模块等资源的访问和变动非常密集,需要高效和海量的锁资源支持,才能保证数据访问的完整性和安全性,以及保证资源访问的效率。
传统的锁操作程序设计模式一般分为两种:
1、定义一把“大锁”,保护一个完整的数据结构,比如一把锁保护一棵树型数据结构、一个队列、一个堆栈中的所有数据,所有对该数据结构的访问均需通过这一把锁实现,这对操作***资源占用很少,但会导致大并发访问时锁碰撞过于密集,访问效率很低。
2、定义很多把“小锁”,保护数据结构中细分的、很小范围的子数据,比如一把锁仅仅保护一个树形数据结构中的一片“叶子”,程序中锁与数据资源按照1:1数量配置,这可以降低锁碰撞以及提升访问效率。但由于锁本身也是操作***的资源,在海量数据的组织中,***资源消耗会很大,会导致***因资源不足而崩溃,或程序被迫设置上限,无法保护太多的资源。
上述两种方案都不完美,要么性能低下,要么资源浪费严重,二者很难折中。目前软件业界缺乏一种高效率的、低***资源占用的,针对海量数据的锁保护手段。这严重制约了高并发海量数据应用服务器的性能和规模。
另外,传统操作***提供的锁资源,其加锁方法比较“粗犷”,仅有加锁(Lock)和解锁(Unlock)两种操作方式,并不细分外部应用具体的数据访问行为。这导致每次加锁均是无条件“排他”的,无法并发,性能不高。
但在实际工作中,数据访问通常有“读”、“写”两种需求,研究表明,在“写”方式下,确实需要“排他”的锁保护,防止bug,而“读”方式下,由于被保护的数据资源并未被修改,可以允许多重“读”并发,即允许多个线程同时读某个资源,以提升程序的并发效率。
这需要单写多读锁逻辑,即“细分”的应用层锁操作行为,明确区别“写动作”和“读动作”,加以不同的处理,实现“唯一写”和“并发读”的锁保护能力。
目前,大多数多任务操作***并未提供“单写多读锁”资源,软件业界也没有统一的标准,需要程序员在开发工作中自行实现。但由于单写多读锁逻辑开发难度较大,业界程序员水平又参差不齐,实做中经常出现问题,影响了程序开发工作效率。
软件业界目前比较缺乏较为通用的,具有较高抽象性的、提供友好的应用程序开发接口API,可以跨平台、跨语言调用的单写多读锁资源解决方案。
发明内容
为了克服上述现有技术存在的缺点,本发明的目的在于提供一种Key-Value型单写多读锁池软件模块及其运行方法,能够使用很少的操作***资源(物理锁资源、内存等),提供海量“单写多读逻辑锁”资源供应用层使用,以实现高效的“小锁”应用模型,满足软件业界的在多任务环境下的高性能开发需求。
为了达到上述目的,本发明所采用的技术方案是:
一种Key-Value型单写多读锁池软件模块,包括相互耦合,联动工作的如下子模块:
应用程序调用接口:定义本模块的操作方法,供其他计算机编程语言调用,实现功能输出;
单写多读操作逻辑层:提供单写多读算法逻辑,为实现的每一把逻辑锁提供单写多读操作特性;
Hash管理模块:接受任意数据类型的Key键值,快速索引查找对应的单写多读逻辑锁,实现多个单写多读逻辑锁的精确访问;
动态内存池模块:实现内部单写多读逻辑锁数据的动态申请和释放;
***物理锁资源:向操作***申请的锁资源,本模块程序运行时调用其加解锁方法,提供本模块自身功能的多线程安全保护。
所述锁池软件模块提供海量单写多读逻辑锁供其他应用程序开发使用,所述单写多读逻辑锁包含两个特征数据,一个写标志位和一个读计数器,可以存储、描述“唯一写”和“多重读”的工作状态值,其核心数据属于内存数据,可以在Hash管理模块中被索引管理,也可以被动态内存池模块动态申请和释放,其逻辑定义如下:
1)写标志置位为1,表示目前该逻辑锁处于“写”状态,禁止其他的“写”或“读”动作进入,即无法再次设置写标志位为1,或者叠加读计数器;
2)读计数器叠加,不为0,表示目前有“读”动作,不允许其他的“写”动作进入,即无法设置写标志位为1,但其他的“读”动作可以并发,这体现在读计数器的值不断增加。
一种Key-Value型单写多读锁池软件模块的运行方法,包括如下步骤:
步骤1:应用程序以任意数据作为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)如果可以加锁,则将写标志设置为1实现加锁,同时返回值设置为真
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++语言的动态内存管理原理,本发明定义一把单写多读逻辑锁只有在使用时才真正实例化为有效的内存数据,不使用时及时释放回***内存,则可以用很少的内存开销,实现海量的单写多读逻辑锁供应用程序使用。
附图说明
图1为写锁状态查询流程图。
图2为读锁状态查询流程图。
图3为尝试加写锁流程图。
图4为确定加写锁流程图。
图5为解除写锁流程图。
图6为尝试加读锁流程图。
图7为确定加读锁流程图。
图8为解除读锁流程图。
具体实施方式
下面结合具体实施方式和附图对本发明作进一步详细说明。
本发明一种Key-Value型单写多读锁池软件模块,包括相互耦合,联动工作的如下子模块:
应用程序调用接口:定义本模块的操作方法,供其他计算机编程语言调用,实现功能输出;
单写多读操作逻辑层:提供单写多读算法逻辑,为实现的每一把逻辑锁提供单写多读操作特性;
Hash管理模块:接受任意数据类型的Key键值,快速索引查找对应的单写多读逻辑锁,实现多个单写多读逻辑锁的精确访问;
动态内存池模块:实现内部单写多读逻辑锁数据的动态申请和释放;
***物理锁模块:向操作***申请的锁资源,程序中调用其加解锁方法,提供本模块自身功能的多线程安全保护。
所述锁池软件模块提供海量单写多读逻辑锁供其他应用程序开发使用,所述单写多读逻辑锁包含两个特征数据,一个写标志位和一个读计数器,可以存储、描述“唯一写”和“多重读”的工作状态值,其核心数据属于内存数据,可以在Hash管理模块中被索引管理,也可以被动态内存池模块动态申请和释放,其逻辑定义如下:
1)写标志置位为1,表示目前该逻辑锁处于“写”状态,禁止其他的“写”或“读”动作进入,即无法再次设置写标志位为1,或者叠加读计数器;
2)读计数器叠加,不为0,表示目前有“读”动作,不允许其他的“写”动作进入,即无法设置写标志位为1,但其他的“读”动作可以并发,这体现在读计数器的值不断增加;
Figure BDA00001641550400101
本发明Key-Value型单写多读锁池软件模块的运行方法,包括如下步骤:
步骤1:应用程序以任意数据作为Key,调用本软件模块应用程序调用接口,提出锁访问请求,所述请求包括加写锁、解写锁、加读锁、解读锁以及查询锁读写状态,应用程序调用接口接到访问请求,转到单写多读操作逻辑层实现服务;
步骤2:单写多读操作逻辑层服务方式如下:
对于“加写锁”或“加读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,如果不存在,则向动态内存池模块申请一个单写多读逻辑锁,然后推入Hash管理模块进行索引管理,此时该单写多读逻辑锁视为已经存在;如果存在,则直接进行加锁操作,返回操作结果;
对于“解写锁”或“解读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回,不做任何事,存在则进行解锁操作,解锁完毕后检查其是否还有其他加锁状态,如果无,则从Hash管理模块中删除该单写多读逻辑锁的索引,并向动态内存池模块释放该单写多读逻辑锁资源;
对于读取锁状态动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回锁未使用状态,存在则读取单写多读逻辑锁内真实的数据状态返回;
上述所有动作都在同一把***物理锁保护下完成,以保证所有动作操作时不被打断,确保本软件模块自身的多线程安全性。
所述的运行方法包括如下应用程序调用接口以及相关单写多读逻辑层程序流程:
写锁状态查询接口:查询Key指定的单写多读逻辑锁的写锁状态,具体程序流程如图1所示:
a)加本模块***物理锁
b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁
c)如果找到,读取其中写标志,赋值给返回值
d)如果没有找到,将返回值直接设置为0,表示未加锁
e)解本模块***物理锁,返回返回值;
读锁状态查询接口:查询Key指定的单写多读逻辑锁的读计数器值状态,具体程序流程如图2所示:
a)加本模块***物理锁
b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁
c)如果找到,读取其中读计数器,赋值给返回值
d)如果没有找到,将返回值直接设置为0,表示未加锁
e)解本模块***物理锁,返回返回值;
Figure BDA00001641550400122
尝试加写锁接口:为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,失败返回假,或成功加锁后返回真,具体程序流程如图3所示:
a)加本模块***物理锁
b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁
c)如果未找到,试图创建单写多读逻辑锁,如果创建失败返回值设置为假,跳转到g)
d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚建立的单写多读逻辑锁,返回值设置为假,跳转到g)
e)如果找到或者创建成功,检查该锁是否已经加上读锁或者写锁,如果已经加上锁,返回值设置为假
f)如果可以加锁,则将写标志设置为1实现加锁,同时返回值设置为真
g)解本模块***物理锁
h)检查返回值,如果为假,表示加锁未成功,函数返回假,直接结束
i)如果返回值为真,表示写锁加成功,则需要设置无限死循环,不断调用读锁状态查询接口,检测是否所有的读锁均已经解除,直到获得读计数器为0,方跳出循环,返回真;
Figure BDA00001641550400131
确定加写锁接口:为Key指定的单写多读逻辑锁加写锁,如果该单写多读逻辑锁已经被加读或者写锁,循环等待,直到成功加锁为止,具体程序流程如图4所示:
a)设置无限死循环,不断调用尝试加写锁接口Try2EnableWrite
b)失败则循环继续
c)成功则跳出循环,返回真;
Figure BDA00001641550400141
解除写锁接口:为Key指定的单写多读逻辑锁解除写锁,具体程序流程如图5所示:
a)加本模块***物理锁
b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁
c)如果未找到,不做任何事
d)如果找到,设置写标志位为0,摧毁单写多读逻辑锁,同时从Hash管理模块删除该锁索引,释放资源
e)解本模块***物理锁,返回;
Figure BDA00001641550400142
尝试加读锁接口:为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,失败返回假,或成功加锁后返回真,具体程序流程如图6所示:
a)加本模块***物理锁
b)根据Key进行Hash查找,寻找对应的单写多读逻辑锁
c)如果未找到,试图创建,如果创建失败返回值设置假,跳转到g)
d)如果创建成功,将该单写多读逻辑锁索引和Key构建Key-Value配对,推送到Hash管理模块进行管理,如果Hash推送失败,则摧毁刚创建的单写多读逻辑锁,返回值设置为假,跳转到g)
e)如果找到或者创建成功,检查该锁是否已经加上写锁,如果已经加锁,返回值设置为假
f)如果可以加锁,则将读计数器+1实现加锁,同时返回值设置为真
g)解本模块***物理锁,返回返回值;
确定加读锁接口:为Key指定的单写多读逻辑锁加读锁,如果该单写多读逻辑锁已经被加写锁,循环等待,直到成功加上读锁为止,具体程序流程如图7所示:
a)设置无限死循环,不断调用尝试加读锁Try2AddRead
b)失败则循环继续
c)成功则跳出循环,返回真;
解除读锁接口:为Key指定的单写多读逻辑锁解除读锁,具体程序流程如图8所示:
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)
本发明开发步骤:
本发明利用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万次/秒的并发读写访问,且实际占用的***资源很少,实现了上述需求。

Claims (6)

1.一种Key-Value型单写多读锁池软件模块,其特征在于:包括相互耦合,联动工作的如下子模块:
应用程序调用接口:定义本模块的操作方法,供其他计算机编程语言调用,实现功能输出;
单写多读操作逻辑层:提供单写多读算法逻辑,为实现的每一把逻辑锁提供单写多读操作特性;
Hash管理模块:接受任意数据类型的Key键值,快速索引查找对应的单写多读逻辑锁,实现多个单写多读逻辑锁的精确访问;
动态内存池模块:实现内部单写多读逻辑锁数据的动态申请和释放;
***物理锁模块:向操作***申请的锁资源,程序中调用其加解锁方法,提供本模块自身功能的多线程安全保护。
2.根据权利要求1所述锁池软件模块,其特征在于:提供海量单写多读逻辑锁供其他应用程序开发使用,所述单写多读逻辑锁包含两个特征数据,一个写标志位和一个读计数器,可以存储、描述“唯一写”和“多重读”的工作状态值,其核心数据属于内存数据,可以在Hash管理模块中被索引管理,也可以被动态内存池模块动态申请和释放,其逻辑定义如下:
1)写标志置位为1,表示目前该逻辑锁处于“写”状态,禁止其他的“写”或“读”动作进入,即无法再次设置写标志位为1,或者叠加读计数器;
2)读计数器叠加,不为0,表示目前有“读”动作,不允许其他的“写”动作进入,即无法设置写标志位为1,但其他的“读”动作可以并发,这体现在读计数器的值不断增加。
3.权利要求1所述锁池软件模块的运行方法,其特征在于:包括如下步骤:
步骤1:应用程序以任意数据作为Key,调用本软件模块应用程序调用接口,提出锁访问请求,所述请求包括加写锁、解写锁、加读锁、解读锁以及查询读取锁状态,应用程序调用接口接到访问请求,转到单写多读操作逻辑层实现服务;
步骤2:单写多读操作逻辑层服务方式如下:
对于“加写锁”或“加读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,如果不存在,则向动态内存池模块申请一个单写多读逻辑锁,然后推入Hash管理模块进行索引管理,此时该单写多读逻辑锁视为已经存在;如果存在,则直接进行加锁操作,返回操作结果;
对于“解写锁”或“解读锁”动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回,不做任何事,存在则进行解锁操作,解锁完毕后检查其是否还有其他加锁状态,如果无,则从Hash管理模块中删除该单写多读逻辑锁的索引,并向动态内存池模块释放该单写多读逻辑锁资源;
对于读取锁状态动作,单写多读操作逻辑层首先根据Key在Hash管理模块中检索是否有对应的单写多读逻辑锁存在,不存在直接返回锁未使用状态,存在则读取单写多读逻辑锁内真实的数据状态返回;
上述所有动作都在同一把***物理锁保护下完成,以保证所有动作操作时不被打断,确保本软件模块自身的多线程安全性。
4.根据权利要求3所述的运行方法,其特征在于:包括如下应用程序调用 接口以及相关单写多读逻辑程序流程:
写锁状态查询接口:查询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)如果可以加锁,则将写标志设置为1实现加锁,同时返回值设置为真
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)解本模块***物理锁,返回。
5.权利要求1所述锁池软件模块的应用程序调用接口供所有具有调用操作***API能力的计算机编程语言程序调用,包括C、C++、汇编、Java、C#、VB。
6.权利要求1所述锁池软件模块提供不同操作***的版本,实现跨操作***平台功能,能够在Windows、Linux以及其他一些类Unix平台下工作,模块产品可以组织为如下形式,实现功能输出:
.h头文件定义(应用程序开发接口声明定义)(Windows,Linux,Unix like)
.dll动态链接库(Windows)
.so动态链接库(Linux,Unix like)
.obj目标链接文件(Windows,Linux,Unix like)
.lib静态链接库(Windows,Linux,Unix like) 。
CN201210150721.1A 2012-05-15 2012-05-15 Key-Value型单写多读锁池软件模块及其运行方法 Expired - Fee Related CN102681892B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210150721.1A CN102681892B (zh) 2012-05-15 2012-05-15 Key-Value型单写多读锁池软件模块及其运行方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210150721.1A CN102681892B (zh) 2012-05-15 2012-05-15 Key-Value型单写多读锁池软件模块及其运行方法

Publications (2)

Publication Number Publication Date
CN102681892A true CN102681892A (zh) 2012-09-19
CN102681892B CN102681892B (zh) 2014-08-20

Family

ID=46813861

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210150721.1A Expired - Fee Related CN102681892B (zh) 2012-05-15 2012-05-15 Key-Value型单写多读锁池软件模块及其运行方法

Country Status (1)

Country Link
CN (1) CN102681892B (zh)

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104572568A (zh) * 2013-10-15 2015-04-29 阿里巴巴集团控股有限公司 读锁操作方法、写锁操作方法及***
CN105243101A (zh) * 2015-09-17 2016-01-13 浪潮(北京)电子信息产业有限公司 多控制器对同一数据压缩文件进行并发访问的方法及***
CN105511969A (zh) * 2015-11-25 2016-04-20 中国船舶工业***工程研究院 一种跨进程的线程间进行互斥的方法
CN108140009A (zh) * 2015-10-13 2018-06-08 微软技术许可有限责任公司 分布式自主式基于rdma的b树键值管理器
CN108762940A (zh) * 2018-04-12 2018-11-06 武汉斗鱼网络科技有限公司 多线程访问方法及装置
CN112631742A (zh) * 2020-12-30 2021-04-09 上海金卓科技有限公司 一种资源访问权限管理装置、方法及***
CN112929278A (zh) * 2021-02-24 2021-06-08 深圳市吉祥腾达科技有限公司 一种网络通信设备多核并行快速转发数据包的方法及***
CN113220458A (zh) * 2021-05-26 2021-08-06 西安热工研究院有限公司 一种数据库连接池实现负载均衡的实时调度方法和装置
US11556395B2 (en) * 2020-01-24 2023-01-17 Microsoft Technology Licensing, Llc Data race detection with per-thread memory protection

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5860070A (en) * 1996-05-31 1999-01-12 Oracle Corporation Method and apparatus of enforcing uniqueness of a key value for a row in a data table
CN1545033A (zh) * 2003-11-14 2004-11-10 清华大学 Fc-san存储子***的lun cache方法
CN1808389A (zh) * 2006-02-20 2006-07-26 南京联创科技股份有限公司 帐务后台内存数据库中共享内存的自治锁方法
CN101252603A (zh) * 2008-04-11 2008-08-27 清华大学 基于存储区域网络san的集群分布式锁管理方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5860070A (en) * 1996-05-31 1999-01-12 Oracle Corporation Method and apparatus of enforcing uniqueness of a key value for a row in a data table
CN1545033A (zh) * 2003-11-14 2004-11-10 清华大学 Fc-san存储子***的lun cache方法
CN1808389A (zh) * 2006-02-20 2006-07-26 南京联创科技股份有限公司 帐务后台内存数据库中共享内存的自治锁方法
CN101252603A (zh) * 2008-04-11 2008-08-27 清华大学 基于存储区域网络san的集群分布式锁管理方法

Cited By (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104572568A (zh) * 2013-10-15 2015-04-29 阿里巴巴集团控股有限公司 读锁操作方法、写锁操作方法及***
CN104572568B (zh) * 2013-10-15 2021-07-23 蚂蚁金服(杭州)网络技术有限公司 读锁操作方法、写锁操作方法及***
CN105243101A (zh) * 2015-09-17 2016-01-13 浪潮(北京)电子信息产业有限公司 多控制器对同一数据压缩文件进行并发访问的方法及***
CN105243101B (zh) * 2015-09-17 2019-05-10 浪潮(北京)电子信息产业有限公司 多控制器对同一数据压缩文件进行并发访问的方法及***
CN108140009B (zh) * 2015-10-13 2022-06-24 微软技术许可有限责任公司 分布式自主式基于rdma的b树键值管理器
CN108140009A (zh) * 2015-10-13 2018-06-08 微软技术许可有限责任公司 分布式自主式基于rdma的b树键值管理器
CN105511969B (zh) * 2015-11-25 2020-05-19 中国船舶工业***工程研究院 一种跨进程的线程间进行互斥的方法
CN105511969A (zh) * 2015-11-25 2016-04-20 中国船舶工业***工程研究院 一种跨进程的线程间进行互斥的方法
CN108762940B (zh) * 2018-04-12 2020-09-04 武汉斗鱼网络科技有限公司 多线程访问方法及装置
CN108762940A (zh) * 2018-04-12 2018-11-06 武汉斗鱼网络科技有限公司 多线程访问方法及装置
US11556395B2 (en) * 2020-01-24 2023-01-17 Microsoft Technology Licensing, Llc Data race detection with per-thread memory protection
CN112631742A (zh) * 2020-12-30 2021-04-09 上海金卓科技有限公司 一种资源访问权限管理装置、方法及***
CN112631742B (zh) * 2020-12-30 2023-10-31 上海金卓科技有限公司 一种资源访问权限管理装置、方法及***
CN112929278A (zh) * 2021-02-24 2021-06-08 深圳市吉祥腾达科技有限公司 一种网络通信设备多核并行快速转发数据包的方法及***
CN113220458A (zh) * 2021-05-26 2021-08-06 西安热工研究院有限公司 一种数据库连接池实现负载均衡的实时调度方法和装置

Also Published As

Publication number Publication date
CN102681892B (zh) 2014-08-20

Similar Documents

Publication Publication Date Title
CN102681892B (zh) Key-Value型单写多读锁池软件模块及其运行方法
US6421690B1 (en) Computer memory management system
Alistarh et al. Threadscan: Automatic and scalable memory reclamation
CN102880518B (zh) 实现公平可缩放的读者写者互斥的方法和装置
US6826757B2 (en) Lock-free implementation of concurrent shared object with dynamic node allocation and distinguishing pointer value
Hoeflinger Extending OpenMP to clusters
Atkinson et al. Data types and persistence
WO2000000906A2 (en) Method and apparatus for locking
US11698893B2 (en) System and method for use of lock-less techniques with a multidimensional database
Cypher The communication requirements of mutual exclusion
US20120311531A1 (en) Optimizing an object-oriented program by transforming invocations of synthetic accessor methods
CN107103253B (zh) 基于mpi的ac串匹配并行算法的磁盘敏感信息扫描***
CN102567044A (zh) 代码部署协助
Chandra et al. COOL: A language for parallel programming
Gordon et al. Static lock capabilities for deadlock freedom
Prokopec Cache-tries: concurrent lock-free hash tries with constant-time operations
Blanusa et al. Scalable fine-grained parallel cycle enumeration algorithms
CN102047222A (zh) 用于线程安全数据集合的阻塞和绑定包装器
CN112000670B (zh) 一种多线程程序数据统一管理方法、***及电子设备
CN103226592A (zh) 一种基于数据库的文件***及文件存储方法
US20060184759A1 (en) Permanent pool memory management method and system
Black The Eden programming language
Blelloch et al. Concurrent reference counting and resource management in wait-free constant time
Sheffi et al. The era theorem for safe memory reclamation
KR20220083036A (ko) 시대 기반 메모리 수집 기법과 포인터 기반 메모리 수집 기법 혼합을 위한 컴퓨터 시스템 및 그의 방법

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: XI'AN TPRI POWER STATION INFORMATION TECHNOLOGY CO

Free format text: FORMER OWNER: XI'AN THERMAL POWER RESEARCH INSTITUTE CO., LTD.

Effective date: 20150423

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 710032 XI'AN, SHAANXI PROVINCE TO: 710075 XI'AN, SHAANXI PROVINCE

TR01 Transfer of patent right

Effective date of registration: 20150423

Address after: 710075 Xi'an City, Shaanxi province high tech Zone Torch Hotel, block B, 11

Patentee after: XI'AN TPRI POWER STATION INFORMATION TECHNOLOGY CO., LTD.

Address before: 710032 Xingqing Road, Shaanxi, China, No. 136, No.

Patentee before: Xi'an Thermal Power Research Institute Co., Ltd.

CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20140820

Termination date: 20180515