CN108509186B - 一种队列cas原子操作控制方法 - Google Patents
一种队列cas原子操作控制方法 Download PDFInfo
- Publication number
- CN108509186B CN108509186B CN201810169516.7A CN201810169516A CN108509186B CN 108509186 B CN108509186 B CN 108509186B CN 201810169516 A CN201810169516 A CN 201810169516A CN 108509186 B CN108509186 B CN 108509186B
- Authority
- CN
- China
- Prior art keywords
- queue
- producer
- data
- cas
- bit
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Abstract
本发明涉及一种队列CAS原子操作控制方法,基于队列切片思想,用以解决现有技术用CAS loop语句判断生产者单个指针位置、进而间接判断基于范围原子操作极大情况下CAS失败的问题。并且通过所设计方法,将队列元素进行分片,不再单纯判断生产者head指向的单个元素位置,改为CAS判断前后生产者指针指向的片号值,极大程度上提高了队列算法的效率。
Description
技术领域
本发明涉及一种队列CAS原子操作控制方法,属于无锁并发算法技术领域。
背景技术
近年来,以对比-交换(Compare and Swap,CAS)原子操作为基础的无锁数据结构设计方法为上层算法提供了更为高效、便捷的数据访问方式,成为学术界和工业界的研究热点。
CAS是当今计算机中广泛使用的原子原语,因而使得当今无锁并发算法的正确性得以保证。然而CAS操作主要思想为比较-交换。具体地,先将目标值和旧的值进行比较,如果相等就将新的值赋给目标变量,否则,不对目标值进行修改。CAS能够原子地进行该操作,并保证比较-修改这一过程不被其他线程打断。
然而,现有CAS原语仅支持相等状态下(一个点)的原子操作,而非小于或大于状态下的原子操作(一个范围)。为执行小于或大于状态下的原子操作,在现有技术中,大都使用循环CAS(CAS loop)来实现基于范围的原子操作。在整个CAS循环体中,首先对目标值x进行拷贝,然后用if函数对目标值x进行判断,若目标值x小于限定值target_value,则进行想要的一系列操作,最后用CAS函数将目标值x与其拷贝的副本snapped_x进行比较,若不一致,则说明在这一操作过程中有其他线程影响了当前线程,代表当前的操作并非原子,则需要重新进入循环结构中进行重试;若目标值x与副本值snapped_x相同,则说明当前操作为原子操作,即实现了基于范围的原子操作。这一实现的伪代码如下:
现有基于范围的原子操作的解决方案被广泛运用在无锁数据结构中(例如:FIFO队列)。例如:在FIFO队列中,在消费者进行出队操作时,常常要进行一些原子的替换操作,而这些操作常常要求生产者保持在某一范围内,即不超过某一临界值,这就必须要用到基于范围的原子操作的技术。
但是现有的技术存在以下问题:在并发无锁数据结构中,以FIFO队列为例,很难保证消费者Consumer在进行操作时,生产者Producer不发生移动。因为只要生产者Producer发生的移动,现有技术中CAS loop中进行循环判断时即认为消费者的操作是不安全的,导致CAS操作失败。从而使得消费者要重新进入循环进行重试。现有的基于范围的原子操作解决方法在实际使用中效率极其低下,会使得消费者不断重试,无法达到基于范围的原子操作的本意,在严重时,甚至会导致活锁的出现。因此,一种高效的原子操作原语是迫切且重要的。
发明内容
本发明所要解决的技术问题是提供一种队列CAS原子操作控制方法,通过设计基于队列切片思想的原子操作判断方法,能够适用于常见无锁队列的算法实现中,并且极大程度上降低了因生产者移动而导致的失败和重试,同时大大提高了运用于队列的基于范围的原子操作判断算法的效率。
本发明为了解决上述技术问题采用以下技术方案:本发明设计了一种队列CAS原子操作控制方法,针对发送端向接收端所发送长度为k·2n的无锁单生产者单消费者队列,实现接收端对队列中数据的CAS原子性操作,包括如下步骤,其中,k和n均为不小于1的整数;
步骤A.针对队列中的所有队列单元,按2n个队列单元为一个片块,顺序划分获得k个片块,然后进入步骤B;
步骤B.针对生产者指针所指向队列中的队列单元,构建数据长度为2n bit位的生产者指针地址,其中,生产者指针地址中的高n bit位表示生产者指针所指队列单元所在片块的首地址,生产者指针地址中的低n bit位表示生产者指针所指队列单元在所在片块中的偏移地址,然后进入步骤C;
步骤C.判断生产者指针是否越过队列预设阈值位置,是则无法实现接收端对队列中数据的CAS原子性操作,控制方法结束;否则进入步骤D;
步骤D.获取生产者指针地址中高n bit位的副本数据,并进入步骤E;
步骤E.获取队列副本,由接收端根据消费者指针,针对队列副本执行关键操作,然后进入步骤F;
步骤F.获取队列副本中生产者指针地址中的高n bit位数据,并进入步骤G;
步骤G.判断生产者指针地址中高n bit位的副本数据,与队列副本中生产者指针地址中的高n bit位数据,两者是否相等,是则进入步骤H;否则返回步骤C;
步骤H.采用队列副本针对队列进行替换更新,完成接收端对队列中数据的CAS原子性操作。
作为本发明的一种优选技术方案,所述步骤D包括如下步骤:
步骤D1.获取2n bit位生产者指针地址副本数据,并将其转换为n bit位预设类型数据,然后进入步骤D2;
步骤D2.针对步骤D1中所获n bit位预设类型数据的指针进行逻辑加1运算,并对结果进行取值,即获得生产者指针地址中高n bit位的副本数据,然后进入步骤E;
所述步骤F包括如下步骤:
步骤F1.获取队列副本中2n bit位生产者指针地址,并将其转换为n bit位预设类型数据,然后进入步骤F2;其中,步骤F1中的预设类型数据的类型与步骤D1中预设类型数据的类型彼此相同;
步骤F2.针对步骤F1中所获n bit位预设类型数据的指针进行逻辑加1运算,即获得队列副本中生产者指针地址中的高n bit位数据,然后进入步骤G。
作为本发明的一种优选技术方案,所述预设类型数据为char类型数据。
本发明所述一种队列CAS原子操作控制方法采用以上技术方案与现有技术相比,具有以下技术效果:本发明设计的队列CAS原子操作控制方法,基于队列切片思想,用以解决现有技术用CAS loop语句判断生产者单个指针位置、进而间接判断基于范围原子操作极大情况下CAS失败的问题。并且通过所设计方法,将队列元素进行分片,不再单纯判断生产者head指向的单个元素位置,改为CAS判断前后生产者指针指向的片号值,极大程度上提高了队列算法的效率;并且采用本发明设计方法,将256个元素划为一个片块,使得CAS loop循环的失败的次数原理上降低了256倍,大大提高了CAS loop的效率,极大程度上减少了因为CAS失败所导致的高内存消耗,缓解了系统的内存高占用导致的负载压力;实验和理论结果表明,本发明可以极大降低基于范围的原子操作算法的失败率,可广泛适用于无锁队列领域中的高速并发实现中。
附图说明
图1是无锁队列生产者16-bit head指针模块示意图;
图2是本发明所设计队列CAS原子操作控制方法的流程图;
图3是本发明所设计队列CAS原子操作控制方法在队列运用的示意图。
具体实施方式
下面结合说明书附图对本发明的具体实施方式作进一步详细的说明。
本发明设计了一种队列CAS原子操作控制方法,针对发送端向接收端所发送长度为k·2n的无锁单生产者单消费者队列,实现接收端对队列中数据的CAS原子性操作,其中,k和n均为不小于1的整数。
如图1所示无锁队列生产者16-bit head指针模块示意图。首先需要申明队列生产者Producer的指针head,其类型为16-bits long integer。该指针声明为全局变量,用于记录生产者当前所在的位置。Head指针其中高8位代表的是该元素所在片块的首地址,为关键地址值(key address value),其低8位为该元素在所在片块内的偏移值,低8位代表一个片块包含256个元素。
如图2所示,针对如图1所示模块,具体设计实际应用中的实施例,具体执行如下步骤:
步骤A.针对队列中的所有队列单元,按2n个队列单元为一个片块,顺序划分获得k个片块,然后进入步骤B。实际应用中,此实施例中,n=8,2n=256,即按256个队列单元为一个片块,顺序划分获得k个片块,如图3所示。
步骤B.针对生产者指针所指向队列中的队列单元,构建数据长度为2n bit位的生产者指针地址,其中,生产者指针地址中的高n bit位表示生产者指针所指队列单元所在片块的首地址,生产者指针地址中的低n bit位表示生产者指针所指队列单元在所在片块中的偏移地址,然后进入步骤C。此实施例中,即构建数据长度为16bit位的生产者指针地址,其中,生产者指针地址中的高8bit位表示生产者指针所指队列单元所在片块的首地址,生产者指针地址中的低8bit位表示生产者指针所指队列单元在所在片块中的偏移地址。
接下来步骤C至步骤G为本发明基于范围的原子操作方法的CAS loop主循环体结构,基于队列切片思想实现了基于范围的原子操作算法,具体如下:
步骤C.判断生产者指针是否越过队列预设阈值位置,是则无法实现接收端对队列中数据的CAS原子性操作,控制方法结束;否则进入步骤D。
步骤D.获取生产者指针地址中高n bit位的副本数据,并进入步骤E。即获取生产者指针地址中高8bit位的副本数据。
上述步骤D在此实施例中,具体包括如下步骤:
步骤D1.获取16bit位生产者指针地址副本数据,并将其转换为8bit位char类型数据,然后进入步骤D2。
步骤D2.针对步骤D1中所获8bit位char类型数据的指针进行逻辑加1运算,并对结果进行取值,即获得生产者指针地址中高8bit位的副本数据,然后进入步骤E。
步骤E.获取队列副本,由接收端根据消费者指针,针对队列副本执行关键操作,然后进入步骤F。
步骤F.获取队列副本中生产者指针地址中的高n bit位数据,并进入步骤G;即获取队列副本中生产者指针地址中的高8bit位数据。
上述步骤F在此实施例中,具体包括如下步骤:
步骤F1.获取队列副本中16bit位生产者指针地址,并将其转换为8bit位char类型数据,然后进入步骤F2。
步骤F2.针对步骤F1中所获8bit位char类型数据的指针进行逻辑加1运算,即获得队列副本中生产者指针地址中的高8bit位数据,然后进入步骤G。
步骤G.判断生产者指针地址中高n bit位的副本数据,与队列副本中生产者指针地址中的高n bit位数据,两者是否相等,是则进入步骤H;否则返回步骤C;在此实施例中,即判断生产者指针地址中高8bit位的副本数据,与队列副本中生产者指针地址中的高8bit位数据,两者是否相等,并按上述判断结果分别操作。
步骤H.采用队列副本针对队列进行替换更新,完成接收端对队列中数据的CAS原子性操作。
基于上述所设计队列CAS原子操作控制方法,实际应用中,具体如以下伪代码所示:
上述技术方案所设计队列CAS原子操作控制方法,基于队列切片思想,用以解决现有技术用CAS loop语句判断生产者单个指针位置、进而间接判断基于范围原子操作极大情况下CAS失败的问题。并且通过所设计方法,将队列元素进行分片,不再单纯判断生产者head指向的单个元素位置,改为CAS判断前后生产者指针指向的片号值,极大程度上提高了队列算法的效率;并且采用本发明设计方法,将256个元素划为一个片块,使得CAS loop循环的失败的次数原理上降低了256倍,大大提高了CAS loop的效率,极大程度上减少了因为CAS失败所导致的高内存消耗,缓解了系统的内存高占用导致的负载压力;实验和理论结果表明,本发明可以极大降低基于范围的原子操作算法的失败率,可广泛适用于无锁队列领域中的高速并发实现中。
上面结合附图对本发明的实施方式作了详细说明,但是本发明并不限于上述实施方式,在本领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。
Claims (3)
1.一种队列CAS原子操作控制方法,其特征在于:针对发送端向接收端所发送长度为k·2n的无锁单生产者单消费者队列,实现接收端对队列中数据的CAS原子性操作,包括如下步骤,其中,k和n均为不小于1的整数;
步骤A.针对队列中的所有队列单元,按2n个队列单元为一个片块,顺序划分获得k个片块,然后进入步骤B;
步骤B.针对生产者指针所指向队列中的队列单元,构建数据长度为2n bit位的生产者指针地址,其中,生产者指针地址中的高n bit位表示生产者指针所指队列单元所在片块的首地址,生产者指针地址中的低n bit位表示生产者指针所指队列单元在所在片块中的偏移地址,然后进入步骤C;
步骤C.判断生产者指针是否越过队列预设阈值位置,是则无法实现接收端对队列中数据的CAS原子性操作,控制方法结束;否则进入步骤D;
步骤D.获取生产者指针地址中高n bit位的副本数据,并进入步骤E;
步骤E.获取队列副本,由接收端根据消费者指针,针对队列副本执行关键操作,然后进入步骤F;
步骤F.获取队列副本中生产者指针地址中的高n bit位数据,并进入步骤G;
步骤G.判断生产者指针地址中高n bit位的副本数据,与队列副本中生产者指针地址中的高n bit位数据,两者是否相等,是则进入步骤H;否则返回步骤C;
步骤H.采用队列副本针对队列进行替换更新,完成接收端对队列中数据的CAS原子性操作。
2.根据权利要求1所述一种队列CAS原子操作控制方法,其特征在于,所述步骤D包括如下步骤:
步骤D1.获取2n bit位生产者指针地址副本数据,并将其转换为n bit位预设类型数据,然后进入步骤D2;
步骤D2.针对步骤D1中所获n bit位预设类型数据的指针进行逻辑加1运算,并对结果进行取值,即获得生产者指针地址中高n bit位的副本数据,然后进入步骤E;
所述步骤F包括如下步骤:
步骤F1.获取队列副本中2n bit位生产者指针地址,并将其转换为n bit位预设类型数据,然后进入步骤F2;其中,步骤F1中的预设类型数据的类型与步骤D1中预设类型数据的类型彼此相同;
步骤F2.针对步骤F1中所获n bit位预设类型数据的指针进行逻辑加1运算,即获得队列副本中生产者指针地址中的高n bit位数据,然后进入步骤G。
3.根据权利要求2所述一种队列CAS原子操作控制方法,其特征在于:所述预设类型数据为char类型数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810169516.7A CN108509186B (zh) | 2018-02-28 | 2018-02-28 | 一种队列cas原子操作控制方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810169516.7A CN108509186B (zh) | 2018-02-28 | 2018-02-28 | 一种队列cas原子操作控制方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108509186A CN108509186A (zh) | 2018-09-07 |
CN108509186B true CN108509186B (zh) | 2021-06-15 |
Family
ID=63376515
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810169516.7A Active CN108509186B (zh) | 2018-02-28 | 2018-02-28 | 一种队列cas原子操作控制方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108509186B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109471743A (zh) * | 2018-11-12 | 2019-03-15 | 深圳前海微众银行股份有限公司 | 日志收集方法、装置及计算机可读存储介质 |
CN113176896B (zh) * | 2021-03-19 | 2022-12-13 | 中盈优创资讯科技有限公司 | 一种基于单进单出无锁队列的随机取出对象的方法 |
CN117255055B (zh) * | 2023-11-15 | 2024-02-23 | 新华三技术有限公司 | 报文转发方法、装置及电子设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6976260B1 (en) * | 1999-09-24 | 2005-12-13 | International Business Machines Corporation | Method and apparatus for serializing a message queue in a multiprocessing environment |
CN102591843A (zh) * | 2011-12-30 | 2012-07-18 | 中国科学技术大学苏州研究院 | 多核处理器的核间通信方法 |
CN103262036A (zh) * | 2010-12-17 | 2013-08-21 | 英特尔公司 | 非阻塞无等待数据并行调度器 |
CN107515795A (zh) * | 2017-09-08 | 2017-12-26 | 北京京东尚科信息技术有限公司 | 基于队列的多任务并行数据处理方法、装置、介质和设备 |
-
2018
- 2018-02-28 CN CN201810169516.7A patent/CN108509186B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6976260B1 (en) * | 1999-09-24 | 2005-12-13 | International Business Machines Corporation | Method and apparatus for serializing a message queue in a multiprocessing environment |
CN103262036A (zh) * | 2010-12-17 | 2013-08-21 | 英特尔公司 | 非阻塞无等待数据并行调度器 |
CN102591843A (zh) * | 2011-12-30 | 2012-07-18 | 中国科学技术大学苏州研究院 | 多核处理器的核间通信方法 |
CN107515795A (zh) * | 2017-09-08 | 2017-12-26 | 北京京东尚科信息技术有限公司 | 基于队列的多任务并行数据处理方法、装置、介质和设备 |
Non-Patent Citations (1)
Title |
---|
面向并行安全网关流水线模型的无锁队列算法;高志民;《北京交通大学学报》;20101115;第34卷(第5期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN108509186A (zh) | 2018-09-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9407287B2 (en) | Parallel history search and encoding for dictionary-based compression | |
US9851917B2 (en) | Method for de-duplicating data and apparatus therefor | |
CN108509186B (zh) | 一种队列cas原子操作控制方法 | |
US10255287B2 (en) | Method and apparatus for on-disk deduplication metadata for a deduplication file system | |
EP3376393B1 (en) | Data storage method and apparatus | |
CN105320490A (zh) | 用于异步fifo电路的方法和设备 | |
US20120072652A1 (en) | Multi-level buffer pool extensions | |
KR20140047916A (ko) | 데이터 압축 장치 및 방법, 데이터 압축 장치를 포함하는 메모리 시스템 | |
US9304898B2 (en) | Hardware-based array compression | |
US8959522B2 (en) | Full exploitation of parallel processors for data processing | |
US10884920B2 (en) | Metadata-based operations for use with solid state devices | |
CN110888603A (zh) | 高并发数据写入方法、装置、计算机设备及存储介质 | |
KR20150117522A (ko) | 그래픽스 상태 관리 장치 및 방법 | |
Andrzejewski et al. | GPU-PLWAH: GPU-based implementation of the PLWAH algorithm for compressing bitmaps | |
US20220269675A1 (en) | Hash-based data structure | |
CN115934023A (zh) | 数据处理方法、数据处理装置以及相关设备 | |
CN114327252A (zh) | 使用基于内容的块对齐实现基于块的存储系统中的数据简化 | |
KR20220100030A (ko) | 패턴 기반 캐시 블록 압축 | |
CN108804131B (zh) | 一种两配置文件的对比算法 | |
US20200387491A1 (en) | Systems and methods for fast bloom filter operations | |
US11816106B2 (en) | Memory management for KLL sketch | |
CN113342853B (zh) | 流式数据处理方法和系统 | |
CN103279531B (zh) | 一种分布式文件系统中基于内容的文件分块方法 | |
CN113505102B (zh) | 一种基于奇偶一致性区间的内容分块方法 | |
CN115331739A (zh) | 一种基于Spark的大规模基因序列无损并行化压缩方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |