[发明专利]基于反转单链表的锁无关消息队列实现方法有效
申请号: | 201310102077.5 | 申请日: | 2013-03-27 |
公开(公告)号: | CN103176837A | 公开(公告)日: | 2013-06-26 |
发明(设计)人: | 周克利;唐杰;武港山 | 申请(专利权)人: | 南京大学 |
主分类号: | G06F9/46 | 分类号: | G06F9/46 |
代理公司: | 南京天翼专利代理有限责任公司 32112 | 代理人: | 黄明哲 |
地址: | 210093 江*** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 反转 单链表 无关 消息 队列 实现 方法 | ||
技术领域
本发明属于计算机分布式领域,涉及在2线程架构的1个写线程和1个读线程程序中,实现锁无关的消息队列,为一种基于反转单链表的锁无关消息队列实现方法。
背景技术
在当前的服务器架构中,为了充分利用硬件资源,提高程序效率,大多数采取了多线程架构,而最常见的是有一个等待网络、终端等事件的等待线程,一个处理客户端消息、服务器主逻辑的主线程,一个用于2个线程间通讯的消息队列。
传统的消息队列采取了锁机制来保证同步、互斥。但锁机制会导致线程获取锁的时候,会进入等待睡眠状态,从而引发线程间的切换。而线程间的切换又是非常消耗资源的操作。在处理海量请求的服务器中,对消息队列的访问非常频繁,那么产生线程切换的概率也非常高,从而使得服务器处理效率直线下降。
而在锁无关数据结构的探索中,当今最常用的就是基于原子指令CAS(Compare And Swap)来实现锁无关。虽然CAS的效率要比锁机制高很多,但CAS也并不是一个廉价的指令。在海量消息处理的服务器中,CAS带来的效率损失也不能不让使用者谨慎。
发明内容
本发明要解决的技术问题是:如何在抛弃锁机制以及CAS等昂贵的原子指令的前提下,实现2线程架构下的锁无关消息队列。
本发明的技术方案为:基于反转单链表的锁无关消息队列实现方法,用于2线程服务器架构,包括a)基于反转单链表的锁无关消息队列的数据结构,b)基于所述数据结构实现的两个锁无关方法的操作函数:Push函数和Pop函数;2线程间通过所述锁无关消息队列,在所述锁无关方法下进行通讯,其中:
1)、反转单链表的数据结构为:
struct List Element{
struct ListElement*prev;
};
反转单链表中,每个链表元素只有一个指向其前一项链表元素的指针prev;
2)基于所述反转单链表的锁无关消息队列的数据结构为:
2a)设有一个指向反转单链表的链表头的head指针;
2b)设有一个指向反转单链表的链表尾的tail指针;
2c)设有一个指向上次Pop出去元素项的last指针;
3)基于所述锁无关消息队列的Push函数,包括以下几个要素:
3a)head指针只在最开始时为NULL,此时tail指针也为NULL,这种情况下,在Push第一个消息Push结束前,Pop函数总是返回NULL;
3b)在Push第一个消息时,对tail的赋值要在Push函数返回之前最后一个执行,使得Pop函数在Push函数结束前,总是返回NULL;
3c)每个新来的消息,都分配一个struct ListElement数据结构,即反转单链表的数据结构,并将其赋值;
3d)对于每一个消息项,Push函数在将其链入消息队列之前对其执行写操作,当其在消息队列里以后,Push函数不对其进行任何修改;
3e)只有Push函数永远不会被访问的元素项,才能由Pop释放内存;
3f)刚刚Pop出去的元素项不会被立即释放,而是存在last指针里,只有再次Pop出其他元素项时,last指针当前指向的元素项才会被释放;
4)基于所述锁无关消息队列的Pop函数,分为以下情况:
4a)如果tail==NULL&&last==NULL,那么消息队列处于未初始化状态,Pop返回NULL;
4b)如果tail==NULL&&last!=NULL,那么tail=last→prev,如果这时候tail还为NULL,说明消息队列为空,Pop返回NULL;
4c)如果tail!=NULL,那么tail指向的是一个正确的消息项,需要更新last指针,如果last指针之前不为NULL,则将其内存释放,让last指向最新释放的消息项,并将tail值更新为tail=tail→prev;
在2线程的服务器架构下,其中一个线程A为收发网络消息数据包的通讯线程,另一个线程B为处理服务器内部逻辑的主线程,这2个线程间通过所述锁无关消息队列和操作函数进行通讯:
a)定义一个基于反转单链表的锁无关消息队列:MsgQueue;
b)线程A从网络收到消息数据包Packet,执行MsgQueue.Push(Packet),即将收到的消息数据包通过Push函数添加进锁无关消息队列里;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京大学,未经南京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310102077.5/2.html,转载请声明来源钻瓜专利网。
- 上一篇:变电站高压室通风控制装置
- 下一篇:整体式旋片真空泵