CN111858095B - 一种硬件队列多线程共享方法、装置、设备及存储介质 - Google Patents

一种硬件队列多线程共享方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN111858095B
CN111858095B CN202010693183.5A CN202010693183A CN111858095B CN 111858095 B CN111858095 B CN 111858095B CN 202010693183 A CN202010693183 A CN 202010693183A CN 111858095 B CN111858095 B CN 111858095B
Authority
CN
China
Prior art keywords
request
nodes
tail
value
hardware queue
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.)
Active
Application number
CN202010693183.5A
Other languages
English (en)
Other versions
CN111858095A (zh
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.)
Shandong Yunhai Guochuang Cloud Computing Equipment Industry Innovation Center Co Ltd
Original Assignee
Shandong Yunhai Guochuang Cloud Computing Equipment Industry Innovation Center Co 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 Shandong Yunhai Guochuang Cloud Computing Equipment Industry Innovation Center Co Ltd filed Critical Shandong Yunhai Guochuang Cloud Computing Equipment Industry Innovation Center Co Ltd
Priority to CN202010693183.5A priority Critical patent/CN111858095B/zh
Publication of CN111858095A publication Critical patent/CN111858095A/zh
Application granted granted Critical
Publication of CN111858095B publication Critical patent/CN111858095B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

Landscapes

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

Abstract

本申请公开了一种硬件队列多线程共享方法,应用于共享硬件队列的多个线程中的任意一个线程,该方法包括以下步骤:在有N个请求要发送时,申请硬件队列中的N个节点,N≥1;依次向申请到的N个节点的每个节点写入请求内容;写入完成后,如果N个节点为当前第一组待提交节点,则提交N个节点的请求内容;向硬件队列的尾部方向搜索其他线程的待提交节点;提交搜索到的连续的待提交节点的请求内容。应用本申请所提供的技术方案,每个线程均可按照上述步骤进行相应操作,这样可以实现多线程并发进行请求的入队和提交,使得多个线程可以共享硬件队列。本申请还公开了一种硬件队列多线程共享装置、设备及存储介质,具有相应技术效果。

Description

