首页 / 专利库 / 钟表 / 指针 / 一种基于原子操作的信号量链表式堆栈方法

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

阅读:200发布:2021-05-17

专利汇可以提供一种基于原子操作的信号量链表式堆栈方法专利检索,专利查询,专利分析的服务。并且本 发明 借助 信号 量这种机制中的一些概念,提出一种基于 原子 操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶 指针 、信号计数、出栈计数和结点构成。所不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该链表中,若减1后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成放入新结点的操作。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。,下面是一种基于原子操作的信号量链表式堆栈方法专利的具体信息内容。

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

说明书全文

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

技术领域

[0001] 本发明涉及计算机系统软件编程领域,特别是一种基于原子操作的信号量链表式堆栈方法。

背景技术

[0002] 在计算机领域里信号量是用来实现进程间同步的机制。信号量本身是一个整数,信号量大于等于零表示可供并发进程使用的资源实体数,信号量小于零则表示正在等待使用临界区的进程数。例如在PV原语中,P原语信号量的操作是:若信号量减1后仍大于或等于零,则进程继续执行,若信号量减1后小于零,则该进程被阻塞;V原语信号量的操作是:若信号量加1后大于零,则进程继续执行,若信号量加1后仍小于或等于零,则唤醒一个在该信号量上阻塞的进程。

发明内容

[0003] 本发明提出一种基于原子比较并交换(CAS)操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。信号计数和出栈计数都是整型值,这里的结点指的是计算机内存中的一数据,指针是指向这块数据的地址,指针本身也是存放在内存空间里的数据。每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空。和常规的链表式堆栈一样具有入栈(Push)和出栈(Pop)的操作,不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减1后该信号计数小于零,则能将新结点放入该堆栈,使用(CAS)原子操作更新栈顶指针和相关计数值。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用(CAS)原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点,更新过程中同时将出栈计数加1以防止(CAS)操作过程中和原值比较时出现的ABA问题。
[0004] 一种基于原子操作的信号量链表式堆栈方法,包括入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:临时信号计数值减1并进行判断,若减1后小于零,则进入第四步,若减1后大于或等于零,则直接进入第五步;第四步:将入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点指针指向新结点;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
[0005] 本发明进一步的技术方案是:一种基于原子操作的信号量链表式堆栈方法,出栈操作时包括以下步骤:第一步:对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值加1,使临时栈顶结点指针的值等于原栈顶结点的链接指针的值;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶结点指针返回,出栈操作结束。
[0006] 本发明与现有的链表式堆栈相比具有如下特点:进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减1后该信号计数小于零,则能将新结点放入该堆栈,使用(CAS)原子操作更新栈顶指针和相关计数值。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用(CAS)原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点,更新过程中同时将出栈计数加1以防止(CAS)操作过程中和原值比较时出现的ABA问题。
[0007] 该方法完全使用(CAS)原子操作实现,允许在多处理器环境下对其进行多线程安全的共享访问,由于规避了传统的机制来维护多线程安全的方式,因此在处理器较多的平台上具有性能上的优势,该方法易于扩展,很容易实现类似信号量机制的功能,也可用于管理空闲的计算资源,例如:当空闲计算资源结点不能入栈时,表示之前有任务或请求申请计算资源时进行过出栈操作但未能获得空闲的计算资源结点,此时可从任务队列中将等待处理的任务分配给该计算资源结点。如果计算资源结点可以入栈,则说明当前任务队列中没有等待处理的任务,直到有新任务提交过来申请计算资源结点时进行出栈操作将该结点弹出,并将任务送达该计算资源结点进行处理,从而实现计算资源的调度,这是常规的链表式堆栈无法实现的。
[0008] 以下结合附图和具体实施方式对本发明的详细结构作进一步描述。

附图说明

[0009] 附图一:为本发明的入栈操作流程示意图;
[0010] 附图二:为本发明的出栈操作流程示意图。

具体实施方式

[0011] 如附图一所示:一种基于原子操作的信号量链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:临时信号计数值减1并进行判断,若减1后小于零,则进入第四步,若减1后大于或等于零,则直接进入第五步;第四步:将入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点指针指向新结点;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
[0012] 如附图二所示:一种基于原子操作的信号量链表式堆栈方法的出栈操作步骤,第一步:对信号计数进行原子加1操作,第二步:进行判断,若加1后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加1后信号计数小于或等于零,则进入下一步;第三步:取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值加1,使临时栈顶结点指针的值等于原栈顶结点的链接指针的值;第五步:使用原子比较并交换操作尝试同时将栈顶指针、信号计数、出栈计数跟原值进行比较并原子化的替换为临时栈顶结点指针、临时信号计数、临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶结点指针返回,出栈操作结束。
[0013] 原子加1操作:在计算机系统中,尤其是对称多处理器系统中,对内存中的数据进行运算修改时包含从内存取数据、运算、将运算结果写回内存这三个步骤。当多个处理器同时对同一个内存中的变量进行运算操作时,如果没有约束条件的话,他们可能取的数据是同一个值,最终运算结果会变成最后一个写回内存的处理器运算的结果,而不是这几个处理器分别对该内存中的变量进行计算后的结果。例如3个处理器同时对一个值为0的内存变量进行加1操作,很可能最终计算后该内存变量的结果为1或者2,而不是3。在X86处理器平台上对目的操作数为内存变量的运算指令前加LOCK前缀,将保证该指令执行期间其他处理器不能访问该内存变量,直到该指令将运算结果写回目的内存后,其他处理器才能对该内存变量进行操作。带LOCK前缀的加1指令就能保证多个处理器同时对同一内存变量进行加1操作的最终结果是这几个处理器分别对该变量进行加1的结果。这就是原子加1操作。
[0014] 原子比较并交换操作(CAS):该操作有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做,并且在此操作期间其他处理器不能对内存值V进行操作。
[0015] 原子比较并交换操作(CAS)的ABA问题:在CAS的操作过程中当旧的预期值A与要修改的新值B存在某种关联,且这种关联的有效性直接影响CAS操作结果的正确性。而当预期值A和内存值V相同时,却无法判断和预期值A相同的内存值V是否被改动过,从而导致预期值A和新值B的关联失效的问题。
[0016] 本发明涉及到计算机专业领域里原子操作的概念,对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现这些原子操作。例如本发明中使用的原子比较并交换(CAS)操作在Intel x86处理器平台上可以用LOCK CMPXCHG指令实现,也可以使用LOCK CMPXCHG8B指令实现,在64位模式下也可以使用LOCK CMPXCHG16B指令实现,且不同的处理器硬件平台实现这些原子操作的机器指令是不同的,不能将这种差异解释为超出本发明的范畴。
相关专利内容
标题 发布/更新时间 阅读量
一种减少漏光的指针 2020-05-11 563
一种指针铆接用模具 2020-05-12 254
一种汽车仪表指针组件 2020-05-11 988
一种仪表指针半自动热铆机 2020-05-12 494
一种盘状指针 2020-05-11 457
新型汽车仪表指针 2020-05-12 204
一种异形指针 2020-05-11 742
一种低功耗指针 2020-05-12 70
一种防漏光指针 2020-05-12 682
一种异形指针 2020-05-12 967
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