本发明专利技术借助信号量这种机制中的一些概念,提出一种基于原子操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。所不同的是进行入栈操作时对信号计数值减1,若减1后该信号计数大于或等于零,则不能将新结点放入该链表中,若减1后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成放入新结点的操作。进行出栈操作时对信号计数值加1,若加1后该信号计数大于零,则出栈操作失败返回空指针,若加1后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。
【技术实现步骤摘要】
本专利技术涉及计算机系统软件编程领域,特别是。
技术介绍
在计算机领域里信号量是用来实现进程间同步的机制。信号量本身是一个整数,信号量大于等于零表示可供并发进程使用的资源实体数,信号量小于零则表示正在等待使用临界区的进程数。例如在PV原语中,P原语信号量的操作是:若信号量减I后仍大于或等于零,则进程继续执行,若信号量减I后小于零,则该进程被阻塞;v原语信号量的操作是:若信号量加I后大于零,则进程继续执行,若信号量加I后仍小于或等于零,则唤醒一个在该信号量上阻塞的进程。
技术实现思路
本专利技术借助信号量这种机制中的一些概念,提出一种基于原子操作的带信号计数的链表式堆栈方法,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成。信号计数和出栈计数都是整型值,这里的结点指的是计算机内存中的一块数据,指针是指向这块数据的地址,指针本身也是存放在内存空间里的数据。每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空。与常规的链表式堆栈相比,其同样具有入栈(Push)和出栈(Pop)的操作。所不同的是进行入栈操作时对信号计数值减1,若减I后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减I后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成放入新结点的操作。进行出栈操作时对信号计数值加1,若加I后该信号计数大于零,则出栈操作失败返回空指针,若加I后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。,包括入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;初始状态栈顶指针为空指针,信号计数值为0,出栈计数值为O ;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:先读取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:进行判断,若临时信号计数值减I后小于零,则执行第四步:将要入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点的指针指向新结点,若临时信号计数值减I后大于或等于零,则直接进入下一步;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。本专利技术进一步的技术方案是:,出栈操作时包括以下步骤:第一步:进行出栈操作时先对信号计数进行原子加I操作,第二步:进行判断,若加I后信号计数大于零,则表示出栈失败返回空指针,出栈操作结束,若加I后信号计数小于或等于零,则进入下一步;第三步:读取原栈顶结点指针、原信号计数值、原出栈计数值;第四步:使得临时信号计数值等于原信号计数值,使得临时出栈计数值等于原出栈计数值加1,使得临时栈顶结点指针等于原栈顶结点的链接指针;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:进行判断,如果替换操作失败则返回第三步,并重复第三步、第四步、第五步和第六步,如果替换操作成功,将原栈顶指针返回,出栈操作结束。本专利技术与现有的链表式堆栈相比具有如下特点:进行入栈操作时对信号计数值减1,若减I后该信号计数大于或等于零,则不能将新结点放入该堆栈中,若减I后该信号计数小于零,则将新结点链接指针指向栈顶结点,并使用原子操作更新栈顶指针指向新结点,完成新结点的入栈操作。进行出栈操作时对信号计数值加1,若加I后该信号计数大于零,则出栈操作失败返回空指针,若加I后该信号计数小于或等于零,则取出当前栈顶结点,并使用原子操作更新栈顶指针指向当前栈顶结点链接的下一个结点。该方法完全使用原子操作实现,允许在多处理器环境下对其进行并发访问,由于规避了传统的自旋锁的使用,因此在处理器较多的平台上具有性能上的优势,该方法易于扩展,很容易实现类似信号量机制的功能,也可用于管理空闲的计算资源,例如:当空闲计算资源结点不能入栈时,表示之前有任务或请求在申请计算资源时进行过出栈操作但未能获得空闲的计算资源结点,此时可从任务队列中将等待处理的任务分配给该计算资源结点。如果计算资源结点可以入栈,则说明当前任务队列中没有等待处理的任务,直到有新任务提交过来申请计算资源结点时进行出栈操作将该结点弹出,并将任务送达该计算资源结点进行处理,从而实现计算资源的调度,这是常规的链表式堆栈无法实现的。以下结合附图和【具体实施方式】对本专利技术的详细结构作进一步描述。【附图说明】附图1:为本专利技术的入栈操作流程示意图; 附图2:为本专利技术的出栈操作流程示意图。【具体实施方式】如附图1所示:,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;初始状态栈顶指针为空指针,信号计数值为0,出栈计数值为O ;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;进行入栈操作时包括以下步骤:第一步:先读取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:取临时信号计数值等于原信号计数值,取临时出栈计数值等于原出栈计数值,取临时栈顶结点指针等于原栈顶结点指针;第三步:进行判断,若临时信号计数值减I后小于零,则执行第四步:将要入栈的当前第1页1 2 本文档来自技高网...
【技术保护点】
一种基于原子操作的信号量链表式堆栈方法,包括入栈操作和出栈操作,该方法的堆栈由栈顶指针、信号计数、出栈计数和结点构成;初始状态栈顶指针为空指针,信号计数值为0,出栈计数值为0;每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,栈顶指针指向第一个结点即为栈顶结点,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空;其特征在于进行入栈操作时包括以下步骤:第一步:先读取原栈顶结点指针、原信号计数值、原出栈计数值,第二步:使临时信号计数值等于原信号计数值,使临时出栈计数值等于原出栈计数值,使临时栈顶结点指针等于原栈顶结点指针;第三步:进行判断,若临时信号计数值减1后小于零,则执行第四步:将要入栈的新结点的链接指针指向原栈顶结点,并将临时栈顶结点的指针指向新结点,若临时信号计数值减1后大于或等于零,则直接进入下一步;第五步:使用原子比较并交换操作同时将栈顶指针、信号计数、出栈计数的值和取出的原值进行比较并尝试原子化的替换为临时栈顶结点指针、临时信号计数和临时出栈计数的值,第六步:如果替换操作成功,则入栈操作结束,如果替换操作失败则返回第一步,重复上述步骤直至成功。
【技术特征摘要】
【专利技术属性】
技术研发人员:龙恢,管志坚,
申请(专利权)人:长沙新弘软件有限公司,
类型:发明
国别省市:湖南;43
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。