一种硬件队列多线程共享方法、装置、设备及存储介质
技术领域
本申请涉及计算机应用技术领域,特别是涉及一种硬件队列多线程共享方法、装置、设备及存储介质。
背景技术
队列为软件和硬件设备交互请求常用的一种方式。相比于一次只能下发单个请求的方式,队列方式允许软件批量的下发多个请求,而且不用管硬件当前的忙闲状态。硬件空闲时会自动按照顺序依次处理请求队列中的请求,并在完成后把结果填充到响应队列,之后硬件可通过各种方法,如写内存标志位、更新寄存器的值、或者上报中断等通知软件。
一种常见的硬件队列实现过程为:软件在内存中初始化一个请求队列和一个响应队列,并通过写寄存器等方式告知硬件这两个队列在内存的起始地址和大小。这两个队列共享一对头HEAD和尾TAIL寄存器。软件初始化这两个寄存器为队列中首个节点的位置,此时队列为空。当软件需要下发一个请求时,软件在HEAD寄存器指向的请求队列的节点填写请求,并把TAIL寄存器的值向后移动一个节点。硬件收到写TAIL寄存器的信号,就会从请求队列中取出请求并进行处理,处理完成后通知软件。软件收到通知后,从响应队列得知此请求的处理结果,把HEAD寄存器也向后移动一个节点,此时硬件得知软件已经成功完成了这次请求。
这种方式存在的问题是,一对请求、响应队列只能服务一个线程,如果多个线程上的多个业务流需要并行处理,则硬件需拥有同样数量的请求、响应队列,使得线程的扩充受到了硬件的限制。
综上所述,如何使得多线程共享硬件队列,是目前本领域技术人员急需解决的技术问题。
发明内容
本申请的目的是提供一种硬件队列多线程共享方法、装置、设备及存储介质,以使得多线程可并发访问硬件队列,实现硬件资源共享。
为解决上述技术问题,本申请提供如下技术方案:
一种硬件队列多线程共享方法,应用于共享硬件队列的多个线程中的任意一个线程,所述方法包括:
在有N个请求要发送时,申请所述硬件队列中的N个节点,N≥1;
依次向申请到的所述N个节点的每个节点写入请求内容;
写入完成后,如果所述N个节点为当前第一组待提交节点,则提交所述N个节点的请求内容;
向所述硬件队列的尾部方向搜索其他线程的待提交节点;
提交搜索到的连续的待提交节点的请求内容。
在本申请的一种具体实施方式中,所述申请所述硬件队列中的N个节点,包括:
获取内存中所述硬件队列的请求尾部变量的值;
将所述请求尾部变量的值确定为第一请求尾部旧值;
使用比较和交换CAS操作将所述内存中的所述请求尾部变量的值更新为所述第一请求尾部旧值+N;
如果CAS操作成功,则确定申请到所述硬件队列中的N个节点,所述N个节点中的第一个节点为所述第一请求尾部旧值指向的节点。
在本申请的一种具体实施方式中,在所述使用比较和交换CAS操作将所述内存中的所述请求尾部变量的值更新为所述第一请求尾部旧值+N之后,还包括:
如果CAS操作失败,则重复执行所述获取内存中所述硬件队列的请求尾部变量的值的步骤。
在本申请的一种具体实施方式中,通过以下步骤确定所述N个节点是否为当前第一组待提交节点:
以所述第一请求尾部旧值为旧值,所述第一请求尾部旧值+N为新值,使用所述CAS操作更新所述内存中尾部填充变量的值;
如果CAS操作成功,则确定所述N个节点为当前第一组待提交节点。
在本申请的一种具体实施方式中,所述提交搜索到的连续的待提交节点的请求内容,包括:
将更新后的所述请求尾部变量的值确定为第二请求尾部旧值;
以所述第二请求尾部旧值为旧值,所述第二请求尾部旧值+M为新值,使用所述CAS操作更新所述内存中所述尾部填充变量的值,M为搜索到的连续的待提交节点的数量;
如果CAS操作成功,则将所述尾部填充变量的值写入尾部寄存器,触发硬件工作。
在本申请的一种具体实施方式中,所述依次向申请到的所述N个节点的每个节点写入请求内容,包括:
从申请到的所述N个节点的最后一个节点开始,依次向所述N个节点的每个节点写入请求内容;
将所述N个节点的每个节点对应的请求标记为有效请求。
在本申请的一种具体实施方式中,所述向所述硬件队列的尾部方向搜索其他线程的待提交节点,包括:
向所述硬件队列的尾部方向,检查下一个请求是否为有效请求;
如果是,则重复所述检查下一个请求是否为有效请求的步骤,直至检查到无效请求时,将搜索到的连续的有效请求对应的节点确定为其他线程的待提交节点。
一种硬件队列多线程共享装置,应用于共享硬件队列的多个线程中的任意一个线程,所述装置包括:
节点申请模块,用于在有N个请求要发送时,申请所述硬件队列中的N个节点,N≥1;
请求写入模块,用于依次向申请到的所述N个节点的每个节点写入请求内容;
请求提交第一模块,用于写入完成后,如果所述N个节点为当前第一组待提交节点,则提交所述N个节点的请求内容;
节点搜索模块,用于向所述硬件队列的尾部方向搜索其他线程的待提交节点;
请求提交第二模块,用于提交搜索到的连续的待提交节点的请求内容。
一种硬件队列多线程共享设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现上述任一项所述硬件队列多线程共享方法的步骤。
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述硬件队列多线程共享方法的步骤。
应用本申请实施例所提供的技术方案,共享硬件队列的多个线程中的任意一个线程在有N个请求要发送时,先申请硬件队列中的N个节点,依次向申请到的N个节点的每个节点写入请求内容,写入完成后,如果N个节点为当前第一组待提交节点,则可以提交N个节点的请求内容,然后向硬件队列的尾部方向搜索其他线程的待提交节点,并将搜索到的连续的待提交节点的请求内容提交。每个线程均可按照上述步骤进行相应操作,这样可以实现多线程并发进行请求的入队和提交,使得多个线程可以共享硬件队列。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中一种硬件队列多线程共享方法的实施流程图;
图2为本申请实施例中任意一个线程进行请求发送的过程示意图;
图3为本申请实施例中一种硬件队列多线程共享装置的结构示意图;
图4为本申请实施例中一种硬件队列多线程共享设备的结构示意图。
具体实施方式
本申请的核心是提供一种硬件队列多线程共享方法,该方法可以应用于共享硬件队列的多个线程中的任意一个线程,多个线程可并发访问硬件队列。对于共享硬件队列的多个线程中的任意一个线程而言,该线程在有N个请求要发送时,先申请硬件队列中的N个节点,然后依次向申请到的N个节点的每个节点写入请求内容,写入完成后,如果N个节点为当前第一组待提交节点,则提交N个节点的请求内容,并向硬件队列的尾部方向搜索其他线程的待提交节点,将搜索到的连续的待提交节点的请求内容提交,以触发硬件工作,进行相应请求的处理。每个线程均可按照上述步骤进行相应操作,这样可以实现多线程并发访问硬件队列,并发进行请求的入队和提交,使得多个线程可以共享硬件资源。
为了使本技术领域的人员更好地理解本申请方案,下面结合附图和具体实施方式对本申请作进一步的详细说明。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
参见图1所示,为本申请实施例所提供的一种硬件队列多线程共享方法的实施流程图,该方法可以包括以下步骤:
S110:在有N个请求要发送时,申请硬件队列中的N个节点。
其中,N≥1,N为整数。
在计算机系统中,进程是程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程是操作系统能够进行运算调度的最小单位。大部分情况下,线程被包含在进程之中,是进程中的实际运作单位,线程间可共享进程的资源。
硬件队列可为请求队列或响应队列。请求队列用于控制硬件设备进行输入、输出或其他数据处理的单个请求组成的队列,一般由软件发送命令,硬件执行命令。响应队列和请求队列相对应,用于硬件上报请求队列的执行结果的队列,一般由硬件写,软件读。
在本申请实施例中,主要在硬件队列为请求队列,多线程共享请求队列角度进行说明。
对于共享硬件队列的多个线程中的任意一个线程而言,该线程可以根据实际需要下发请求,同时可以下发一个或多个请求。在有N个请求要发送时,可以先申请硬件队列中的N个节点。该N个节点为硬件队列中的连续节点。N可以大于或等于1。
在本申请的一种具体实施方式中,该步骤可以包括以下步骤:
步骤一:获取内存中硬件队列的请求尾部变量的值;
步骤二:将请求尾部变量的值确定为第一请求尾部旧值;
步骤三:使用比较和交换CAS操作将内存中的请求尾部变量的值更新为第一请求尾部旧值+N;
步骤四:如果CAS操作成功,则确定申请到硬件队列中的N个节点,N个节点中的第一个节点为第一请求尾部旧值指向的节点。
为便于描述,将上述四个步骤结合起来进行说明。
在本申请实施例中,可以预先设定两个原子变量:请求尾部变量Tail_requested和尾部填充变量Tail_filled。其中,Tail_requested表示在硬件队列中,已经被若干个线程占用,但是有可能还没有填写完请求内容的尾部节点位置。Tail_filled表示已经连续填写了请求内容的尾部节点位置。
原子变量是用于原子操作的变量,原子操作是指不可被中断的一个或一系列操作,某个CPU(Central Processing Unit,中央处理器)核在执行原子操作时不会被其他事件打断。
HEAD、TAIL、Tail_requested和Tail_filled这四个变量的关系可以是:Tail_requested>=Tail_filled>=TAIL>=HEAD。初始化时这四个变量都指向硬件队列队头的节点。其中,HEAD寄存器为用于存储请求队列的队头位置的寄存器,软件只写,硬件只读,用于告知硬件需要从哪里开始处理请求。TAIL寄存器为用于存储请求队列的队尾位置的寄存器,软件只写,硬件只读,用于告知硬件处理请求的停止位置。
对于任意一个线程而言,该线程在有N个请求要发送时,可以获取内存中硬件队列的请求尾部变量的值,即Tail_requested的值。将该请求尾部变量的值确定为第一请求尾部旧值,可记作Tail_requested_old。
使用比较和交换CAS操作将内存中的请求尾部变量的值更新为第一请求尾部旧值+N,即Tail_requested_old+N。
CAS(Compare and Swap,比较和交换),是主流CPU支持的一种原子操作。CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下旧值有没有发生变化,如果没有发生变化,则写入新值,CAS操作成功。如果已发生了变化则不交换,CAS操作失败。
因为内存中的请求尾部变量的值可能会因为其他线程的操作发生变化,所以在使用CAS操作尝试对其进行更新时,可能会出现CAS操作失败的情况。如果CAS操作失败,则可以认为有其他并发线程抢占到了第一请求尾部旧值指向的节点,请求尾部变量的值已经发生了变化。在这种情况下,可以重复执行获取内存中硬件队列的请求尾部变量的值的步骤,以再次获取内存中硬件队列的请求尾部变量的值,将请求尾部变量的值确定为第一请求尾部旧值,使用比较和交换CAS操作将内存中的请求尾部变量的值更新为第一请求尾部旧值+N。
如果CAS操作成功,则可以确定申请到硬件队列中的N个节点,N个节点中的第一个节点为第一请求尾部旧值指向的节点。第一个节点是指靠近硬件队列头部的节点。
S120:依次向申请到的N个节点的每个节点写入请求内容。
线程在有N个请求要发送时,申请硬件队列中的N个节点。如果未申请成功,则可以在等待一定的时间间隔后,重复执行申请操作。如果申请成功,则可以依次向申请到的N个节点的每个节点写入请求内容。具体的,可以从申请到的N个节点的最后一个节点开始,依次向N个节点的每个节点写入请求内容,并将N个节点的每个节点对应的请求标记为有效请求。
在本申请实施例中,可以预先设定一个空标记,如空幻数MPTY_MAIGC_NUMBER,表示某个请求或响应节点的内容无效。在初始化时,对于请求和响应队列,软件把每个节点的头都置为EMPTY_MAIGC_NUMBER。
从申请到的N个节点的最后一个节点开始,依次向N个节点的每个节点写入请求内容。针对每个节点,在向该节点写入请求内容时,可以先保留该节点的头,待请求内容写入完成后,再将该节点的头的空标记修改为有效值,表征该节点对应的请求为有效请求。N个节点中的第一个节点的头的空标记待N个请求的请求内容均写入后再修改。
N个节点中的第一个节点为靠近硬件队列头部的节点,N个节点中的最后一个节点为靠近硬件队列尾部的节点。
S130:写入完成后,如果N个节点为当前第一组待提交节点,则提交N个节点的请求内容。
在依次向申请到的N个节点的每个节点写入请求内容,写入完成后,可以进一步确定N个节点是否为当前第一组待提交节点,如果是,则可以提交N个节点的请求内容,以触发硬件工作。
在本申请的一种具体实施方式中,可以通过以下步骤确定N个节点是否为当前第一组待提交节点:
第一个步骤:以第一请求尾部旧值为旧值,第一请求尾部旧值+N为新值,使用CAS操作更新内存中尾部填充变量的值;
第二个步骤:如果CAS操作成功,则确定N个节点为当前第一组待提交节点。
为便于描述,将上述两个步骤结合起来进行说明。
对于任意一个线程而言,该线程在有N个请求要发送时,申请硬件队列中的N个节点,依次向申请到的N个节点的每个节点写入请求内容,写入完成后,可以以第一请求尾部旧值为旧值,第一请求尾部旧值+N为新值,使用CAS操作尝试更新内存中的尾部填充变量的值。
如果CAS操作失败,则可以认为TAIL寄存器还没移动到该线程申请到的N个节点紧邻的前序节点,从TAIL寄存器指向的节点到该线程写入完成请求内容的节点之间还有待写入请求内容的空节点。在这种情况下,该线程可以放弃将当前的尾部填充变量的值写入TAIL寄存器的操作,而是交由负责填写空节点的线程代为完成。
如果CAS操作成功,则可以确定N个节点为当前第一组待提交节点。可以将更新后的尾部填充变量的值写入TAIL寄存器,触发硬件工作。
S140:向硬件队列的尾部方向搜索其他线程的待提交节点。
线程提交N个节点的请求内容后,可以继续向硬件队列的尾部方向搜索其他线程的待提交节点。
具体的,可以向硬件队列的尾部方向,检查下一个请求是否为有效请求,如果是,则重复检查下一个请求是否为有效请求的步骤,直至检查到无效请求时,将搜索到的连续的有效请求对应的节点确定为其他线程的待提交节点。
即向硬件队列的尾部方向搜索,搜索到下一个节点时,检查该节点中的请求是否为有效请求。具体的,可以通过请求头部的空标记进行确定,如果该请求的头部为空幻数,则该请求为无效请求,如果该请求的头部为有效值,则该请求为有效请求。如果该请求为有效请求,则可以继续搜索再下一个节点,检查该节点中的请求是否为有效请求,依次进行,直至检查到无效请求时,将搜索到的连续的有效请求对应的节点确定为其他线程的待提交节点。搜索到的连续的待提交节点的数量可记为M。
S150:提交搜索到的连续的待提交节点的请求内容。
向硬件队列的尾部方向搜索其他线程的待提交节点,搜索结束后,可以提交搜索到的连续的待提交节点的请求内容。
在本申请的一种具体实施方式中,该步骤可以包括以下步骤:
步骤一:将更新后的请求尾部变量的值确定为第二请求尾部旧值;
步骤二:以第二请求尾部旧值为旧值,第二请求尾部旧值+M为新值,使用CAS操作更新内存中尾部填充变量的值,M为搜索到的连续的待提交节点的数量;
步骤三:如果CAS操作成功,则将尾部填充变量的值写入尾部寄存器,触发硬件开始工作。
为便于描述,将上述三个步骤结合起来进行说明。
搜索到连续的M个待提交节点后,可以将当前更新后的请求尾部变量的值确定为第二请求尾部旧值,以第二请求尾部旧值为旧值,第二请求尾部旧值+M为新值,使用CAS操作尝试更新内存中的尾部填充变量的值。
如果CAS操作失败,则表明有其他线程抢先进行了相应操作,尾部填充变量的值已经发生改变,在这种情况下,当前线程可以挂起等待完成消息。
如果CAS操作成功,则可以将尾部填充变量的值写入尾部寄存器,触发硬件工作。
在本申请实施例中,使用无锁队列的方式,多个线程可以并发访问硬件队列,通过多个原子变量的使用来进行硬件队列中节点的申请。每个线程申请到自己的请求节点后,可以并行的向请求节点填写请求内容。每个线程在填写完自己的请求后,判断自己申请到的节点是否是当前的第一组待提交的节点,如果是则提交请求内容。并持续向硬件队列尾部方向搜索连续的待提交节点,一旦碰到一个无效节点,则把所有已经搜索到的请求一起提交。最终所有线程并发的完成了请求的填写和请求的提交。
应用本申请实施例所提供的方法,共享硬件队列的多个线程中的任意一个线程在有N个请求要发送时,先申请硬件队列中的N个节点,依次向申请到的N个节点的每个节点写入请求内容,写入完成后,如果N个节点为当前第一组待提交节点,则可以提交N个节点的请求内容,然后向硬件队列的尾部方向搜索其他线程的待提交节点,并将搜索到的连续的待提交节点的请求内容提交。每个线程均可按照上述步骤进行相应操作,这样可以实现多线程并发进行请求的入队和提交,使得多个线程可以共享硬件队列。
另外,在N个节点为当前第一组待提交节点时,先提交N个节点的请求内容,搜索到其他待提交节点时,再提交其他待提交节点的请求内容,兼顾了处理的及时性和吞吐率。
为便于理解,以图2所示共享硬件队列的任意一个线程的请求发送过程示意图为例对本申请进行说明。
在步骤S201,该线程准备发送N个请求;
在步骤S202,该线程尝试抢占硬件队列中的N个节点。这里为无锁原子操作。具体的,可以先复制当前Tail_requested的值到Tail_requested_old作为旧值,尝试使用CAS操作把Tail_requested的值交换为Tail_requested_old+N。如果CAS操作失败,则表示有其他并发线程抢占到了Tail_requested_old指向的节点,Tail_requested的值已经发生了变化,可以把变化后Tail_requested值复制到Tail_requested_old作为旧值,继续使用CAS尝试把Tail_requested的值交换为Tail_requested_old+N,即重复步骤S202。如果CAS操作成功,则表示该线程成功申请到了[Tail_requested_old,Tail_requested_old+N)的N个节点,跳至步骤S203;
在步骤S203,该线程向这N个节点填写请求内容,除了第一个请求的头部标识,即留下位于Tail_requested_old位置的请求的头部的EMPTY_MAIGC_NUMBER标识,跳至S204;
在步骤S204,修改第一个请求的头部标识为有效值,即将在Tail_requested_old位置的请求的头部EMPTY_MAIGC_NUMBER标识修改为有效值,跳至S205;
在步骤S205,该线程尝试以Tail_requested_old为旧值,Tail_requested_old+N为新值,使用CAS操作更新Tail_filled变量的值。如果CAS操作成功,则跳至步骤S206。如果CAS操作失败,则说明TAIL寄存器还没移动到该线程申请到的N个节点紧邻的前序节点,从TAIL寄存器指向的节点到线程填好请求内容的节点中间还有待填写的空节点,此时该线程放弃写入TAIL寄存器,交由负责填写空节点的线程代为完成,跳至步骤S210;
在步骤S206,该线程把当前的Tail_filled的值写入TAIL寄存器,触发硬件工作;
在步骤S207,该线程向硬件队列的尾部方向搜索,以确定是否存在有效请求。可以依次检查下一个请求的头部是否为EMPTY_MAIGC_NUMBER,如果不是则说明请求有效,重复步骤S207,继续向尾部方向搜索。如果碰到一个头部为EMPTY_MAIGC_NUMBER的无效请求,则记录所有搜索到的有效请求数为M,M>=0,跳至步骤S208;
在步骤S208,该线程尝试更新Tail_filled的值。具体的,可以复制当前Tail_requested值到Tail_requested_old作为旧值,Tail_requested_old+M为新值,使用CAS操作更新Tail_filled的值。如果CAS操作成功,则跳至步骤S209。如果CAS操作失败,则跳至步骤S210。
在步骤S209,该线程把当前的Tail_filled的值写入TAIL寄存器,触发硬件工作。
在步骤S210,该线程挂起等待完成消息。
本申请实施例引入了两个原子变量:Tail_requested和Tail_filled,并结合两个原子变量的使用,实现多线程并发的入队和提交请求。另外,本申请通过EMPTY_MAIGC_NUMBER来区分有效和无效的请求和响应,允许请求位于待发送队头的线程进行搜索,使得已被其他线程提前填写,但是无法立即提交的请求也能够得到及时处理。
上述主要在请求队列的角度进行了多线程共享方案的描述。相应的,响应队列的响应接收流程可以为:
硬件接收和处理HEAD和TAIL寄存器指定区间的请求,更新结果到响应队列,之后通过中断、置内存或寄存器等方法上报完成;
专用的接收线程接收响应队列,根据请求的来源,通知各发起请求的线程任务已完成,并置已处理完成的请求和响应队列的节点头为EMPTY_MAIGC_NUMBER;
发起请求的线程收到任务完成消息,一个完整的请求到响应的流程结束。
下面再从与相关技术的对比角度对本申请实施例进行说明。
在相关技术中,多线程共享硬件队列,可以有以下两种方法:
方法一:使用互斥锁来保护硬件队列,一次只允许一个线程来操作硬件队列,每个线程完成一个请求下发流程后,再释放硬件队列给其他线程使用。增加专门的接收线程处理所有的响应并通知所有下发请求的线程。这种方法的主要问题在于,多线程并发时会有大量的互斥和线程切换操作,CPU效率低。
方法二:基于方法一,改为多个线程发送请求时,使用无锁队列来进行入队,然后通知一个专门的线程来记录队列中连续的就绪请求的个数,进而更新TAIL寄存器。这种方法存在的问题在于,写TAIL寄存器的线程不是真正操作硬件队列的线程,即一次请求也需要两个线程协同工作,增加了请求投递的延迟。
而本申请实施例所提供的方法,支持多线程并发申请队列节点资源,支持多线程并发提交请求。从降低延迟角度来看,即使在多线程共享模式下,某时刻只有一个活动线程发送请求时,请求的处理延迟与单线程独占硬件队列的模式接近,不需要CPU进行上下文切换,降低了支持多线程共享而引入的延迟。当多线程并发时,每个线程独立运行,也不需要上下文切换,提高了CPU使用效率,也有利于提高硬件队列吞吐量。降低了由于资源共享而引入的额外延迟,提高了系统的实时性。
在实际应用中,本申请实施例可以使得原有不支持多线程访问的硬件支持多线程访问,实时性较强,可以提升如加速卡类产品的性能,扩展使用场景。
相应于上面的方法实施例,本申请实施例还提供了一种硬件队列多线程共享装置,应用于共享硬件队列的多个线程中的任意一个线程,下文描述的硬件队列多线程共享装置与上文描述的硬件队列多线程共享装置方法可相互对应参照。
参见图3所示,该装置可以包括以下模块:
节点申请模块310,用于在有N个请求要发送时,申请硬件队列中的N个节点,N≥1;
请求写入模块320,用于依次向申请到的N个节点的每个节点写入请求内容;
请求提交第一模块330,用于写入完成后,如果N个节点为当前第一组待提交节点,则提交N个节点的请求内容;
节点搜索模块340,用于向硬件队列的尾部方向搜索其他线程的待提交节点;
请求提交第二模块350,用于提交搜索到的连续的待提交节点的请求内容。
应用本申请实施例所提供的装置,共享硬件队列的多个线程中的任意一个线程在有N个请求要发送时,先申请硬件队列中的N个节点,依次向申请到的N个节点的每个节点写入请求内容,写入完成后,如果N个节点为当前第一组待提交节点,则可以提交N个节点的请求内容,然后向硬件队列的尾部方向搜索其他线程的待提交节点,并将搜索到的连续的待提交节点的请求内容提交。每个线程均可按照上述步骤进行相应操作,这样可以实现多线程并发进行请求的入队和提交,使得多个线程可以共享硬件队列。
在本申请的一种具体实施方式中,节点申请模块310,用于:
获取内存中硬件队列的请求尾部变量的值;
将请求尾部变量的值确定为第一请求尾部旧值;
使用比较和交换CAS操作将内存中的请求尾部变量的值更新为第一请求尾部旧值+N;
如果CAS操作成功,则确定申请到硬件队列中的N个节点,N个节点中的第一个节点为第一请求尾部旧值指向的节点。
在本申请的一种具体实施方式中,节点申请模块310,还用于:
在使用比较和交换CAS操作将内存中的请求尾部变量的值更新为第一请求尾部旧值+N之后,如果CAS操作失败,则重复执行获取内存中硬件队列的请求尾部变量的值的步骤。
在本申请的一种具体实施方式中,请求提交第一模块330,用于通过以下步骤确定N个节点是否为当前第一组待提交节点:
以第一请求尾部旧值为旧值,第一请求尾部旧值+N为新值,使用CAS操作更新内存中尾部填充变量的值;
如果CAS操作成功,则确定N个节点为当前第一组待提交节点。
在本申请的一种具体实施方式中,请求提交第二模块350,用于:
将更新后的请求尾部变量的值确定为第二请求尾部旧值;
以第二请求尾部旧值为旧值,第二请求尾部旧值+M为新值,使用CAS操作更新内存中尾部填充变量的值,M为搜索到的连续的待提交节点的数量;
如果CAS操作成功,则将尾部填充变量的值写入尾部寄存器,触发硬件工作。
在本申请的一种具体实施方式中,请求写入模块320,用于:
从申请到的N个节点的最后一个节点开始,依次向N个节点的每个节点写入请求内容;
将N个节点的每个节点对应的请求标记为有效请求。
在本申请的一种具体实施方式中,节点搜索模块340,用于:
向硬件队列的尾部方向,检查下一个请求是否为有效请求;
如果是,则重复检查下一个请求是否为有效请求的步骤,直至检查到无效请求时,将搜索到的连续的有效请求对应的节点确定为其他线程的待提交节点。
相应于上面的方法实施例,本申请实施例还提供了一种硬件队列多线程共享设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行计算机程序时实现上述硬件队列多线程共享方法的步骤。
如图4所示,为硬件队列多线程共享设备的组成结构示意图,硬件队列多线程共享设备可以包括:处理器10、存储器11、通信接口12和通信总线13。处理器10、存储器11、通信接口12均通过通信总线13完成相互间的通信。
在本申请实施例中,处理器10可以为中央处理器(Central Processing Unit,CPU)、特定应用集成电路、数字信号处理器、现场可编程门阵列或者其他可编程逻辑器件等。
处理器10可以调用存储器11中存储的程序,具体的,处理器10可以执行硬件队列多线程共享方法的实施例中的操作。
存储器11中用于存放一个或者一个以上程序,程序可以包括程序代码,程序代码包括计算机操作指令,在本申请实施例中,存储器11中至少存储有用于实现以下功能的程序:
在有N个请求要发送时,申请硬件队列中的N个节点,N≥1;
依次向申请到的N个节点的每个节点写入请求内容;
写入完成后,如果N个节点为当前第一组待提交节点,则提交N个节点的请求内容;
向硬件队列的尾部方向搜索其他线程的待提交节点;
提交搜索到的连续的待提交节点的请求内容。
在一种可能的实现方式中,存储器11可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统,以及至少一个功能(比如写入功能、搜索功能)所需的应用程序等;存储数据区可存储使用过程中所创建的数据,如请求数据、节点数据等。
此外,存储器11可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件或其他易失性固态存储器件。
通信接口13可以为通信模块的接口,用于与其他设备或者系统连接。
当然,需要说明的是,图4所示的结构并不构成对本申请实施例中硬件队列多线程共享设备的限定,在实际应用中硬件队列多线程共享设备可以包括比图4所示的更多或更少的部件,或者组合某些部件。
相应于上面的方法实施例,本申请实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述硬件队列多线程共享方法的步骤。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的技术方案及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。

