CN104951299A - 一种基于原子操作的信号量链表式堆栈方法 - Google Patents
一种基于原子操作的信号量链表式堆栈方法 Download PDFInfo
- Publication number
- CN104951299A CN104951299A CN201510301201.XA CN201510301201A CN104951299A CN 104951299 A CN104951299 A CN 104951299A CN 201510301201 A CN201510301201 A CN 201510301201A CN 104951299 A CN104951299 A CN 104951299A
- Authority
- CN
- China
- Prior art keywords
- node
- stack
- pointer
- signal
- count value
- 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
- Multi Processors (AREA)
Abstract
本发明借助信号量这种机制中的一些概念,提出一种基于原子操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。所不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该链表中,若减1后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成放入新结点的操作。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。
Description
技术领域
本发明涉及计算机系统软件编程领域,特别是一种基于原子操作的信号量链表式堆栈方法。
背景技术
在计算机领域里信号量是用来实现进程间同步的机制。信号量本身是一个整数,信号量大于等于零表示可供并发进程使用的资源实体数,信号量小于零则表示正在等待使用临界区的进程数。例如在PV原语中,P原语信号量的操作是:若信号量减1后仍大于或等于零,则进程继续执行,若信号量减1后小于零,则该进程被阻塞;V原语信号量的操作是:若信号量加1后大于零,则进程继续执行,若信号量加1后仍小于或等于零,则唤醒一个在该信号量上阻塞的进程。
发明内容
本发明借助信号量这种机制中的一些概念,提出一种基于原子操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。信号计数和出栈计数都是整型值,这里的结点指的是计算机内存中的一块数据,指针是指向这块数据的地址,指针本身也是存放在内存空间里的数据。每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空。与常规的链表式堆栈相比,其同样具有入栈(Push)和出栈(Pop)的操作。所不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减1后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成放入新结点的操作。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。
一种基于原子操作的信号量链表式堆栈方法,包括入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;初始状态栈顶指针为空指针,信号计数值为0,出栈计数值为0;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:先读取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:进行判断,若临时信号计数值减1后小于零,则执行第四步:将要入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点的指针指向新结点,若临时信号计数值减1后大于或等于零,则直接进入下一步;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
本发明进一步的技术方案是:一种基于原子操作的信号量链表式堆栈方法,出栈操作时包括以下步骤:第一步:进行出栈操作时先对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:读取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使得临时信号计数值等于原信号计数值,使得临时出栈计数值等于原出栈计数值加1,使得临时栈顶结点指针等于原栈顶结点的链接指针;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶指针返回,出栈操作结束。
本发明与现有的链表式堆栈相比具有如下特点:进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减1后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成新结点的入栈操作。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。
该方法完全使用原子操作实现,允许在多处理器环境下对其进行并发访问,由于规避了传统的自旋锁的使用,因此在处理器较多的平台上具有性能上的优势,该方法易于扩展,很容易实现类似信号量机制的功能,也可用于管理空闲的计算资源,例如:当空闲计算资源结点不能入栈时,表示之前有任务或请求在申请计算资源时进行过出栈操作但未能获得空闲的计算资源结点,此时可从任务队列中将等待处理的任务分配给该计算资源结点。如果计算资源结点可以入栈,则说明当前任务队列中没有等待处理的任务,直到有新任务提交过来申请计算资源结点时进行出栈操作将该结点弹出,并将任务送达该计算资源结点进行处理,从而实现计算资源的调度,这是常规的链表式堆栈无法实现的。
以下结合附图和具体实施方式对本发明的详细结构作进一步描述。
附图说明
附图1:为本发明的入栈操作流程示意图;
附图2:为本发明的出栈操作流程示意图。
具体实施方式
如附图1所示:一种基于原子操作的信号量链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;初始状态栈顶指针为空指针,信号计数值为0,出栈计数值为0;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:先读取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:取临时信号计数值等于原信号计数值,取临时出栈计数值等于原出栈计数值,取临时栈顶结点指针等于原栈顶结点指针;第三步:进行判断,若临时信号计数值减1后小于零,则执行第四步:将要入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点的指针指向新结点,若临时信号计数值减1后大于或等于零,则直接进入下一步;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:进行判断,如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
如附图2所示:一种基于原子操作的信号量链表式堆栈方法,第一步:进行出栈操作时先对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:读取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使得临时信号计数值等于原信号计数值,使得临时出栈计数值等于原出栈计数值加1,使得临时栈顶结点指针等于原栈顶结点的链接指针;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶指针返回,出栈操作结束。
原子加1操作:在计算机系统中,尤其是对称多处理器系统中,对内存中的数据进行运算修改时包含从内存取数据、运算、将运算结果写回内存这三个步骤。当多个处理器同时对同一个内存中的变量进行运算操作时,如果没有约束条件的话,他们可能取的数据是同一个值,最终运算结果会变成最后一个写回内存的处理器运算的结果,而不是这几个处理器分别对该内存中的变量进行计算后的结果。例如3个处理器同时对一个值为0的内存变量进行加1操作,很可能最终计算后该内存变量的结果为1或者2,而不是3。在X86处理器平台上对目的操作数为内存变量的运算指令前加LOCK前缀,将保证该指令执行期间其他处理器不能访问该内存变量,直到该指令将运算结果写回目的内存后,其他处理器才能对该内存变量进行操作。带LOCK前缀的加1指令就能保证多个处理器同时对同一内存变量进行加1操作的最终结果是这几个处理器分别对该变量进行加1的结果。这就是原子加1操作。
原子比较并交换操作(CAS):该操作有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做,并且在此操作期间其他处理器不能对内存值V进行操作。
本发明涉及到计算机专业领域里原子操作的概念,对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现这些原子操作。例如本发明中使用的原子比较并交换(CAS)操作在Intel x86处理器平台上可以用LOCK CMPXCHG指令实现,也可以使用LOCK CMPXCHG8B指令实现,在64位模式下也可以使用LOCK CMPXCHG16B指令实现,且不同的处理器硬件平台实现这些原子操作的机器指令是不同的,不能将这种差异解释为超出本发明的范畴。
Claims (2)
1.一种基于原子操作的信号量链表式堆栈方法,包括入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;初始状态栈顶指针为空指针,信号计数值为0,出栈计数值为0;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;其特征在于进行入栈操作时包括以下步骤:第一步:先读取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:进行判断,若临时信号计数值减1后小于零,则执行第四步:将要入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点的指针指向新结点,若临时信号计数值减1后大于或等于零,则直接进入下一步;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
2.根据权利要求1所述的一种基于原子操作的信号量链表式堆栈方法实施步骤,其特征是:出栈操作包括以下步骤:第一步:进行出栈操作时先对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:读取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值加1,使临时栈顶结点指针的值等于原栈顶结点的链接指针的值;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶指针返回,出栈操作结束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510301201.XA CN104951299B (zh) | 2015-06-04 | 2015-06-04 | 一种基于原子操作的信号量链表式堆栈方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510301201.XA CN104951299B (zh) | 2015-06-04 | 2015-06-04 | 一种基于原子操作的信号量链表式堆栈方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104951299A true CN104951299A (zh) | 2015-09-30 |
CN104951299B CN104951299B (zh) | 2018-07-17 |
Family
ID=54165971
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510301201.XA Active CN104951299B (zh) | 2015-06-04 | 2015-06-04 | 一种基于原子操作的信号量链表式堆栈方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104951299B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105760216A (zh) * | 2016-02-29 | 2016-07-13 | 惠州市德赛西威汽车电子股份有限公司 | 一种多进程同步控制方法 |
CN106843806A (zh) * | 2016-12-20 | 2017-06-13 | 中国科学院信息工程研究所 | 一种多核环境下基于数组结构的无等待栈操作方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060005191A1 (en) * | 2004-06-30 | 2006-01-05 | Boehm Hans-Juergen K H | Almost non-blocking linked stack implementation |
CN104615445A (zh) * | 2015-03-02 | 2015-05-13 | 长沙新弘软件有限公司 | 一种基于原子操作的设备io队列方法 |
-
2015
- 2015-06-04 CN CN201510301201.XA patent/CN104951299B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060005191A1 (en) * | 2004-06-30 | 2006-01-05 | Boehm Hans-Juergen K H | Almost non-blocking linked stack implementation |
CN104615445A (zh) * | 2015-03-02 | 2015-05-13 | 长沙新弘软件有限公司 | 一种基于原子操作的设备io队列方法 |
Non-Patent Citations (3)
Title |
---|
ARPAN SEN: ""用于并行计算的多线程数据结构,第1部分:设计并发数据结构"", 《HTTPS://WWW.IBM.COM/DEVELOPERWORKS/CN/AIX/LIBRARY/AU-MULTITHREADED_STRUCTURES1/INDEX.HTML》 * |
ARPAN SEN: ""用于并行计算的多线程数据结构,第2部分:设计不使用互斥锁的并发数据结构"", 《HTTPS://WWW.IBM.COM/DEVELOPERWORKS/CN/AIX/LIBRARY/AU-MULTITHREADED_STRUCTURES2/INDEX.HTML》 * |
王万森等: "《计算机操作系统原理第2版》", 31 May 2008, 高等教育出版社 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105760216A (zh) * | 2016-02-29 | 2016-07-13 | 惠州市德赛西威汽车电子股份有限公司 | 一种多进程同步控制方法 |
CN106843806A (zh) * | 2016-12-20 | 2017-06-13 | 中国科学院信息工程研究所 | 一种多核环境下基于数组结构的无等待栈操作方法 |
CN106843806B (zh) * | 2016-12-20 | 2019-04-26 | 中国科学院信息工程研究所 | 一种多核环境下基于数组结构的无等待栈操作方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104951299B (zh) | 2018-07-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
RU2550558C2 (ru) | Сравнение и замена позиции таблицы динамической трансляции адреса | |
CN110018850A (zh) | 用于可配置空间加速器中的多播的设备、方法和系统 | |
US8484438B2 (en) | Hierarchical bloom filters for facilitating concurrency control | |
CN101652761B (zh) | 使用缓存写和强制串行化次序的事务存储器 | |
US10620988B2 (en) | Distributed computing architecture | |
US20080250213A1 (en) | Computer Architecture And Method Of Operation for Multi-Computer Distributed Processing Having Redundant Array Of Independent Systems With Replicated Memory And Code Striping | |
CN105190541A (zh) | 利用具有寄存器视图、源视图、指令视图以及多个注册模板的微处理器体系架构执行指令块的方法 | |
US11620215B2 (en) | Multi-threaded pause-less replicating garbage collection | |
EP3857383B1 (en) | Method for vectorizing d-heaps using horizontal aggregation simd instructions | |
US11816061B2 (en) | Dynamic allocation of arithmetic logic units for vectorized operations | |
CN105164637A (zh) | 对管线化的软件的动态优化 | |
US20200319893A1 (en) | Booting Tiles of Processing Units | |
Smith et al. | A tight i/o lower bound for matrix multiplication | |
Leite et al. | LRMalloc: A modern and competitive lock-free dynamic memory allocator | |
CN104951299A (zh) | 一种基于原子操作的信号量链表式堆栈方法 | |
WO2022146628A1 (en) | Address mapping-aware tasking mechanism | |
Mohamed El Maarouf et al. | Combining reduction with synchronization barrier on multi‐core processors | |
Khanchandani et al. | On the importance of synchronization primitives with low consensus numbers | |
Li et al. | Fastblock: Accelerating blockchains via hardware transactional memory | |
CN108292269A (zh) | 用于监视地址冲突的计数器 | |
CN105320494A (zh) | 带有一致的和非一致的子系统的存储器排序 | |
CN107003855B (zh) | 带进位的原子加法指令 | |
US20130138922A1 (en) | Register management in an extended processor architecture | |
CN101300544A (zh) | 大数乘法方法和装置 | |
CN111279308B (zh) | 代码转换期间的屏障减少 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |