System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种高并发高吞吐无等待环形队列数据存储方法技术_技高网

一种高并发高吞吐无等待环形队列数据存储方法技术

技术编号:40590820 阅读:8 留言:0更新日期:2024-03-12 21:51
本发明专利技术公开了一种高并发高吞吐无等待环形队列数据存储方法,属于计算机数据结构领域,包括步骤1,对环形队列结构进行初始化;步骤2,通过原子操作和位运算获取当前位置索引;步骤3,判断该索引指向的存储内容是否满足读写条件,若满足转向步骤4,不满足转向步骤5;步骤4,写入或读出数据;步骤5,操作失败,不对索引指向的内容做任何修改,直接返回。通过简便设计,大大提升访问共享存储区域的吞吐量,且稳定支持多线程同步运行。本发明专利技术采用环形队列,在运行中不需要额外申请存储空间,空间复杂度低,可应用于性能严重受限的嵌入式设备;本发明专利技术代码复杂度低,代码可读性高,方便用户后期维护。

【技术实现步骤摘要】

本专利技术属于计算机数据结构领域,具体属于一种高并发高吞吐无等待环形队列数据存储方法


技术介绍

1、随着多核技术的发展,设计高效的并发数据结构变得非常迫切。尤其针对微系统众核应用。传统的并发方式采用互斥锁或自旋锁技术,系统开销巨大,且容易引发死锁、优先级颠倒等问题。为了解决以上问题,非阻塞数据结构得到重点关注,其中无等待提供最高的非阻塞保证,确保每个线程都能在有限步之内完成任何操作。

2、当前的无等待技术最大问题在于其设计难、开销过大,在大多数场景下随着“保证”的提高,性能不断下降来满足其冗余设计。其一归因于大多数无等待算法采用的关键机制——“帮助机制”。这种机制控制线程相互帮助完成操作的方式,通常会导致复杂的算法,并额外使用更多的原子操作,产生很高的争用,增加开销。其次,帮助机制被设计为按顺序操作,因为所有并发运行的线程都以完全相同的顺序帮助其他操作。由于高冗余,导致大量无效运行。其二归因于内存回收机制,该机制用于释放已经完成所有操作的数据存储空间,从而达到理论上的无界限存储,然而频繁的内存申请和释放会在极端情景下造成存储越界与野指针,随着写线程数目的增加,存储空间将不再足够。

3、综上所述,现有技术中应用的无等待队列,其复杂的帮助机制和内存回收机制显著影响了线程运行效率,明显增加了极端情形下出错的可能性。


技术实现思路

1、为了解决现有技术中存在的问题,本专利技术提供一种高并发高吞吐无等待环形队列数据存储方法,用于解决
技术介绍
中的问题,本专利技术以在多生产者单消费者环境下,支持大量线程并发,满足高吞吐量需求,从根本上解决上述帮助机制与内存回收机制带来的问题。最终实现微系统多内核间数据快速同步的现实需要。

2、为实现上述目的,本专利技术提供如下技术方案:

3、一种高并发高吞吐无等待环形队列数据存储方法,包括以下步骤,

4、步骤1,对环形队列结构进行初始化;

5、步骤2,通过原子操作和位运算获取当前位置索引;

6、步骤3,判断该索引指向的存储内容是否满足读写条件,若满足转向步骤4,不满足转向步骤5;

7、步骤4,写入或读出数据;

8、步骤5,操作失败,不对索引指向的内容做任何修改,直接返回。

9、优选的,步骤1中,进行变量初始化,根据机器指令长度对齐字节,对齐后初始化读索引变量与写索引变量为零。

10、进一步的,当机器为32位机器时,则对齐方式为32;当机器为64位机器时,则对其方式为64。

11、优选的,步骤1中,对存储空间进行初始化,用户自定义环形缓冲区大小。

12、优选的,步骤2中,获取当前位置索引具体包括以下过程,通过fetch_and_add原子操作移动写索引位置,自动原子地将参数1添加到存储在原子对象中的值,并获得先前保存的值;同时由于采用环形缓冲区,获取的索引应和缓冲区大小进行取余操作,从而快速得到真正的索引位置。