Claims (7)

1.一种硬件队列多线程共享方法,其特征在于,应用于共享硬件队列的多个线程中的任意一个线程,所述方法包括:
在有N个请求要发送时,获取内存中硬件队列的请求尾部变量的值;
将所述请求尾部变量的值确定为第一请求尾部旧值;
使用比较和交换CAS操作将所述内存中的所述请求尾部变量的值更新为所述第一请求尾部旧值+N;N≥1;
如果CAS操作成功,则确定申请到所述硬件队列中的N个节点,所述N个节点中的第一个节点为所述第一请求尾部旧值指向的节点;
从申请到的所述N个节点的最后一个节点开始,依次向所述N个节点的每个节点写入请求内容;
将所述N个节点的每个节点对应的请求标记为有效请求;
写入完成后,如果所述N个节点为当前第一组待提交节点,则提交所述N个节点的请求内容;
向所述硬件队列的尾部方向,检查下一个请求是否为有效请求;
如果是,则重复所述检查下一个请求是否为有效请求的步骤,直至检查到无效请求时,将搜索到的连续的有效请求对应的节点确定为其他线程的待提交节点;
提交搜索到的连续的待提交节点的请求内容。
2.根据权利要求1所述的方法,其特征在于,在所述使用比较和交换CAS操作将所述内存中的所述请求尾部变量的值更新为所述第一请求尾部旧值+N之后,还包括:
如果CAS操作失败,重复执行所述获取内存中所述硬件队列的请求尾部变量的值的步骤。
3.根据权利要求1所述的方法,其特征在于,通过以下步骤确定所述N个节点是否为当前第一组待提交节点:
以所述第一请求尾部旧值为旧值,所述第一请求尾部旧值+N为新值,使用所述CAS操作更新所述内存中尾部填充变量的值;
如果CAS操作成功,则确定所述N个节点为当前第一组待提交节点。
4.根据权利要求3所述的方法,其特征在于,所述提交搜索到的连续的待提交节点的请求内容,包括:
将更新后的所述请求尾部变量的值确定为第二请求尾部旧值;
以所述第二请求尾部旧值为旧值,所述第二请求尾部旧值+M为新值,使用所述CAS操作更新所述内存中所述尾部填充变量的值,M为搜索到的连续的待提交节点的数量;
如果CAS操作成功,则将所述尾部填充变量的值写入尾部寄存器,触发硬件工作。
5.一种硬件队列多线程共享装置,其特征在于,应用于共享硬件队列的多个线程中的任意一个线程,所述装置包括:
节点申请模块,用于在有N个请求要发送时,获取内存中硬件队列的请求尾部变量的值;将所述请求尾部变量的值确定为第一请求尾部旧值;使用比较和交换CAS操作将所述内存中的所述请求尾部变量的值更新为所述第一请求尾部旧值+N;N≥1;
请求写入模块,用于如果CAS操作成功,则确定申请到所述硬件队列中的N个节点,所述N个节点中的第一个节点为所述第一请求尾部旧值指向的节点;从申请到的所述N个节点的最后一个节点开始,依次向所述N个节点的每个节点写入请求内容;将所述N个节点的每个节点对应的请求标记为有效请求;
请求提交第一模块,用于写入完成后,如果所述N个节点为当前第一组待提交节点,则提交所述N个节点的请求内容;
节点搜索模块,用于向所述硬件队列的尾部方向,检查下一个请求是否为有效请求;如果是,则重复所述检查下一个请求是否为有效请求的步骤,直至检查到无效请求时,将搜索到的连续的有效请求对应的节点确定为其他线程的待提交节点;
请求提交第二模块,用于提交搜索到的连续的待提交节点的请求内容。
6.一种硬件队列多线程共享设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如权利要求1至4任一项所述硬件队列多线程共享方法的步骤。
7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至4任一项所述硬件队列多线程共享方法的步骤。
CN202010693183.5A 2020-07-17 2020-07-17 一种硬件队列多线程共享方法、装置、设备及存储介质 Active CN111858095B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010693183.5A CN111858095B (zh) 2020-07-17 2020-07-17 一种硬件队列多线程共享方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010693183.5A CN111858095B (zh) 2020-07-17 2020-07-17 一种硬件队列多线程共享方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN111858095A CN111858095A (zh) 2020-10-30
CN111858095B true CN111858095B (zh) 2022-06-10

