一种采用消隐技术的锁无关栈算法

非阻塞同步方法处理共享数据不使用锁机制,利用处理器提供的特殊指令(compare-and-swap等指令)设计相应算法保证访问共享数据的正确性,使多个任务可以同时访问共享数据。现在国外的主要研究方向为非阻塞同步算法设计、算法正确性的理论证明、算法性能测试等,并致力于在满足要求的前提下实现算法的高性能、平台无关和广泛应用。

2锁无关算法及ELABS算法实现技术

2.1锁无关算法的基本结构

大多数共享数据是以栈、队列等基本数据结构形式存在的。锁无关算法实现了多个任务可以同时操作的基本数据结构。锁无关算法包括多个处理共享数据的操作,如栈包括入栈、出栈两个基本操作。其中每一个操作的如图1所示。

图1锁无关算法中一个操作的流程图

Fig.1flowchatofanoperationoflock-freealgorithm

每个操作不断地试图修改共享数据直到成功为止。可以将每个操作分为循环部分、循环前部分、循环后部分,循环部分是一个潜在的无限循环。

2.2ELABS算法实现关键技术

ELABS算法由CAS(Compare-and-Swap)指令实现,在一条指令中完成对共享变量的测试和更新。CAS指令主要形式为CAS(&val,oldval,newval),执行过程如下:val等于oldval时赋值val为newval,否则失败。使用CAS指令必须解决“ABA问题”:如果一个任务读取共享变量的值为A,在对共享变量赋新值之前共享变量被另一个任务修改为B后又改回A。则此时比较和交换操作虽然得到正确执行,但违背了对共享变量的读与写之间不能发生其他任务写操作的原则。最常用的解决方法是对变量添加一个修改计数,当对变量修改时加一,对变量和修改计数同时判定。这种方法未完全避免ABA问题,但将其发生的概率降低到极其低的水平,可以忽略不计。

为了提高算法的效率,ELABS算法根据栈结构的特点采用了消隐技术。消隐的工作机制即让一对相反且连续的操作进行数据交换,而不用对实际数据进行操作,从而简化了操作过程,减少了访问共享数据的冲突。对栈结构而言,入栈操作和出栈操作作用于同一位置,因此更加适合消隐技术的实现。

3ELABS算法及正确性证明

ELABS算法中栈包括栈头项、栈大小、栈数据数组,数据数组中的栈顶称为栈顶项。栈头项中包括栈顶索引、栈头项中的值是否有效的标记、修改计数、数据值,用于记录栈的状态并暂时存储最近入栈数据。

在LABS算法中同样采用栈头项暂存最近入栈数据,但任何操作必须首先将栈头中的数据复制到数据数组,而这样的操作有时是无意义的,如栈头项中的数据已经无效时。采用消隐技术可以通过栈头项实现数据的交换,而无需对数据数组进行操作。ELABS算法在栈头项中设置数据是否有效的标记,可得到如下简化操作:1)当入栈且标记无效时,直接修改栈头项并设置标记有效即可;2)当出栈且标记有效时,直接修改栈头项并设置标记无效即可。3)当出栈且标记无效时,先读取栈顶项再修改栈头项并设置标记无效,而读操作不会产生数据访问冲突。

(1)主要数据类型:

Top{index:15;tag:1;counter:16;intvalue;};

stackItem{intvalue;intcounter;};

stack{Toptop;intsize;stackItem*item;};

其中栈头项和数据项各占用8个字节。CAS64操作封装了可以操作8字节的CAS指令,要求必须为2个相邻的4字节。

(2)入栈操作

入栈操作首先获取栈头项,判定栈满时返回;然后判定栈头项标记是否有效,有效时将其写入数据项,如果失败则重新执行;最后组合新的栈头项内容并写入栈头项中,失败时重新执行。

(3)出栈操作

出栈操作首先获取栈头项,判定栈空时返回;然后获取栈顶项并组合新的栈头项内容并写入栈头项中,失败时重新执行;最后根据栈头项标记是否有效判定出栈的值在栈头项中还是栈顶项中。

由于ELABS算法正确性的验证不能采用实际测试程序,只能通过理论证明方法,算法的正确性包括安全性、可线性化、锁无关性。安全性是指保证算法符合具体数据结构的操作要求,如栈必须对栈顶进行操作;可线性化是指算法中每一个操作都会在一个特殊点生效,避免并发访问共享数据而可能出现的数据不一致风险;锁无关性是锁无关算法的本质特征,即保证整个系统会在有限的步骤内完成对同一共享数据的某些操作。4实验

实验一测试对比了基于锁的算法、LABS算法和ELABS算法实现的栈之间的性能,其中入栈、出栈的顺序随机产生。试验结果表明,ELABS比Lock、LABS具有更高的性能。随着并行度的增大,锁无关算法的执行速度越明显,并且在任务数量较少时也具有优势。

为测试消隐技术对性能的影响,实验二对实验一中的测试用例进行了限制,提高了可消隐操作的比例。试验结果表明,在存在大量消隐的情况下ELABS的性能优势更加明显,分别比Lock、LABS有大幅度提高,证明采用消隐技术提高了算法的执行速度。

锁无关算法不采用锁机制对任务之间进行同步,避免了锁机制引起的诸多缺点:1)避免死锁,多个任务可同时访问共享资源,打破了死锁发生的相互排斥、请求和保持等必要条件;2)避免优先级逆转,高优先任务无需获取访问共享资源的锁;3)提高容错性,单一任务的崩溃不会因为持有锁而导致其他任务的永久阻塞。

