CN107102842A - 一种基于原子操作的信号量链表式堆栈方法 - Google Patents

一种基于原子操作的信号量链表式堆栈方法 Download PDF

Info

Publication number
CN107102842A
CN107102842A CN201610096102.7A CN201610096102A CN107102842A CN 107102842 A CN107102842 A CN 107102842A CN 201610096102 A CN201610096102 A CN 201610096102A CN 107102842 A CN107102842 A CN 107102842A
Authority
CN
China
Prior art keywords
node
signal
stack
count
pointer
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.)
Pending
Application number
CN201610096102.7A
Other languages
English (en)
Inventor
龙恢
管志坚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Changsha Xin Hong Softcom Ltd
Original Assignee
Changsha Xin Hong Softcom Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Changsha Xin Hong Softcom Ltd filed Critical Changsha Xin Hong Softcom Ltd
Priority to CN201610096102.7A priority Critical patent/CN107102842A/zh
Publication of CN107102842A publication Critical patent/CN107102842A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/76Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data
    • G06F7/78Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor
    • G06F7/785Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor having a sequence of storage locations each being individually accessible for both enqueue and dequeue operations, e.g. using a RAM

Landscapes

  • Physics & Mathematics (AREA)
  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Mathematical Physics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multi Processors (AREA)

Abstract

本发明提出一种基于原子比较并交换操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。所不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该链表中,若减1后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成放入新结点的操作。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。

Description

一种基于原子操作的信号量链表式堆栈方法
技术领域
本发明涉及计算机系统软件编程领域,特别是一种基于原子操作的信号量链表式堆栈方法。
背景技术
在计算机领域里信号量是用来实现进程间同步的机制。信号量本身是一个整数,信号量大于等于零表示可供并发进程使用的资源实体数,信号量小于零则表示正在等待使用临界区的进程数。例如在PV原语中,P原语信号量的操作是:若信号量减1后仍大于或等于零,则进程继续执行,若信号量减1后小于零,则该进程被阻塞;V原语信号量的操作是:若信号量加1后大于零,则进程继续执行,若信号量加1后仍小于或等于零,则唤醒一个在该信号量上阻塞的进程。
发明内容
本发明提出一种基于原子比较并交换(CAS)操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。信号计数和出栈计数都是整型值,这里的结点指的是计算机内存中的一块数据,指针是指向这块数据的地址,指针本身也是存放在内存空间里的数据。每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空。和常规的链表式堆栈一样具有入栈(Push)和出栈(Pop)的操作,不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减1后该信号计数小于零,则能将新结点放入该堆栈,使用(CAS)原子操作更新栈顶指针和相关计数值。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用(CAS)原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点,更新过程中同时将出栈计数加1以防止(CAS)操作过程中和原值比较时出现的ABA问题。
一种基于原子操作的信号量链表式堆栈方法,包括入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:临时信号计数值减1并进行判断,若减1后小于零,则进入第四步,若减1后大于或等于零,则直接进入第五步;第四步:将入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点指针指向新结点;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
本发明进一步的技术方案是:一种基于原子操作的信号量链表式堆栈方法,出栈操作时包括以下步骤:第一步:对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值加1,使临时栈顶结点指针的值等于原栈顶结点的链接指针的值;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶结点指针返回,出栈操作结束。
本发明与现有的链表式堆栈相比具有如下特点:进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减1后该信号计数小于零,则能将新结点放入该堆栈,使用(CAS)原子操作更新栈顶指针和相关计数值。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用(CAS)原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点,更新过程中同时将出栈计数加1以防止(CAS)操作过程中和原值比较时出现的ABA问题。
该方法完全使用(CAS)原子操作实现,允许在多处理器环境下对其进行多线程安全的共享访问,由于规避了传统的锁机制来维护多线程安全的方式,因此在处理器较多的平台上具有性能上的优势,该方法易于扩展,很容易实现类似信号量机制的功能,也可用于管理空闲的计算资源,例如:当空闲计算资源结点不能入栈时,表示之前有任务或请求在申请计算资源时进行过出栈操作但未能获得空闲的计算资源结点,此时可从任务队列中将等待处理的任务分配给该计算资源结点。如果计算资源结点可以入栈,则说明当前任务队列中没有等待处理的任务,直到有新任务提交过来申请计算资源结点时进行出栈操作将该结点弹出,并将任务送达该计算资源结点进行处理,从而实现计算资源的调度,这是常规的链表式堆栈无法实现的。
以下结合附图和具体实施方式对本发明的详细结构作进一步描述。
附图说明
附图1:为本发明的入栈操作流程示意图;
附图2:为本发明的出栈操作流程示意图。
具体实施方式
如附图1所示:一种基于原子操作的信号量链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:临时信号计数值减1并进行判断,若减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)的ABA问题:在CAS的操作过程中当旧的预期值A与要修改的新值B存在某种关联,且这种关联的有效性直接影响CAS操作结果的正确性。而当预期值A和内存值V相同时,却无法判断和预期值A相同的内存值V是否被改动过,从而导致预期值A和新值B的关联失效的问题。
本发明涉及到计算机专业领域里原子操作的概念,对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现这些原子操作。例如本发明中使用的原子比较并交换(CAS)操作在Intel x86处理器平台上可以用LOCK CMPXCHG指令实现,也可以使用LOCK CMPXCHG8B指令实现,在64位模式下也可以使用LOCK CMPXCHG16B指令实现,且不同的处理器硬件平台实现这些原子操作的机器指令是不同的,不能将这种差异解释为超出本发明的范畴。

Claims (3)

1.一种基于原子操作的信号量链表式堆栈方法,该方法包含入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空。
2.根据权利要求1所述的一种基于原子操作的信号量链表式堆栈方法,其特征在于入栈操作包括以下步骤:第一步:取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:临时信号计数值减1并进行判断,若减1后小于零,则进入第四步,若减1后大于或等于零,则直接进入第五步;第四步:将入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点指针指向新结点;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
3.根据权利要求2所述的一种基于原子操作的信号量链表式堆栈方法实施步骤,其特征在于出栈操作包括以下步骤:第一步:对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值加1,使临时栈顶结点指针的值等于原栈顶结点的链接指针的值;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶结点指针返回,出栈操作结束。
CN201610096102.7A 2016-02-23 2016-02-23 一种基于原子操作的信号量链表式堆栈方法 Pending CN107102842A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610096102.7A CN107102842A (zh) 2016-02-23 2016-02-23 一种基于原子操作的信号量链表式堆栈方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610096102.7A CN107102842A (zh) 2016-02-23 2016-02-23 一种基于原子操作的信号量链表式堆栈方法

Publications (1)

Publication Number Publication Date
CN107102842A true CN107102842A (zh) 2017-08-29

Family

ID=59658809

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610096102.7A Pending CN107102842A (zh) 2016-02-23 2016-02-23 一种基于原子操作的信号量链表式堆栈方法

Country Status (1)

Country Link
CN (1) CN107102842A (zh)

Similar Documents

Publication Publication Date Title
CN108268386A (zh) 加速硬件中的存储器排序
CN101652761B (zh) 使用缓存写和强制串行化次序的事务存储器
CN104364778B (zh) 在事务处理中保存/恢复选择的寄存器
CN104350468B (zh) 非事务储存指令
CN108463826A (zh) 用于在环转变期间保护栈的处理器扩展
CN109213723A (zh) 用于具有安全、功率降低和性能特征的可配置空间加速器的处理器、方法和系统
US20210357213A1 (en) Hardware apparatuses and methods to switch shadow stack pointers
US9176763B2 (en) Apparatus and method thereof for efficient execution of a guest in a virtualized environment
CN104126170B (zh) 打包数据操作掩码寄存器算术组合处理器、方法、系统及指令
CN105164650A (zh) 用于改善连续的事务性存储器区的吞吐量的系统、方法和装置
CN104049941A (zh) 跟踪指令的控制流程
CN103116529A (zh) 用于实时检测缓冲区溢出致堆内存损坏的方法和设备
CN104603766A (zh) 经加速的通道间的向量归约指令
CN104995599A (zh) 使用硬件与软件组合的路径概况分析
CN108334400A (zh) 为安全飞地管理存储器
CN104050415A (zh) 用于系统调用的稳健且高性能的指令
CN107278295A (zh) 用于存储器损坏检测架构的字节水平粒度的缓冲器上溢检测
US8856759B2 (en) Method and apparatus providing COBOL decimal type arithmetic functions with improved performance
CN104951299B (zh) 一种基于原子操作的信号量链表式堆栈方法
CN107102842A (zh) 一种基于原子操作的信号量链表式堆栈方法
DE112013007703T5 (de) Befehl und Logik zum Kennzeichnen von Befehlen zur Rückordnung in einem mehrsträngigen Out-of-order-Prozessor
US10496555B2 (en) Implementing per-thread memory access permissions
GB2441897A (en) Enabling execution stacks based on active instructions
CN105320494A (zh) 带有一致的和非一致的子系统的存储器排序
US10649788B2 (en) Processor and a method of operating a processor

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
WD01 Invention patent application deemed withdrawn after publication
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20170829