一种基于原子操作的设备io队列方法

文档序号:8298873阅读:231来源:国知局
一种基于原子操作的设备io队列方法
【技术领域】
[0001]本发明涉及计算机系统软件编程领域,特别是一种基于原子操作的设备1队列方法。
【背景技术】
[0002]在计算机系统里对设备1的访问都是独占的,即便是对称多处理器的系统,即便是在用户角度看上去多个任务在同时访问某一硬件设备,在底层实际的运作过程中都是通过将队列中的请求一个个提交给硬件设备去串行化的完成。虽然部分硬件支持硬件内部的命令队列,但依然需要软件队列去管理其他的请求。这里就涉及到多个任务同时访问1队列的互斥问题,一般设计中都使用锁去控制多个任务同时访问队列的问题,即只有一个任务可以成功的获得锁,当这个任务访问完队列后再将锁释放,其他任务才能获得锁去操作队列。在处理器较少的情况下这种对共享资源加锁的访问方式是合适的,但当系统内的处理器足够多时这种设计将成为发挥多处理器效能的瓶颈,因此通过原子操作实现的1队列将能有效解决这一问题。
[0003]我们通常讲的原子队列在学术界是指能够进行多进多出的通用原子队列,即任何时刻可以有多个生产者和多个消费者同时进行入队和出队的操作。这种通用的原子队列由于实现上过于复杂,且在实际的具体应用中开销过大并不实用。

【发明内容】

[0004]本发明的目的是克服现有技术的上述不足而提供一种基于原子操作的设备1队列方法,使用原子操作实现的带控制权多进单出队列,即可以同时由多个生产者进行入队列操作但任意时间只能有一个消费者进行出队列操作。
[0005]本发明的技术方案是:一种基于原子操作的设备1队列方法,本发明的队列由首指针、尾指针、数据结点和临时结点构成。这里的结点指的是计算机内存中的一块数据,指针是指向这块数据的地址,指针本身也是存放在内存空间里的数据,数据结点是包含有效业务数据的结点,临时结点是不包含有效业务数据的结点。首指针指向队列的第一个结点,尾指针指向队列的最后一个结点。每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,第一个结点的链接指针指向第二个结点,最后一个结点的链接指针为空。
[0006]该队列入队操作使用原子交换操作完成,因此可以由多个生产者同时进行入队操作。通过对尾指针进行原子交换操作,将原尾结点的指针和新结点的指针进行调换使尾指针指向新结点,并将原尾结点的链接指针指向新结点。如果原尾结点的指针为空就将首指针指向新结点,这时新结点成为了队列中的第一个结点,而提交该结点的生产者就获得了队列的控制权,入队操作完成,获得队列控制权的生产者能转变为消费者进行出队操作,未获得控制权的生产者不能进行这种转变。
[0007]出队列操作需要一个临时结点参与,将队列中的第一个数据结点替换成临时结点,并将第一个数据结点取出。这个过程需要使用原子比较并交换(CAS)操作检查尾指针是否也指向第一个数据结点,如果尾指针指向第一个数据结点则原子化的将其替换为指向临时结点的指针。临时结点在这里的作用是:在取出第一个数据结点并进行相关数据处理期间代替第一个数据结点进行占位,以保证后续入队的结点不会成为队列中的第一个结点,同时也保证了第一个数据结点在业务处理中可能被修改的情况不会影响到队列的完整性。
[0008]释放控制权操作,在获得控制权的生产者转变为消费者并完成出队和相关数据处理后需要移除第一个结点来释放控制权。该过程也需要使用原子比较并交换(CAS)操作检查尾指针是否指向第一个结点,如果尾指针指向第一个结点则原子化的将其替换为空指针。移除第一个结点后如果队列不为空则表示未释放控制权,获得控制权的生产者还能以消费者的身份进行出队操作。如果队列被清空则表示控制权被释放。
[0009]本发明与现有技术相比具有如下特点:发明阐述一种使用原子操作实现的带控制权多进单出队列,即可以同时由多个生产者进行入队列操作但任意时间只能有一个消费者进行出队列操作。这样,既节省了计算的资源,又加快了数据输入输出速度。
[0010]以下结合附图和【具体实施方式】对本发明的详细结构作进一步描述。
【附图说明】
[0011]附图1为本发明的队列结构示意图;
附图2为将指向第4个结点的指针拿出来;
附图3为将第4个结点的链接指针指向第5个结点;
附图4为出队列操作时首先将队列首指针指向的第一个结点取出,并将首指针指向一个临时结点;
附图5为使临时结点与第二个结点连接起来;
附图6为第一个结点的链接指针为空,就使用原子比较并交换操作判断队列尾指针是否也指向第一个结点;
附图7为尾指针指向第一个结点就原子化的将其改为指向临时结点;
附图8为当使用原子比较并交换操作判断到尾指针不指向第一个结点时就不会将尾指针的值改为指向临时结点的值,
附图9为有一个生产者正在入队一个新结点;
附图1 O为将临时结点的链接指针指向第二个结点。
【具体实施方式】
[0012]如附图1所示:进行入队操作时首先使用原子交换将尾指针替换成指向新结点的指针,同时拿出原尾结点的指针。然后将原尾结点的链接指针指向新的尾结点。如果原尾指针为空就直接将首指针指向新结点,表示新结点是队列中第一个结点,同时也意味着提交新结点的生产者获得了队列的控制权,即该生产者可以转变为消费者进行从队列取出结点的操作。因原子操作保证了提交的顺序性,所以当有多个生产者同时进行入队操作时,只可能有一个生产者可以获得控制权。
[0013]如附图2所示:使用原子交换操作将指向第4个结点的尾指针替换为指向第5个结点的指针,同时将指向第4个结点的指针拿出来。
[0014]如附图3所示:将第4个结点的链接指针指向第5个结点。
[0015]如附图4、附图5所示:进行出队列操作时首先将队列首指针指向的第一个结点取出,并将首指针指向一个临时结点。判断第一个结点包含的链接指针是
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1