综合上述,ELABS算法具有更高执行速度,在一定程度上提高了实时系统的性能和实时性,并完全避免了使用锁而引起的死锁、优先级逆转、低容错性等缺点。

5总结

本文提出了一种采用消隐技术的锁无关栈算法,证明了该算法的正确性,并通过实验得到算法具有更高的执行速度,避免死锁、优先级逆转、低容错性等缺点。将该算法应用到对现有共享数据结构的改造中,将有利于提高实时系统的性能、确定性和容错性。

THE END
1.检查不同类型的数据有关在机器学习中检查不同类型数据的概念单元https://docs.microsoft.com/zh-cn/training/modules/introduction-to-data-for-machine-learning/4-examine-data-types
2.常见的10种算法算法 研究的目的:是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。 参考原文:常见的10种算法 - 知乎 一般有以下几种常用运算: 检索:检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。 https://blog.csdn.net/zxf347085420/article/details/136269980
3.数据分析常用算法分析数据的算法数据分析常用算法 分析数据的算法,数据分析过程1)明确分析目的和思路2)目标数据确定和采集3)数据处理4)数据分析5)结果可视化及结果支持的决策四大基本数据分析算法1)趋势分析一般用于核心指标的长期跟踪最好的产出是比值:①环比②同比③定基比比如2017年4月份比3月https://blog.51cto.com/u_16213721/10298836
4.什么是数据结构?什么是算法?怎么学习数据结构与算法?学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。 本文将回顾数据结构与算法的基础知识,学习日常所接触场景中的一些算法和策https://maimai.cn/article/detail?fid=1744039689&efid=u2sSJyH6RePBrCh7o1dCfA
5.数据结构基本概念算法(递归算法)及性能分析与量度算法举例(递归) 定义 所谓递归,从字面意思可以看出有两个过程:“递去”和“归来”,即在“递去”过程中满足某个条件后进行“归来”。 绝大数编程语言支持函数的==自调用==,在这些函数可以通过调用自身来进行递归。 举例 整数n的阶乘(n!) 代码如下 https://www.jianshu.com/p/f7478241139c
6.Java数据结构与算法入门实例详解java这篇文章主要介绍了Java数据结构与算法入门实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下https://www.jb51.net/article/207215.htm
7.算法I~IV(C++实现)――基础数据结构排序和搜索(第三版)(豆瓣)图书算法I~IV(C++实现)――基础、数据结构、排序和搜索(第三版) 介绍、书评、论坛及推荐https://book.douban.com/subject/1143801/
8.2023哈工大考研854计算机基醇点之计算机系统与数据结构1)数据结构与算法的概念 数据结构与算法及其相关的基本概念,算法及其复杂性分析 2)线性表 线性结构及其操作算法,线性表的应用及算法 3)树与二叉树 二叉树的定义、性质、表示、遍历算法,树的表示、操作算法,森林与二叉树关系,树与二叉树的应用及算法 4)图及其相关算法 图的相关概念,图的存储结构与搜索算法,图的https://www.gaodun.com/kaoyan/1267636.html
9.数据分析中的数据挖掘需要哪些算法数据分析中的数据挖掘需要以下算法:一、分类算法;二、聚类算法;三、关联规则算法;四、分类与回归树算法;五、Adaboost算法;六、期望最大化算法;七、最近邻算法;八、神经网络算法。在数据分析中,数据挖掘算法可以帮助发现数据中隐藏的模式、关系、趋势和异常。 https://www.linkflowtech.com/news/1594
10.数据挖掘的常见算法有哪些?数据挖掘是一种通过从大量数据中提取知识和信息的方法,以支持业务决策、市场分析和科学研究等领域。在数据挖掘过程中,算法是最重要的组成部分之一。以下是常见的数据挖掘算法。1.分类算法分类算法是一类用于将数据样本分为不同类别的算法。这些算法通常使用 https://www.cda.cn/bigdata/202782.html
11.数据科学家最常使用的十大算法大数据干货(二)本文来自于KDnuggets所做的十大算法调查,对于数据工程师常用的算法进行排名,并对其在2011-2016年间的变化进行介绍。 基于调查,KDnuggets总结出了数据科学家最常使用的十大算法,它们分别是: ▲Regression 回归算法 ▲Clustering 聚类算法 ▲Decision Trees/Rules 决策树 https://www.evget.com/doclib/s/14/10616
12.北京市数据知识产权登记常见问题解答(一)根据《北京市数据知识产权登记管理办法(试行)》第二条规定,数据持有者或者数据处理者依据法律法规规定或者合同约定收集,经过一定规则或算法处理的、具有商业价值及智力成果属性的处于未公开状态的数据集合可以申请数据知识产权登记。 2.数据知识产权的登记主体是谁? https://www.bjippc.cn/general/cms/news/info/news/3c06e7a152bd4f43a48c07366d47dbad.html?id=3c06e7a152bd4f43a48c07366d47dbad
13.程序员应该知道的十个基础算法腾讯云开发者社区一. 排序算法 1.冒泡排序:用于将一组数据按照升序或降序进行排列。它通过比较相邻元素的大小来进行交换,直到整个序列排序完成。 2.快速排序:快速排序是一种常用且高效的排序算法。它采用递归的方式将问题划分为更小的子问题,并使用一个基准元素进行排序。 https://cloud.tencent.com/developer/article/2352039