Family

ID=73002001

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010693183.5A Active CN111858095B (zh) 2020-07-17 2020-07-17 一种硬件队列多线程共享方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN111858095B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112965839B (zh) * 2021-03-29 2024-01-05 远景智能国际私人投资有限公司 消息传输方法、装置、设备及存储介质

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101114235A (zh) * 2006-05-25 2008-01-30 辉达公司 具有硬件辅助的多处理器和多线程安全消息队列
CN103150206A (zh) * 2006-12-28 2013-06-12 英特尔公司 高效且一致的软件事务存储器
CN105264499A (zh) * 2013-12-20 2016-01-20 华为技术有限公司 一种共享队列中的消息处理方法、装置及接收核
CN106897161A (zh) * 2017-02-23 2017-06-27 郑州云海信息技术有限公司 一种数据保护方法及装置
CN107515795A (zh) * 2017-09-08 2017-12-26 北京京东尚科信息技术有限公司 基于队列的多任务并行数据处理方法、装置、介质和设备
CN108710531A (zh) * 2018-04-20 2018-10-26 深圳市文鼎创数据科技有限公司 循环队列的数据写入方法、装置、终端设备和存储介质
US10146833B1 (en) * 2016-03-30 2018-12-04 Amazon Technologies, Inc. Write-back techniques at datastore accelerators
CN109388346A (zh) * 2018-10-15 2019-02-26 郑州云海信息技术有限公司 一种数据落盘方法和相关装置
CN110362348A (zh) * 2018-04-09 2019-10-22 武汉斗鱼网络科技有限公司 一种队列存取数据的方法、装置及电子设备
CN110837422A (zh) * 2019-10-12 2020-02-25 上海眼控科技股份有限公司 多线程访问方法、系统、电子终端以及储存介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7505410B2 (en) * 2005-06-30 2009-03-17 Intel Corporation Method and apparatus to support efficient check-point and role-back operations for flow-controlled queues in network devices
US8949566B2 (en) * 2010-12-02 2015-02-03 International Business Machines Corporation Locking access to data storage shared by a plurality of compute nodes
US9634962B2 (en) * 2015-04-14 2017-04-25 International Business Machines Corporation Pre-staging messages at a remote location

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101114235A (zh) * 2006-05-25 2008-01-30 辉达公司 具有硬件辅助的多处理器和多线程安全消息队列
CN103150206A (zh) * 2006-12-28 2013-06-12 英特尔公司 高效且一致的软件事务存储器
CN105264499A (zh) * 2013-12-20 2016-01-20 华为技术有限公司 一种共享队列中的消息处理方法、装置及接收核
US10146833B1 (en) * 2016-03-30 2018-12-04 Amazon Technologies, Inc. Write-back techniques at datastore accelerators
CN106897161A (zh) * 2017-02-23 2017-06-27 郑州云海信息技术有限公司 一种数据保护方法及装置
CN107515795A (zh) * 2017-09-08 2017-12-26 北京京东尚科信息技术有限公司 基于队列的多任务并行数据处理方法、装置、介质和设备
CN110362348A (zh) * 2018-04-09 2019-10-22 武汉斗鱼网络科技有限公司 一种队列存取数据的方法、装置及电子设备
CN108710531A (zh) * 2018-04-20 2018-10-26 深圳市文鼎创数据科技有限公司 循环队列的数据写入方法、装置、终端设备和存储介质
CN109388346A (zh) * 2018-10-15 2019-02-26 郑州云海信息技术有限公司 一种数据落盘方法和相关装置
CN110837422A (zh) * 2019-10-12 2020-02-25 上海眼控科技股份有限公司 多线程访问方法、系统、电子终端以及储存介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Formal verification of an array-based nonblocking queue;R. Colvin ET AL;《10th IEEE International Conference on Engineering of Complex Computer Systems (ICECCS"05)》;20050725;全文 *
基于多队列和多线程的短信实时并发控制算法;沈斌等;《计算机工程》;20080831;第2008年卷(第8期);全文 *
基于闪存固态硬盘内部并行机制的R-树优化方法;陈玉标等;《计算机研究与发展》;20180915(第09期);全文 *

Also Published As

Publication number Publication date
CN111858095A (zh) 2020-10-30

Similar Documents

Publication Publication Date Title
WO2020211579A1 (zh) 一种基于分布式批量处理系统的处理方法、装置及系统
CN108647104B (zh) 请求处理方法、服务器及计算机可读存储介质
KR101721892B1 (ko) 쿼리 관리
EP0145889B1 (en) Non-spinning task locking using compare and swap
JP4042945B2 (ja) 共用資源を非同期的に更新するためのインターフェース・システムおよび方法
US20130160028A1 (en) Method and apparatus for low latency communication and synchronization for multi-thread applications
CN110188110B (zh) 一种构建分布式锁的方法及装置
CN107797848B (zh) 进程调度方法、装置和主机设备
US10108456B2 (en) Accelerated atomic resource allocation on a multiprocessor platform
EP3514690A1 (en) Non-volatile memory persistence method and computing device
JP6432805B2 (ja) 区分化インメモリデータセットのためのredoロギング
CN113885945B (zh) 一种计算加速方法、设备以及介质
CN108572876A (zh) 一种读写锁的实现方法及装置
CN103150149A (zh) 处理数据库重做数据的方法和装置
US20210397571A9 (en) Novel RTOS/OS Architecture for Context Switching Without Disabling Interrupts
US20070260777A1 (en) Queues for information processing and methods thereof
CN111858095B (zh) 一种硬件队列多线程共享方法、装置、设备及存储介质
CN113360577A (zh) 一种mpp数据库数据处理方法、装置、设备及存储介质
CN111831408A (zh) 异步任务处理方法、装置、电子设备及介质
CN113254223B (zh) 一种系统重启后的资源分配方法、系统及相关组件
WO2024156239A1 (zh) 视频流传输方法、装置、电子设备及存储介质
JP7122299B2 (ja) 処理タスクを実行するための方法、装置、デバイス、および記憶媒体
EP3389222B1 (en) A method and a host for managing events in a network that adapts event-driven programming framework
CN110537174B (zh) 一种基于交替行锁和列锁的数据锁定方法
CN115757039A (zh) 一种程序监控方法、装置、电子设备和存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant