CN104809027A - 一种基于无锁缓冲区的数据采集方法 - Google Patents
一种基于无锁缓冲区的数据采集方法 Download PDFInfo
- Publication number
- CN104809027A CN104809027A CN201510192246.8A CN201510192246A CN104809027A CN 104809027 A CN104809027 A CN 104809027A CN 201510192246 A CN201510192246 A CN 201510192246A CN 104809027 A CN104809027 A CN 104809027A
- Authority
- CN
- China
- Prior art keywords
- data
- buffer zone
- thread
- producer
- lock
- 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
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Complex Calculations (AREA)
Abstract
本发明公开了一种基于无锁缓冲区的数据采集方法,该方法包括:使用面向对象方法抽象数据逻辑,建立生产者-消费者数据采集模型;使用多线程技术,建立数据生产者线程和消费者线程;使用有序堆作为多线程同步的数据缓冲区;使用CAS原子操作构建数据缓冲区数据读写的无锁同步算法。本发明使用生产者-消费者缓冲区实现有序的数据排列,并且能够以无锁的方式实现两部分线程的同步访问而不出现数据污染和冲突。
Description
技术领域
本发明涉及计算机应用领域,尤其涉及一种基于无锁缓冲区的数据采集方法。
背景技术
在传统的数据并发采集系统中,使用基于锁的生产者—消费者缓冲区队列模型,同一时间只能有一个线程获得数据队列缓冲区。基于锁的数据结构能够部分解决多线程成并发的问题,但是由于锁结构本身依赖与操作系统内核的实现方式,获得锁和释放锁设计线程从用户态到内核态的上下文切换问题,而且锁粒度大小难以控制,因此,在并发程序中的性能问题也逐渐显露。
阻塞型算法试图用不同形式的锁(Lock)来解决并行算法遇到的访问冲突问题,但是这种方法存在着死锁、活锁、条件竞争等多种多样的问题,为了解决这些问题,另一种并行算法——非阻塞型算法被提出来。非阻塞型算法一般要满足如下的前进条件之一:
(1)无等待条件(wait-free):该条件要求当前线程的任务在有限步骤内完成,在任务所有的操作完成前,并不管其他线程的任何操作。也就是说把只有当前线程的所有操作完成之后,其他的线程才能开始任务,但在现实中一个线程的任务数量可能很大,这种方法十分依赖线程的数目,因此在实际中应用的比较少;
(2)无锁条件(lock-free):该条件要求当前线程的任务能够在有限的步骤内完成,但是不同于无等待模型的是,每一次线程执行时只用保证完成部分操作。这就保证了多任务的调度顺利,因此在大多数的无锁数据结构都是采用此种模型;
(3)无干扰条件(obstruction-free):该条件同样要求线程能够在有限的步骤内完成,同时要求当前线程被其它线程影响后能够继续执行。
这些条件中的每一个都能够保证能实现和阻塞锁达到的要求,但是在实践中条件越严苛的实现起来的代价就越高,但是性能也越好,目前主要的研究集中在满足无锁(lock-free)条件的并发数据结构上面。
无锁(lock-free)数据结构的实现基础是高级别的原子操作(High-level atomic operation),原子操作提供一个一致性接口:要么操作完成,要么操作失败什么也不做——如果操作失败,用户必须重试,失败后进行其他操作,因此用原子操作实现共享资源使用的线性化进而实现无锁数据结构成为研究者的首选。这其中CAS (Compare-And-Swap) 操作更加简洁和高效,用它能够实现解决多线程无锁同步问题。
发明内容
本发明的目的在于针对现有技术的不足,提供一种基于无锁缓冲区的数据采集方法。
本发明的目的是通过以下技术方案来来实现的:一种基于无锁缓冲区的数据采集方法,包括以下步骤:
(1)建立生产者-消费者数据采集模型;所述生产者-消费者数据采集模型包括采集部分和处理部分,采集部分和处理部分并行进行;
(2)建立数据生产者线程和测点数据消费者线程;
(3)使用有序堆建立数据缓冲区,数据缓冲区中的数据按时间戳有序排放,数据缓冲区容量固定,数据节点在逻辑上是树形结构;
(4)数据生产者线程和测点数据消费者线程对缓冲区进行同步操作,操作完成后缓冲区恢复有序;
(5)使用CAS原子操作实现对缓冲区的无锁增加、删除和排序,实现线程同步操作,避免两组工作线程阻塞。
进一步地,所述步骤(2)中,生产者和消费者可能是单一线程也可能是一组工作线程,两个线程单独工作互不影响。
进一步地,所述步骤(4)具体为:生产者采集数据存入数据缓冲区,若缓冲区不满,将生产者采集的数据直接放入缓冲区的末尾,并且对缓冲区中的数据按时间戳自动排序;若缓冲区满,生产者采集的数据与缓冲区中时间戳最旧的数据交换后按时间戳自动排序;消费者从数据缓冲区取数据,若缓冲区不空,将缓冲区中时间戳最新的数据取出,并且对缓冲区中剩余数据按时间戳自动排序;若缓冲区空,则等待生产者采集的数据。
本发明的有益效果是:本发明使用生产者-消费者缓冲区实现有序的数据排列,并且能够以无锁的方式实现两部分线程的同步访问而不出现数据污染和冲突。
附图说明
图1 无锁缓冲区的插入算法流程图;
图2 无锁缓冲区的删除算法流程图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步详细说明。
本发明一种基于无锁缓冲区的数据采集方法,包括以下步骤:
(1)建立生产者-消费者数据采集模型;所述生产者-消费者数据采集模型包括采集部分和处理部分,采集部分和处理部分并行进行;
(2)建立数据生产者线程和测点数据消费者线程;生产者和消费者可能是单一线程也可能是一组工作线程,两个线程单独工作互不影响。
(3)使用有序堆建立数据缓冲区,数据缓冲区中的数据按时间戳有序排放,数据缓冲区容量固定,数据节点在逻辑上是树形结构;
(4)数据生产者线程和测点数据消费者线程对缓冲区进行同步操作,操作完成后缓冲区恢复有序;具体为:生产者采集数据存入数据缓冲区,若缓冲区不满,将生产者采集的数据直接放入缓冲区的末尾,并且对缓冲区中的数据按时间戳自动排序;若缓冲区满,生产者采集的数据与缓冲区中时间戳最旧的数据交换后按时间戳自动排序;消费者从数据缓冲区取数据,若缓冲区不空,将缓冲区中时间戳最新的数据取出,并且对缓冲区中剩余数据按时间戳自动排序;若缓冲区空,则等待生产者采集的数据。
(5)使用CAS原子操作实现对缓冲区的无锁增加、删除和排序,实现线程同步操作,避免两组工作线程阻塞。
实施例
利用定长数组实现堆(Heap),此时数组成为一种平衡二叉树。数组的第一个元素是树的根,数组的第二三个节点分别是树的左右孩子。这样树的索引非常方便,假如当前节点的索引值为i的话,那么他的双亲节点为:iParent = floor((i-1) / 2);左孩子节点为:iLeftChild = 2*i + 1;右孩子节点为:iRightChild = 2*i + 2。插入的过程就是一个不断进行堆化的过程,每次插入一个节点同时删除一个节点,不仅能够保持元素的相对有序,而且不用进行显式的删除元素的操作。
无锁堆的数据结构如代码LockFreeHeap所示,包含一个恒定的数组以及保持修改状态的变量N,和数组的长度LEN,该无锁堆在第一次使用时分配恒定的内存,在使用的过程中,内存不会重新分配与释放。值得注意的是这里使用了另外一个显式的状态变量,这个变量叫做排序状态,它的作用是保证当前只有一个线程能够对堆进行堆化操作
class LockFreeHeap
{
Key* buffer; // 存储元素的数组
int N = 0; // 元素的最大索引,第0个位置不用
int LEN=10;//数组的最大长度
bool status=0;//堆所处的状态:0,未交换状态;1,交换状态
};
当生产者获取数据节点时,向LockFreeHeap中添加元素,普通的堆实现方法要在这时对堆进行堆化,使堆相对有序,但是这不能进行堆化,原因是堆化的过程是一个元素位置交换的过程,如果此时进行堆化,当消费者同时也在进行堆化的时候就会造成堆混乱。因此这里的堆化操作应该只由消费者获得节点数据后单独进行堆化,这个过程中不能产生新的节点,因此要对其进行CAS索引保护,这样生产者就不能进行增加测点的工作。
生产者线程插入数据的算法如图1所示,在缓冲区不满的时候,直接插入到缓冲区的末尾;当缓冲区已满的时候则要首先找到掉缓冲区中时间戳最旧元素,并与之交换信息,交换信息的过程中,保持无锁堆状态不能改变,因此用CAS操作来监测无锁堆的状态,直到确定其他的线程都不能访问。
消费者删除节点时,先要找到与当前时间比对最近的节点的时间戳,获取节点之后,修改索引值,然后再进行堆化操作,在这个过程中同样要保证无锁堆的交换状态和修改状态的一致性,删除节点的算法如图2所示。该算法与插入算法不同的地方在于要比对与当前时间最近的节点,然后进行堆化操作。
Claims (3)
1.一种基于无锁缓冲区的数据采集方法,其特征在于,包括以下步骤:
(1)建立生产者-消费者数据采集模型;所述生产者-消费者数据采集模型包括采集部分和处理部分,采集部分和处理部分并行进行;
(2)建立数据生产者线程和测点数据消费者线程;
(3)使用有序堆建立数据缓冲区,数据缓冲区中的数据按时间戳有序排放,数据缓冲区容量固定,数据节点在逻辑上是树形结构;
(4)数据生产者线程和测点数据消费者线程对缓冲区进行同步操作,操作完成后缓冲区恢复有序;
(5)使用CAS原子操作实现对缓冲区的无锁增加、删除和排序,实现线程同步操作,避免两组工作线程阻塞。
2.根据权利要求1所述的一种基于无锁缓冲区的数据采集方法,其特征在于,所述步骤(2)中,生产者和消费者可能是单一线程也可能是一组工作线程,两个线程单独工作互不影响。
3.根据权利要求1所述的一种基于无锁缓冲区的数据采集方法,其特征在于,所述步骤(4)具体为:生产者采集数据存入数据缓冲区,若缓冲区不满,将生产者采集的数据直接放入缓冲区的末尾,并且对缓冲区中的数据按时间戳自动排序;若缓冲区满,生产者采集的数据与缓冲区中时间戳最旧的数据交换后按时间戳自动排序;消费者从数据缓冲区取数据,若缓冲区不空,将缓冲区中时间戳最新的数据取出,并且对缓冲区中剩余数据按时间戳自动排序;若缓冲区空,则等待生产者采集的数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510192246.8A CN104809027B (zh) | 2015-04-21 | 2015-04-21 | 一种基于无锁缓冲区的数据采集方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510192246.8A CN104809027B (zh) | 2015-04-21 | 2015-04-21 | 一种基于无锁缓冲区的数据采集方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104809027A true CN104809027A (zh) | 2015-07-29 |
CN104809027B CN104809027B (zh) | 2018-03-16 |
Family
ID=53693875
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510192246.8A Active CN104809027B (zh) | 2015-04-21 | 2015-04-21 | 一种基于无锁缓冲区的数据采集方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104809027B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106843806A (zh) * | 2016-12-20 | 2017-06-13 | 中国科学院信息工程研究所 | 一种多核环境下基于数组结构的无等待栈操作方法 |
CN107741883A (zh) * | 2017-09-29 | 2018-02-27 | 武汉斗鱼网络科技有限公司 | 一种避免线程阻塞的方法、装置及计算机设备 |
CN108170758A (zh) * | 2017-12-22 | 2018-06-15 | 福建天泉教育科技有限公司 | 高并发数据存储方法及计算机可读存储介质 |
CN108241718A (zh) * | 2016-12-27 | 2018-07-03 | 腾讯科技(北京)有限公司 | 一种数据并行处理的方法及服务器 |
CN110543373A (zh) * | 2019-11-04 | 2019-12-06 | 长沙新弘软件有限公司 | 一种用户线程访问内核的方法 |
CN111541847A (zh) * | 2020-05-14 | 2020-08-14 | 南京博视医疗科技有限公司 | 一种高速相机图像序列的处理方法及其处理系统 |
CN113176896A (zh) * | 2021-03-19 | 2021-07-27 | 中盈优创资讯科技有限公司 | 一种基于单进单出无锁队列的随机取出对象的方法 |
CN113377295A (zh) * | 2021-08-13 | 2021-09-10 | 北京华云安信息技术有限公司 | 多生产者单消费者的数据存储和读取方法、装置、设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130198480A1 (en) * | 2012-01-30 | 2013-08-01 | Stephen Jones | Parallel Dynamic Memory Allocation Using A Lock-Free FIFO |
CN104077113A (zh) * | 2014-07-10 | 2014-10-01 | 中船重工(武汉)凌久电子有限责任公司 | 一种无锁并发消息处理机制的实现方法 |
-
2015
- 2015-04-21 CN CN201510192246.8A patent/CN104809027B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130198480A1 (en) * | 2012-01-30 | 2013-08-01 | Stephen Jones | Parallel Dynamic Memory Allocation Using A Lock-Free FIFO |
CN104077113A (zh) * | 2014-07-10 | 2014-10-01 | 中船重工(武汉)凌久电子有限责任公司 | 一种无锁并发消息处理机制的实现方法 |
Non-Patent Citations (2)
Title |
---|
MCKENNEY P E, WALPOLE J.: "Exploiting Deferred Destruction: An Analysis of Read-Copy-Update Techniques in Operating System Kernels", 《SCHOOL OF SCIENCE & ENGINEERING AT OREGON HEALTH & SCIENCE UNIVERSITY》 * |
QI Y, XU B, HE F, ET AL.: "Towards Optimized Packet Classification Algorithms for Multi-Core Network Processors", 《PROCEEDINGS OF THE 2007 INTERNATIONL CONFERENCE ON PARALLEL PROCESSING》 * |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106843806B (zh) * | 2016-12-20 | 2019-04-26 | 中国科学院信息工程研究所 | 一种多核环境下基于数组结构的无等待栈操作方法 |
CN106843806A (zh) * | 2016-12-20 | 2017-06-13 | 中国科学院信息工程研究所 | 一种多核环境下基于数组结构的无等待栈操作方法 |
CN108241718B (zh) * | 2016-12-27 | 2022-02-11 | 腾讯科技(北京)有限公司 | 一种数据并行处理的方法及服务器 |
CN108241718A (zh) * | 2016-12-27 | 2018-07-03 | 腾讯科技(北京)有限公司 | 一种数据并行处理的方法及服务器 |
CN107741883A (zh) * | 2017-09-29 | 2018-02-27 | 武汉斗鱼网络科技有限公司 | 一种避免线程阻塞的方法、装置及计算机设备 |
WO2019061619A1 (zh) * | 2017-09-29 | 2019-04-04 | 武汉斗鱼网络科技有限公司 | 一种避免线程阻塞的方法、装置及计算机设备 |
CN108170758A (zh) * | 2017-12-22 | 2018-06-15 | 福建天泉教育科技有限公司 | 高并发数据存储方法及计算机可读存储介质 |
CN110543373A (zh) * | 2019-11-04 | 2019-12-06 | 长沙新弘软件有限公司 | 一种用户线程访问内核的方法 |
CN110543373B (zh) * | 2019-11-04 | 2020-03-17 | 长沙新弘软件有限公司 | 一种用户线程访问内核的方法 |
CN111541847A (zh) * | 2020-05-14 | 2020-08-14 | 南京博视医疗科技有限公司 | 一种高速相机图像序列的处理方法及其处理系统 |
CN111541847B (zh) * | 2020-05-14 | 2022-03-25 | 南京博视医疗科技有限公司 | 一种高速相机图像序列的处理方法及其处理系统 |
CN113176896A (zh) * | 2021-03-19 | 2021-07-27 | 中盈优创资讯科技有限公司 | 一种基于单进单出无锁队列的随机取出对象的方法 |
CN113377295A (zh) * | 2021-08-13 | 2021-09-10 | 北京华云安信息技术有限公司 | 多生产者单消费者的数据存储和读取方法、装置、设备 |
CN113377295B (zh) * | 2021-08-13 | 2021-12-10 | 北京华云安信息技术有限公司 | 多生产者单消费者的数据存储和读取方法、装置、设备 |
Also Published As
Publication number | Publication date |
---|---|
CN104809027B (zh) | 2018-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104809027A (zh) | 一种基于无锁缓冲区的数据采集方法 | |
US8607249B2 (en) | System and method for efficient concurrent queue implementation | |
US7962923B2 (en) | System and method for generating a lock-free dual queue | |
Aldinucci et al. | An efficient unbounded lock-free queue for multi-core systems | |
US8689237B2 (en) | Multi-lane concurrent bag for facilitating inter-thread communication | |
Gelado et al. | Throughput-oriented GPU memory allocation | |
US8225327B2 (en) | Synchronizing access to a shared resource utilizing selective locking | |
US20130305258A1 (en) | Method and system for processing nested stream events | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US20210255889A1 (en) | Hardware Transactional Memory-Assisted Flat Combining | |
Sundell et al. | A lock-free algorithm for concurrent bags | |
CN103154892A (zh) | 用于多级处理的方法、系统和设备 | |
Gidenstam et al. | Cache-aware lock-free queues for multiple producers/consumers and weak memory consistency | |
Luchangco et al. | On the uncontended complexity of consensus | |
CN105094993B (zh) | 一种多核处理器、数据同步的方法及装置 | |
US20230252081A1 (en) | Scalable range locks | |
CN103699363A (zh) | 一种用于在多核平台下优化关键临界区的方法 | |
Lai et al. | ShmStreaming: A shared memory approach for improving Hadoop streaming performance | |
CN113377549B (zh) | 一种队列数据控制方法、系统及队列数据结构 | |
Romanov et al. | The state-of-the-art LCRQ concurrent queue algorithm does NOT require CAS2 | |
CN109375990B (zh) | 一种基于原子操作的环形链表方法 | |
KR20220083036A (ko) | 시대 기반 메모리 수집 기법과 포인터 기반 메모리 수집 기법 혼합을 위한 컴퓨터 시스템 및 그의 방법 | |
Elbayoumi et al. | A novel concurrent cache-friendly binary decision diagram construction for multi-core platforms | |
Gilbert et al. | Parallel Finger Search Structures | |
Aghazadeh et al. | Brief announcement: Resettable objects and efficient memory reclamation for concurrent algorithms |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |