《一种无锁数据缓冲区及其使用方法.pdf》由会员分享,可在线阅读,更多相关《一种无锁数据缓冲区及其使用方法.pdf(11页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 (43)申请公布日 (21)申请号 201310409758.6(22)申请日 2013.09.10G06F 12/08(2006.01)G06F 1/32(2006.01)(71)申请人中国石油化工股份有限公司地址 100728 北京市朝阳区朝阳门北大街22号申请人中国石油化工股份有限公司石油物探技术研究院(72)发明人洪承煜 杨尚琴 许自龙 庞世明宋志翔 陈科(74)专利代理机构北京思创毕升专利事务所 11218代理人郭韫(54) 发明名称一种无锁数据缓冲区及其使用方法(57) 摘要本发明提供了一种无锁数据缓冲区及其使用方法,属于并行计算领域。所述无锁数据缓冲区包括数据。
2、存储区和数据管理区;所述数据存储区用于存储数据;所述数据管理区包括:指向缓冲区开始处最小数据单元的指针、指向缓冲区结尾处最小数据单元的指针、缓冲区中所有最小数据单元的地址存储数组、当前被使用的最小数据单元在地址存储数组中的位置、缓冲区中最小数据单元个数和最小数据单元链表;所述指向缓冲区开始处最小数据单元的指针用于指向缓冲区的第一个最小数据单元;所述指向缓冲区结尾处最小数据单元的指针用于指向缓冲区的最后一个最小数据单元;所述缓冲区中所有最小数据单元的地址存储数组用于存储缓冲区中所有最小数据单元的地址。(51)Int.Cl.(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书1页 说。
3、明书5页 附图4页(10)申请公布号 CN 104424123 A(43)申请公布日 2015.03.18CN 104424123 A1/1页21.一种无锁数据缓冲区,其特征在于:所述无锁数据缓冲区包括数据存储区和数据管理区;所述数据存储区用于存储数据;所述数据管理区包括:指向缓冲区开始处最小数据单元的指针、指向缓冲区结尾处最小数据单元的指针、缓冲区中所有最小数据单元的地址存储数组、当前被使用的最小数据单元在地址存储数组中的位置、缓冲区中最小数据单元个数和最小数据单元链表;所述指向缓冲区开始处最小数据单元的指针用于指向缓冲区的第一个最小数据单元;所述指向缓冲区结尾处最小数据单元的指针用于指向缓。
4、冲区的最后一个最小数据单元;所述缓冲区中所有最小数据单元的地址存储数组用于存储缓冲区中所有最小数据单元的地址;所述当前被使用的最小数据单元在地址存储数组中的位置用于存储当前被使用的最小数据单元在地址存储数组中的位置;所述缓冲区中最小数据单元个数用于存储缓冲区中最小数据单元个数N;所述缓冲区中最小数据单元个数N是固定的。2.根据权利要求1所述的无锁数据缓冲区,其特征在于:所述最小数据单元链表包括N个最小数据单元,每个所述最小数据单元包括:指向数据的指针、最小数据单元状态标志和指向下一个最小数据单元的指针;所述指向数据的指针用于指向该最小数据单元对应的存储在所述数据存储区内的数据集;所述最小数据单。
5、元状态标志用于表示最小数据单元的状态,所述状态为下面三种情况之一:最小数据单元正在使用、最小数据单元使用完、最小数据单元可以使用;所述指向下一个最小数据单元的指针用于指向最小数据单元链表中与该最小数据单元相邻的下一个最小数据单元。3.根据权利要求2所述的无锁数据缓冲区,其特征在于:每个所述最小数据单元通过所述指向数据的指针与所述数据存储区内的一个数据集一一对应。4.根据权利要求3所述的无锁数据缓冲区,其特征在于:通过无锁机制使得最小数据单元链表中的最小数据单元一次只被一个线程获取并使用。5.一种使用权利要求4所述无锁数据缓冲区的方法,其特征在于:包括:(1)创建两个无锁数据缓冲区,给每个无锁数。
6、据缓冲区内的最小数据单元个数进行赋值;(2)读线程获取一个空的无锁数据缓冲区,并把每次读到的对应最小数据单元的数据集放入到数据存储区内,并将对应该数据集的最小数据单元加入到最小数据单元链表中,直到数据读取完或者直到当前读线程正在操作的无锁数据缓冲区已满,将所述最小数据单元状态标志设为最小数单元可以使用;(3)计算线程获取经过步骤(2)处理的无锁数据缓冲区,并在无锁状态下,同时去该无锁数据缓冲区中请求可用数据,直到该无锁数据缓冲区为空;(4)读线程和计算线程交替互换使用两个无锁数据缓冲区,直到数据计算完成。权 利 要 求 书CN 104424123 A1/5页3一种无锁数据缓冲区及其使用方法技术。
7、领域0001 本发明属于并行计算领域,具体涉及一种无锁数据缓冲区及其使用方法。背景技术0002 在并行计算领域中,有很多是针对海量数据计算的并行算法,它的串行处理过程如下:(1)从文件中读一次算法计算所需的数据集;(2)算法计算;(3)把当前次计算结果写文件;(4)判断是否还有计算数据,有就跳去(1)继续执行,否则结束执行。它的并行算法中,使用读数据缓冲区来达到一定程度的IO与计算重叠,及任何的计算线程每次的计算时间有自己决定,一定程度上减少了硬件资源的空闲时间;但在对数据缓冲区的操作时需要使用同步机制,以便保证数据的一致性。这种并行算法中,存在同步的消耗问题。发明内容0003 本发明的目的在。
8、于解决上述现有技术中存在的难题,提供一种无锁数据缓冲区及其使用方法,它提供多个计算线程在无锁状态下,向无锁数据缓冲区申请一次计算所需的数据集的机制,减少了多个线程数据请求时同步的消耗。0004 本发明是通过以下技术方案实现的:0005 一种无锁数据缓冲区,包括数据存储区和数据管理区;0006 所述数据存储区用于存储数据;0007 所述数据管理区包括:指向缓冲区开始处最小数据单元的指针、指向缓冲区结尾处最小数据单元的指针、缓冲区中所有最小数据单元的地址存储数组、当前被使用的最小数据单元在地址存储数组中的位置、缓冲区中最小数据单元个数和最小数据单元链表;0008 所述指向缓冲区开始处最小数据单元的。
9、指针用于指向缓冲区的第一个最小数据单元;0009 所述指向缓冲区结尾处最小数据单元的指针用于指向缓冲区的最后一个最小数据单元;0010 所述缓冲区中所有最小数据单元的地址存储数组用于存储缓冲区中所有最小数据单元的地址;0011 所述当前被使用的最小数据单元在地址存储数组中的位置用于存储当前被使用的最小数据单元在地址存储数组中的位置;0012 所述缓冲区中最小数据单元个数用于存储缓冲区中最小数据单元个数N;0013 所述缓冲区中最小数据单元个数N是固定的。0014 所述最小数据单元链表包括N个最小数据单元,每个所述最小数据单元包括:指向数据的指针、最小数据单元状态标志和指向下一个最小数据单元的指。
10、针;0015 所述指向数据的指针用于指向该最小数据单元对应的存储在所述数据存储区内的数据集;0016 所述最小数据单元状态标志用于表示最小数据单元的状态,所述状态为下面三种说 明 书CN 104424123 A2/5页4情况之一:最小数据单元正在使用、最小数据单元使用完、最小数据单元可以使用;0017 所述指向下一个最小数据单元的指针用于指向最小数据单元链表中与该最小数据单元相邻的下一个最小数据单元。0018 每个所述最小数据单元通过所述指向数据的指针与所述数据存储区内的一个数据集一一对应。0019 通过无锁机制使得最小数据单元链表中的最小数据单元一次只被一个线程获取并使用。0020 一种使用。
11、所述无锁数据缓冲区的方法,包括:0021 (1)创建两个无锁数据缓冲区,给每个无锁数据缓冲区内的最小数据单元个数进行赋值;0022 (2)读线程获取一个空的无锁数据缓冲区,并把每次读到的对应最小数据单元的数据集放入到数据存储区内,并将对应该数据集的最小数据单元加入到最小数据单元链表中,直到数据读取完或者直到当前读线程正在操作的无锁数据缓冲区已满,将所述最小数据单元状态标志设为最小数据单元可以使用;0023 (3)计算线程获取经过步骤(2)处理的无锁数据缓冲区,并在无锁状态下,同时去该无锁数据缓冲区中请求可用数据,直到该无锁数据缓冲区为空;0024 (4)读线程和计算线程交替互换使用两个无锁数据。
12、缓冲区,直到数据计算完成。0025 与现有技术相比,本发明的有益效果是:本发明解决了读线程空闲状态,最大化了计算和IO重叠;减少了多个线程请求数据时的同步开销。附图说明0026 图1示出本发明的一个实施例的数据结构及其操作的方法集。0027 图2示出用于实现图1中的关键操作方法的实施例附图。0028 图3本发明无锁数据缓冲区的结构示意图。0029 图4本发明方法的步骤框图。具体实施方式0030 下面结合附图对本发明作进一步详细描述:0031 本发明提供了一种基于单个读线程、多个计算线程的无锁数据缓冲区,通过在数据缓冲区中使用固定的最小数据单元个数,减少了数据单元移动或指向数据单元指针的移动消耗。
13、;另外,通过“最小数据单元状态”标志,减少了获取无锁数据缓冲区中可被使用的最小数据单元的比较次数。0032 所述数据管理区的结构如图3所示,本发明的无锁数据缓冲区包括N个最小数据单元301,数据管理区302和最小数据单元链表303。这些最小数据单元(一次算法计算所需的数据集可以一样大也可以不一样大,取决于每个“指向数据的指针”指向的数据大小)包含在管理它的数据结构中,一一对应,即最小数据单元通过“指向数据的指针”与指向数据一一对应。而这些管理数据结构被链表数据结构链接在一起(通过单向链表链接在一起),形成一个数据缓冲区,再利用无锁机制,对链表中的最小数据单元请求进行一致性管理,此处一致性管理即。
14、指通过无锁机制(即支持“比较-交换”的CPU原子指令操作)来使说 明 书CN 104424123 A3/5页5得链表中的最小数据单元一次只会被一个线程获取并使用。0033 本发明允许多个计算线程向无锁数据缓冲区同时申请最小数据单元(即只要多个计算线程都在需要数据时执行获取有用的最小数据单元201算法即可申请获取最小数据单元),减少了多个线程数据请求时同步的消耗。但此缓冲区的操作有以下约定:0034 (1)提供给多个计算线程使用的无锁数据缓冲区大小是固定的,即不能对缓冲区进行最小数据单元增加和减少的操作,也就是说缓冲区中的最小数据单元个数不可以更改了,但是最小数据单元中管理的数据,还是可以通过“。
15、指向数据的指针”来更改的;0035 (2)读线程操作时,计算线程不能操作,反之亦然;这条规定要求使用此无锁数据缓冲区需要为单个读线程和多个计算线程各自提供一个数据缓冲区,通过互斥锁和条件变量控制相互的交替使用,来达到这两个缓冲区数据的一致性,以便保证访问数据的一致性。0036 实施例通过单个读数据线程、N个计算线程来展示了无锁数据缓冲区。0037 图1示出本发明的一个实施例的C+语言实现的数据结构及其操作的方法集;当然,可以以各种语言来定义和重新实现方法集。数据结构如图3所示。0038 在图1中,BEING_USED、USED_END、USEFUL3个值表示最小数据单元的状态,它们分别表示:最。
16、小数据单元正在使用、最小数据单元使用完、最小数单元可以使用。0039 Node数据结构是管理最小数据单元的,其中_data指针指向的是最小数据单元;_beingFlag表示的是最小数据单元3种状态中的一种;_serial WriteNum是为了标示最小数据单元一定属性的,它可以表示最小数据单元中的数据所属读文件的顺序块,也可表示读线程放入最小数据单元中的数据的先后顺序,它可以提供给特定算法计算时使用;_next指向下一个管理最小数据单元的数据结构体。0040 PListRead类数据结构中,head指向数据缓冲区链表头;tail指向数据缓冲区链表尾部;higeArray是存放缓冲区链表中每个节。
17、点地址的数组,使用它可以提高链表操作的速度;_obj是拥有最小数据单元的实例,它会在最小数据单元不用时,调用其拥有的freeNodeRes接口释放掉最小数据单元占用的存储空间;currNode(l01)结合higeArray使用,表示最近一次已经被使用或已经使用完的最小数据单元在higeArray数组中的下标;count表示数据缓冲区链表中元素的个数。0041 由读线程使用的操作如下:InsertAfterTail(void*value)实现往数据缓冲区链表尾部中增加一个最小数据单元,其value参数为指向最小数据单元的指针;InsertAfter(void*previous,void*val。
18、ue)在数据缓冲区链表元素previous后,插入一个一个最小数据单元,其value参数为指向最小数据单元的指针;Remove(constvoid*value)从数据缓冲区链表中移除元素,此元素中的最小数据单元的起始地址是value;SetHeadTail(void*headVal,void*tailVal)指定数据缓冲区链表的头部元素是headVal,尾部元素是tailVal;SetHighPerformArray()为已经固定大小的数据缓冲区链表设置高效访问数组;SetFreeFunc(ExecFuncRType*obj,FreeNodeResourcefunc0)设置最小数据单元中资源释。
19、放的对象obj及其它使用的操作func;SetCurrNodeToHead()把数据缓冲区设置成准备被使用;GetNodeCount()获取数据缓冲区链表中元素的个数,即最小数据单元的大小;SetNodeUseful(Node*node,intserialNum)设置数据缓冲区链表中node元素中的最小数据单元可以使用,并设置最小数据单元的属性为serialNum。说 明 书CN 104424123 A4/5页60042 由计算线程使用的操作如下:GetUsefulNodeSafe()用于计算线程从数据缓冲区中获取数据,如图2的201,它的无锁获取最小数据单元的流程是:(1)currNode(。
20、l01)原子加1,并赋给局部变量k(2011);(2)判断当前k是否超出数据缓冲区链表元素的个数(2012),是则表示数据缓冲区中没有可用的最小数据单元,跳到(7)去执行,否则继续下一步执行;(3)取出当前k所指向的最小数据单元(2014);(4)判断此最小数据单元是否可用(2015),是则继续下一步执行,否则跳到(7)去执行;(6)返回可用的最小数据单元给计算线程使用(2016),并跳去(8)执行;(7)返回0个最小数据单元(2013);(8)结束执行。0043 SetNodeUsedEnd(Node*node,FreeNodeResourcefunc0)的作用是设置节点使用完状态,并释放相。
21、应的资源,它针对的是每个计算函数已经获取的私有最小数据单元,所以可以不用任何的同步和原子操作即可。0044 IsBeingUsed(Node*node)可以便捷的查询当前最小数据单元node的状态,它提供如图2(202)的能力,即对最小数据node提供原子操作查询,高效。0045 结合以上分析,通过以下4步就可以操作无锁数据缓冲区:0046 (1)创建2个无锁数据缓冲区链表,给每个链表元素中管理的最小数据单元赋值;0047 (2)读线程获取一个空的无锁数据缓冲区,并把每次读到的,对应最小数据单元的数据集,放入链表元素的最小数据单元中,直到数据读取完或直到当前读线程正在操作的缓冲区已满;一般情况。
22、下是填满了读线程正在操作的缓冲区的,但是如果数据已经读完了,还没有填满,那么也就假设满了,它通过设置“最小数据单元状态”标志为可以被使用,而其它的为不可使用,来达到要求。0048 (3)计算线程获取一个满的无锁数据缓冲区(这个缓冲区是步骤(2)中读满的缓冲区通过互斥锁和条件变量控制交给步骤(3)的缓冲区。如果缓冲区出现上面步骤(2)所说的读完了数据但没有填满的情况,步骤(3)也是可以正常处理的,因为在计算线程执行获取有用的最小数据单元201的最小数据单元可用否?2015中会对“最小数据单元状态”标志进行判断,获取可用被使用的数据),并可以在无锁状态下,同时去缓冲区(这个缓冲区指的是步骤(2)中。
23、读满的缓冲区通过控制和条件变量交给步骤(3)的缓冲区)中请求可用数据,一直等到当前缓冲区(步骤(2)中读满的缓冲区通过互斥锁和条件变量控制交给步骤(3)的缓冲区,也即所有计算线程通过控制和条件变量从步骤(2)中得到的,当前正在使用的缓冲区)已空;0049 (4)读线程和计算线程缓冲区交替互换使用,直到数据计算完成。0050 如图4所示,本发明方法的读线程操作如下:0051 (1)读线程通过互斥锁和条件变量的控制从2个无锁缓冲区中获取一个空数据的无锁缓冲区;0052 (2)使用从0依次加1的“缓冲区中所有最小数据单元的地址存储数组下标,获得一个空的最小数据单元301;0053 (3)把从各种媒介。
24、(内存、文件等)中读取数据到存放到“指向数据的指针”中,并把“最小数据单元状态”标志设置为可被使用;0054 (4)判断(2)中的下标是否大于等于缓冲区中最小数据单元个数或数据是否读完(即缓冲区是否读满),如果否,则返回步骤(2),如果是,则转入步骤(5);0055 (5)通过互斥锁和条件变量的控制把满的无锁数据缓冲区交给计算线程,并返回说 明 书CN 104424123 A5/5页7步骤(1)。0056 上述技术方案只是本发明的一种实施方式,对于本领域内的技术人员而言,在本发明公开了应用方法和原理的基础上,很容易做出各种类型的改进或变形,而不仅限于本发明上述具体实施方式所描述的方法,因此前面描述的方式只是优选的,而并不具有限制性的意义。说 明 书CN 104424123 A1/4页8图1说 明 书 附 图CN 104424123 A2/4页9图2说 明 书 附 图CN 104424123 A3/4页10图3说 明 书 附 图CN 104424123 A10。