13、优选的,步骤4中,写入数据具体包括以下过程,在缓冲区每个位置上设置特殊标识符⊥,其表示此处为空,可存入数据;

14、写入数据时比较该索引位置是否指向特殊标识符⊥,如果是则经由compare_and_swap原子操作尝试存储数据,若原子操作成功返回true;其余情况均视为失败,说明该位置已有其他生产者线程先一步存入数据,直接返回false。

15、优选的,步骤4中,读出数据具体包括以下过程,获取位置索引,首先通过fetch_and_add原子操作移动读索引位置,索引值原子地自动加1,并返回当前读索引的值;

16、检查此位置是否指向特殊标识符⊥,如果不是则说明此处有正常数据需要取出,需先取出数据,接着将此处重新设置为特殊标识符⊥,最后返回true;其余情况均视作执行失败,代表此处并没有数据,返回false即可。

17、优选的,步骤4中,写入或读出数据的数据类型相同。

18、优选的,步骤4中,写入数据线程为一个或多个,读出数据线程为一个。

19、与现有技术相比,本专利技术具有以下有益的技术效果:

20、本专利技术提供一种高并发高吞吐无等待环形队列数据存储方法,通过简便设计,大大提升访问共享存储区域的吞吐量,且稳定支持多线程同步运行。本专利技术完全避免帮助机制,将数据吞吐量提升50%~100%,可以稳定适配数据高速吞吐的应用场景;本专利技术采用环形队列,在运行中不需要额外申请存储空间,空间复杂度低,可应用于性能严重受限的嵌入式设备;本专利技术代码复杂度低,代码可读性高,方便用户后期维护。(研究表明程序的可能错误和高的复杂度有着很大关系,复杂度最高的模块和方法,其缺陷个数也可能最多。复杂度大说明程序代码的判断逻辑复杂,可能质量低,且难于测试和维护。)本方法克服这一缺点,特别适合微系统嵌入式领域等缺乏支撑软件环境的应用。本专利技术运行稳定,性能指标不会随着线程数激增而下降。

本文档来自技高网...

【技术保护点】

1.一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,包括以下步骤,

2.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,进行变量初始化,根据机器指令长度对齐字节,对齐后初始化读索引变量与写索引变量为零。

3.根据权利要求2所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,当机器为32位机器时,则对齐方式为32;当机器为64位机器时,则对其方式为64。

4.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,对存储空间进行初始化,用户自定义环形缓冲区大小。

5.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤2中,获取当前位置索引具体包括以下过程,通过fetch_and_add原子操作移动写索引位置,自动原子地将参数1添加到存储在原子对象中的值,并获得先前保存的值;同时由于采用环形缓冲区,获取的索引应和缓冲区大小进行取余操作,从而快速得到真正的索引位置。

6.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,写入数据具体包括以下过程,在缓冲区每个位置上设置特殊标识符⊥,其表示此处为空,可存入数据;

7.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,读出数据具体包括以下过程,获取位置索引,首先通过fetch_and_add原子操作移动读索引位置,索引值原子地自动加1,并返回当前读索引的值;

8.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,写入或读出数据的数据类型相同。

9.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,写入数据线程为一个或多个,读出数据线程为一个。

...

【技术特征摘要】

1.一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,包括以下步骤,

2.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,进行变量初始化,根据机器指令长度对齐字节,对齐后初始化读索引变量与写索引变量为零。

3.根据权利要求2所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,当机器为32位机器时,则对齐方式为32;当机器为64位机器时,则对其方式为64。

4.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,对存储空间进行初始化,用户自定义环形缓冲区大小。

5.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤2中,获取当前位置索引具体包括以下过程,通过fetch_and_add原子操作移动写索引位置,自动原子地将参数1添加到存储在原子对象中的值,并获得...

【专利技术属性】
技术研发人员:李珂匡乃亮杨启迪罗迒哉钟升
申请(专利权)人:西安微电子技术研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1