一种多个虚拟队列的报文保序方法及其装置、存储介质、电子设备转让专利

申请号 : CN202211645183.3

文献号 : CN116155828B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 萧启阳刘珊

申请人 : 北京云豹创芯智能科技有限公司

摘要 :

本发明涉及一种多个虚拟队列的报文保序方法及其装置、存储介质、电子设备,包括:每个虚拟队列接收到请求报文时,会将请求报文发给报文保序装置,报文保序装置接收到每个虚拟队列发送的请求报文时,为请求报文分配一个空闲的请求地址,将请求报文和请求地址一并发送给对端设备,并通过建立请求链表和数据链表的方式来分别独立对每个虚拟队列的所有请求报文及对端设备其对响应返回的响应数据的请求时间/返回时间顺序进行管理,最终根据所述请求时间/返回时间顺序将对端设备返回的响应数据分别按序发送给对应的虚拟队列;从而实现了每个虚拟队列的报文独立保序,能够避免报文保序造成资源浪费,并能实现同时收发请求报文。

权利要求 :

1.一种多个虚拟队列的报文保序方法,其特征在于,所述方法包括:

当接收到任一个虚拟队列发送的任一个待响应的请求报文时,获取与所述虚拟队列对应的一条请求链;为所述请求报文分配一个空闲的请求地址;根据所述请求地址更新所述请求链;以及,将所述请求地址和所述请求报文一并发送至对端设备;其中,所述请求链用于记录所述虚拟队列发送的所有待响应的请求报文的请求时间顺序;

当接收到所述对端设备响应所述请求报文返回的任一个数据报文时,确定所述数据报文携带的地址信息和响应数据;获取与所述地址信息对应的数据链;为所述响应数据分配一个空闲的存储地址;根据所述存储地址更新所述数据链;以及,将所述响应数据存储在与所述存储地址对应的存储单元中;其中,所述数据链用于记录所述对端设备响应所述请求报文返回的一个或多个响应数据的返回时间顺序;所述地址信息与所述请求地址相同;

在完成所述对端设备响应所述请求报文返回的所有响应数据的接收之后,根据所述数据链所记录的返回时间顺序以及所述所有响应数据的存储地址从对应的一个或多个存储单元中读取一个或多个响应数据,根据读取的一个或多个响应数据生成对应的一个响应报文;

根据所述请求链所记录的请求时间顺序,将与所述所有待响应的请求报文对应的响应报文按序发送给对应的虚拟队列。

2.如权利要求1所述的多个虚拟队列的报文保序方法,其特征在于,所述方法还包括:

在将任一个响应报文发送给所述虚拟队列之后,获取所述任一个响应报文所对应的一个请求报文的请求地址、一个或多个存储地址,并对所述一个请求报文的请求地址及其对应的数据链、所述一个或多个存储地址及其对应的一个或多个存储单元进行释放,以用于循环使用。

3.如权利要求1所述的多个虚拟队列的报文保序方法,其特征在于,所述方法还包括:

若所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内未接收到所述虚拟队列发送的新的待响应的请求报文,则对所述虚拟队列所对应的请求链进行释放,以用于循环使用;

若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内接收到所述虚拟队列发送的新的待响应的请求报文,则为所述新的待响应的请求报文分配一个空闲的请求地址;根据分配给所述新的待响应的请求报文的请求地址更新所述请求链;以及,将分配给所述新的待响应的请求报文的请求地址和所述新的待响应的请求报文一并发送至所述对端设备。

4.如权利要求1所述的多个虚拟队列的报文保序方法,其特征在于,所述获取与所述虚拟队列对应的一条请求链,包括:获取所述虚拟队列的队列编号,根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,若存在,则获取对应的请求链;若不存在,则新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系。

5.如权利要求4所述的多个虚拟队列的报文保序方法,其特征在于,所述根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,包括:根据所述队列编号查询虚拟队列寄存器,若所述虚拟队列寄存器中与所述虚拟队列的队列编号对应的一个位的值为1,则表示存在一个与所述虚拟队列对应的请求链;若所述虚拟队列寄存器中与所述队列编号对应的一个位的值为0,则表示不存在一个与所述虚拟队列对应的请求链;

其中,所述虚拟队列寄存器的位宽与虚拟队列的总数相同,所述虚拟队列寄存器的每个位的初始值均为0。

6.如权利要求4所述的多个虚拟队列的报文保序方法,其特征在于,所述新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系,包括:获取一个空闲的请求链地址,建立所述队列编号与所述请求链地址之间的映射关系,并根据所述请求链地址在预设的请求链表中新增一条请求链;

其中,所述请求链包括头指针单元、尾指针单元;所述请求链的头指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;所述请求链的尾指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最晚的一个请求报文的请求地址;

其中,所述请求链表包括第一nxt指针链,所述第一nxt指针链包括多个第一nxt指针单元,每个第一nxt指针单元分别对应一个请求地址,且每个第一nxt指针单元的地址为与其对应的请求地址,每个第一nxt指针单元存储其指向的另一个第一nxt指针单元的地址;所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系表示所述虚拟队列的所有待响应的请求报文的请求时间顺序。

7.如权利要求6所述的多个虚拟队列的报文保序方法,其特征在于,所述方法还包括:

当将响应所述请求报文的响应报文发送给所述虚拟队列之后,完成对所述请求报文的响应,则根据所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系更新所述请求链的头指针单元,使得所述请求链的头指针单元存储剩余所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;并对所述请求报文对应的请求地址和第一nxt指针单元进行释放,以用于循环使用。

8.如权利要求1所述的多个虚拟队列的报文保序方法,其特征在于,所述根据所述请求地址更新所述请求链,包括:根据所述请求地址更新所述请求链的头指针单元、尾指针单元和第一nxt指针链;其中,若所述请求报文是所述请求链接收到的第一个请求报文时,则使所述请求链的头指针单元、尾指针单元均存储所述请求地址;若所述请求报文是所述请求链接收到的第i+1个请求报文时,则使所述请求链的头指针单元保持不变,所述请求链的尾指针单元存储所述请求地址,第i个请求报文的请求地址对应的第一nxt指针单元存储第i+1个请求报文的请求地址,i为正整数。

9.如权利要求1所述的多个虚拟队列的报文保序方法,其特征在于,所述获取与所述地址信息对应的数据链,包括:确定是否存在一条与所述地址信息对应的数据链,若存在,则获取对应的数据链;若不存在,则新建一条数据链。

10.如权利要求9所述的多个虚拟队列的报文保序方法,其特征在于,所述新建一条数据链,包括:

在预设的数据链表中新增一条数据链;其中,所述数据链包括头指针单元、尾指针单元;所述数据链的头指针单元的地址为所述地址信息,其存储所述对端设备最早响应所述请求报文返回一个响应数据的存储地址;所述数据链的尾指针单元的地址为所述地址信息,其存储所述对端设备最晚响应所述请求报文返回一个响应数据的存储地址;

其中,所述数据链表包括第二nxt指针链,所述第二nxt指针链包括多个第二nxt指针单元,每个第二nxt指针单元分别对应一个存储地址,且每个第二nxt指针单元的地址为与其对应的存储地址,每个第二nxt指针单元存储其指向的另一个第二nxt指针单元的地址;所述数据链的头指针和尾指针的存储地址所对应的第二nxt指针单元之间的指向关系表示所述对端设备响应所述请求报文返回的所有响应数据的返回时间顺序。

11.如权利要求10所述的多个虚拟队列的报文保序方法,其特征在于,所述根据所述存储地址更新所述数据链,包括:根据所述存储地址更新所述数据链的头指针单元、尾指针单元和第二nxt指针链;其中,若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第一个响应数据,则使所述数据链的头指针单元、尾指针单元均存储所述存储地址;若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第j+1响应数据,则使所述数据链的头指针单元保持不变,所述数据链的尾指针单元存储所述存储地址,第j个响应数据的存储地址对应的第二nxt指针单元存储第j+1个响应数据的存储地址,j为正整数。

12.一种多个虚拟队列的报文保序装置,其特征在于,所述装置包括:

请求链表单元,用于当接收到任一个虚拟队列发送的任一个待响应的请求报文时,获取与所述虚拟队列对应的一条请求链;为所述请求报文分配一个空闲的请求地址;根据所述请求地址更新所述请求链;以及,将所述请求地址和所述请求报文一并发送至对端设备;

其中,所述请求链用于记录所述虚拟队列发送的所有待响应的请求报文的请求时间顺序;

数据链表单元,用于当接收到所述对端设备响应所述请求报文返回的任一个数据报文时,确定所述数据报文携带的地址信息和响应数据;获取与所述地址信息对应的数据链;为所述响应数据分配一个空闲的存储地址;根据所述存储地址更新所述数据链;以及,将所述响应数据存储在与所述存储地址对应的存储单元中;其中,所述数据链用于记录所述对端设备响应所述请求报文返回的一个或多个响应数据的返回时间顺序;所述地址信息与所述请求地址相同;

报文生成单元,用于在完成所述对端设备响应所述请求报文返回的所有响应数据的接收之后,根据所述数据链所记录的返回时间顺序以及所述所有响应数据的存储地址从对应的一个或多个存储单元中读取一个或多个响应数据,根据读取的一个或多个响应数据生成对应的一个响应报文;

报文发送单元,用于根据所述请求链所记录的请求时间顺序,将与所述所有待响应的请求报文对应的响应报文按序发送给对应的虚拟队列。

13.如权利要求12所述的多个虚拟队列的报文保序装置,其特征在于,所述数据链表单元,具体用于:

在将任一个响应报文发送给所述虚拟队列之后,获取所述任一个响应报文所对应的一个请求报文的请求地址、一个或多个存储地址,并对所述一个请求报文的请求地址及其对应的数据链、所述一个或多个存储地址及其对应的一个或多个存储单元进行释放,以用于循环使用。

14.如权利要求12所述的多个虚拟队列的报文保序装置,其特征在于,所述请求链表单元,还用于:

若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内未接收到所述虚拟队列发送的新的待响应的请求报文,则对所述虚拟队列所对应的请求链进行释放,以用于循环使用;

若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内接收到所述虚拟队列发送的新的待响应的请求报文,则为所述新的待响应的请求报文分配一个空闲的请求地址;根据分配给所述新的待响应的请求报文的请求地址更新所述请求链;以及,将分配给所述新的待响应的请求报文的请求地址和所述新的待响应的请求报文一并发送至对端设备。

15.如权利要求12所述的多个虚拟队列的报文保序装置,其特征在于,所述请求链表单元,具体用于:

获取所述虚拟队列的队列编号,根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,若存在,则获取对应的请求链;若不存在,则新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系。

16.如权利要求15所述的多个虚拟队列的报文保序装置,其特征在于,所述请求链表单元,具体用于:

根据所述队列编号查询虚拟队列寄存器,若所述虚拟队列寄存器中与所述虚拟队列的队列编号对应的一个位的值为1,则表示存在一个与所述虚拟队列对应的请求链;若所述虚拟队列寄存器中与所述队列编号对应的一个位的值为0,则表示不存在一个与所述虚拟队列对应的请求链;

其中,所述虚拟队列寄存器的位宽与虚拟队列的总数相同,所述虚拟队列寄存器的每个位的初始值均为0。

17.如权利要求15所述的多个虚拟队列的报文保序装置,其特征在于,所述请求链表单元,具体用于:

获取一个空闲的请求链地址,建立所述队列编号与所述请求链地址之间的映射关系,并根据所述请求链地址在预设的请求链表中新增一条请求链;

其中,所述请求链包括头指针单元、尾指针单元;所述请求链的头指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;所述请求链的尾指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最晚的一个请求报文的请求地址;

其中,所述请求链表包括第一nxt指针链,所述第一nxt指针链包括多个第一nxt指针单元,每个第一nxt指针单元分别对应一个请求地址,且每个第一nxt指针单元的地址为与其对应的请求地址,每个第一nxt指针单元存储其指向的另一个第一nxt指针单元的地址;所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系表示所述虚拟队列的所有待响应的请求报文的请求时间顺序。

18.如权利要求17所述的多个虚拟队列的报文保序装置,其特征在于,所述请求链表单元,还用于:

当将响应所述请求报文的响应报文发送给所述虚拟队列之后,完成对所述请求报文的响应,则根据所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系更新所述请求链的头指针单元,使得所述请求链的头指针单元存储剩余所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;并对所述请求报文对应的请求地址和第一nxt指针单元进行释放,以用于循环使用。

19.如权利要求12所述的多个虚拟队列的报文保序装置,其特征在于,所述请求链表单元,具体用于:

根据所述请求地址更新所述请求链的头指针单元、尾指针单元和第一nxt指针链;其中,若所述请求报文是所述请求链接收到的第一个请求报文时,则使所述请求链的头指针单元、尾指针单元均存储所述请求地址;若所述请求报文是所述请求链接收到的第i+1个请求报文时,则使所述请求链的头指针单元保持不变,所述请求链的尾指针单元存储所述请求地址,第i个请求报文的请求地址对应的第一nxt指针单元存储第i+1个请求报文的请求地址,i为正整数。

20.如权利要求12所述的多个虚拟队列的报文保序装置,其特征在于,所述数据链表单元,具体用于:

确定是否存在一条与所述地址信息对应的数据链,若存在,则获取对应的数据链;若不存在,则新建一条数据链。

21.如权利要求20所述的多个虚拟队列的报文保序装置,其特征在于,所述数据链表单元,具体用于:

在预设的数据链表中新增一条数据链;其中,所述数据链包括头指针单元、尾指针单元;所述数据链的头指针单元的地址为所述地址信息,其存储所述对端设备最早响应所述请求报文返回一个响应数据的存储地址;所述数据链的尾指针单元的地址为所述地址信息,其存储所述对端设备最晚响应所述请求报文返回一个响应数据的存储地址;

其中,所述数据链表包括第二nxt指针链,所述第二nxt指针链包括多个第二nxt指针单元,每个第二nxt指针单元分别对应一个存储地址,且每个第二nxt指针单元的地址为与其对应的存储地址,每个第二nxt指针单元存储其指向的另一个第二nxt指针单元的地址;所述数据链的头指针和尾指针的存储地址所对应的第二nxt指针单元之间的指向关系表示所述对端设备响应所述请求报文返回的所有响应数据的返回时间顺序。

22.如权利要求21所述的多个虚拟队列的报文保序装置,其特征在于,所述数据链表单元,具体用于:

根据所述存储地址更新所述数据链的头指针单元、尾指针单元和第二nxt指针链;其中,若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第一个响应数据,则使所述数据链的头指针单元、尾指针单元均存储所述存储地址;若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第j+1响应数据,则使所述数据链的头指针单元保持不变,所述数据链的尾指针单元存储所述存储地址,第j个响应数据的存储地址对应的第二nxt指针单元存储第j+1个响应数据的存储地址,j为正整数。

23.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时,实现如权利要求1~11中任一项所述的多个虚拟队列的报文保序方法。

24.一种电子设备,其特征在于,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述权利要求1~11中任一项所述的多个虚拟队列的报文保序方法。

说明书 :

一种多个虚拟队列的报文保序方法及其装置、存储介质、电子

设备

技术领域

[0001] 本发明涉及报文保序技术领域,具体涉及一种多个虚拟队列的报文保序方法及其装置、计算机可读存储介质、电子设备。

背景技术

[0002] 网卡的报文数据一般是通过队列(虚拟队列)来处理的,在高性能场景下,会出现多个队列共同工作的情况;其中,每条队列处理的报文数据代表不同的业务流,且每条队列相互独立;此外每条队列的一个请求报文是不会断流的,收发同时存在;在应用上,每个队列内部的一个请求报文按序处理,由于通路延时以及访问内存位置不同等原因,先发出的一个请求报文对应的响应报文可能会晚于后发出去的一个请求报文对应的响应报文,例如图1的数据流所示。
[0003] 在实现本发明的过程中,发明人发现现有技术至少存在以下技术问题:
[0004] 针对图1所示的情况,硬件需要增加保序处理逻辑对每条队列分别独立进行保序操作,而目前使用的保序方式有两种:
[0005] 其中,一种是通过FIFO(First In First Out)装置实现的,如果队列的个数少,该种保序方式相对简单便捷,稳定性强;但是,对于高性能场景,队列的个数将会超过2000条,在该场景下,使用256个FIFO装置进行保序处理,使用的存储面积过大;
[0006] 其中,另一种是单独使用链表嵌套保序,每一个队列建一条链,该种保序方式相较于通过FIFO装置实现的保序方式而言,更加节约资源;如果使用单条链进行保序,资源量会略少于通过FIFO装置实现的保序方式,但是,由于总线接收能力限制,同时处理的一个请求报文不会分属于2000个队列,所以在这种场景下,建立2000条链表也会造成资源浪费,且不能实现同时收发请求报文。

发明内容

[0007] 本发明的目的在于提出一种多个虚拟队列的报文保序方法及其装置、计算机可读存储介质、电子设备,以解决目前使用的以上两种保序方式所存在的技术问题。
[0008] 为实现上述目的,本发明的第一方面提出一种多个虚拟队列的报文保序方法,所述方法包括:
[0009] 当接收到任一个虚拟队列发送的任一个待响应的请求报文时,获取与所述虚拟队列对应的一条请求链;为所述请求报文分配一个空闲的请求地址;根据所述请求地址更新所述请求链;以及,将所述请求地址和所述请求报文一并发送至对端设备;其中,所述请求链用于记录所述虚拟队列发送的所有待响应的请求报文的请求时间顺序;
[0010] 当接收到所述对端设备响应所述请求报文返回的任一个数据报文时,确定所述数据报文携带的地址信息和响应数据;获取与所述地址信息对应的数据链;为所述响应数据分配一个空闲的存储地址;根据所述存储地址更新所述数据链;以及,将所述响应数据存储在与所述存储地址对应的存储单元中;其中,所述数据链用于记录所述对端设备响应所述请求报文返回的一个或多个响应数据的返回时间顺序;所述地址信息与所述请求地址相同;
[0011] 在完成所述对端设备响应所述请求报文返回的所有响应数据的接收之后,根据所述数据链所记录的返回时间顺序以及所述所有响应数据的存储地址从对应的一个或多个存储单元中读取一个或多个响应数据,根据读取的一个或多个响应数据生成对应的一个响应报文;
[0012] 根据所述请求链所记录的请求时间顺序,将与所述所有待响应的请求报文对应的响应报文按序发送给对应的虚拟队列。
[0013] 优选地,所述方法还包括:
[0014] 在将任一个响应报文发送给所述虚拟队列之后,获取所述任一个响应报文所对应的一个请求地址、一个或多个存储地址,并对所述一个请求地址及其对应的数据链、所述一个或多个存储地址及其对应的一个或多个存储单元进行释放,以用于循环使用。
[0015] 优选地,所述方法还包括:
[0016] 若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内未接收到所述虚拟队列发送的新的待响应的请求报文,则对所述虚拟队列所对应的请求链进行释放,以用于循环使用;
[0017] 若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内接收到所述虚拟队列发送的新的待响应的请求报文,则为所述新的待响应的请求报文分配一个空闲的请求地址;根据分配给所述新的待响应的请求报文的请求地址更新所述请求链;以及,将分配给所述新的待响应的请求报文的请求地址和所述新的待响应的请求报文一并发送至对端设备。
[0018] 优选地,所述获取与所述虚拟队列对应的一条请求链,包括:
[0019] 获取所述虚拟队列的队列编号,根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,若存在,则获取对应的请求链;若不存在,则新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系。
[0020] 优选地,所述根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,包括:
[0021] 根据所述队列编号查询虚拟队列寄存器,若所述虚拟队列寄存器中与所述虚拟队列的队列编号对应的一个位的值为1,则表示存在一个与所述虚拟队列对应的请求链;若所述虚拟队列寄存器中与所述队列编号对应的一个位的值为0,则表示不存在一个与所述虚拟队列对应的请求链;
[0022] 其中,所述虚拟队列寄存器的位宽与虚拟队列的总数相同,所述虚拟队列寄存器的每个位的初始值均为0。
[0023] 优选地,所述新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系,包括:
[0024] 获取一个空闲的请求链地址,建立所述队列编号与所述请求链地址之间的映射关系,并根据所述请求链地址在预设的请求链表中新增一条请求链;
[0025] 其中,所述请求链包括头指针单元、尾指针单元;所述请求链的头指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;所述请求链的尾指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最晚的一个请求报文的请求地址;
[0026] 其中,所述请求链表包括第一nxt指针链,所述第一nxt指针链包括多个第一nxt指针单元,每个第一nxt指针单元分别对应一个请求地址,且每个第一nxt指针单元的地址为与其对应的请求地址,每个第一nxt指针单元存储其指向的另一个第一nxt指针单元的地址;所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系表示所述虚拟队列的所有待响应的请求报文的请求时间顺序。
[0027] 优选地,所述方法还包括:
[0028] 当将响应所述请求报文的响应报文发送给所述虚拟队列之后,完成对所述请求报文的响应,则根据所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系更新所述请求链的头指针单元,使得所述请求链的头指针单元存储剩余所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;并对所述请求报文对应的请求地址和第一nxt指针单元进行释放,以用于循环使用。
[0029] 优选地,所述根据所述请求地址更新所述请求链,包括:
[0030] 根据所述请求地址更新所述请求链的头指针单元、尾指针单元和第一nxt指针链;其中,若所述请求报文是所述请求链接收到的第一个请求报文时,则使所述请求链的头指针单元、尾指针单元均存储所述请求地址;若所述请求报文是所述请求链接收到的第i+1个请求报文时,则使所述请求链的头指针单元保持不变,所述请求链的尾指针单元存储所述请求地址,第i个请求报文的请求地址对应的第一nxt指针单元存储第i+1个请求报文的请求地址,i为正整数。
[0031] 优选地,所述获取与所述地址信息对应的数据链,包括:
[0032] 确定是否存在一条与所述地址信息对应的数据链,若存在,则获取对应的数据链;若不存在,则新建一条数据链。
[0033] 优选地,所述新建一条数据链,包括:
[0034] 在预设的数据链表中新增一条数据链;其中,所述数据链包括头指针单元、尾指针单元;所述数据链的头指针单元的地址为所述地址信息,其存储所述对端设备最早响应所述请求报文返回一个响应数据的存储地址;所述数据链的尾指针单元的地址为所述地址信息,其存储所述对端设备最晚响应所述请求报文返回一个响应数据的存储地址;
[0035] 其中,所述数据链表包括第二nxt指针链,所述第二nxt指针链包括多个第二nxt指针单元,每个第二nxt指针单元分别对应一个存储地址,且每个第二nxt指针单元的地址为与其对应的存储地址,每个第二nxt指针单元存储其指向的另一个第二nxt指针单元的地址;所述数据链的头指针和尾指针的存储地址所对应的第二nxt指针单元之间的指向关系表示所述对端设备响应所述请求报文返回的所有响应数据的返回时间顺序。
[0036] 优选地,所述根据所述存储地址更新所述数据链,包括:
[0037] 根据所述存储地址更新所述数据链的头指针单元、尾指针单元和第二nxt指针链;其中,若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第一个响应数据,则使所述数据链的头指针单元、尾指针单元均存储所述存储地址;若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第j+1响应数据,则使所述数据链的头指针单元保持不变,所述数据链的尾指针单元存储所述存储地址,第j个响应数据的存储地址对应的第二nxt指针单元存储第j+1个响应数据的存储地址,j为正整数。
[0038] 本发明的第二方面提出一种多个虚拟队列的报文保序装置,所述装置包括:
[0039] 请求链表单元,用于当接收到任一个虚拟队列发送的任一个待响应的请求报文时,获取与所述虚拟队列对应的一条请求链;为所述请求报文分配一个空闲的请求地址;根据所述请求地址更新所述请求链;以及,将所述请求地址和所述请求报文一并发送至对端设备;其中,所述请求链用于记录所述虚拟队列发送的所有待响应的请求报文的请求时间顺序;
[0040] 数据链表单元,用于当接收到所述对端设备响应所述请求报文返回的任一个数据报文时,确定所述数据报文携带的地址信息和响应数据;获取与所述地址信息对应的数据链;为所述响应数据分配一个空闲的存储地址;根据所述存储地址更新所述数据链;以及,将所述响应数据存储在与所述存储地址对应的存储单元中;其中,所述数据链用于记录所述对端设备响应所述请求报文返回的一个或多个响应数据的返回时间顺序;所述地址信息与所述请求地址相同;
[0041] 报文生成单元,用于在完成所述对端设备响应所述请求报文返回的所有响应数据的接收之后,根据所述数据链所记录的返回时间顺序以及所述所有响应数据的存储地址从对应的一个或多个存储单元中读取一个或多个响应数据,根据读取的一个或多个响应数据生成对应的一个响应报文;
[0042] 报文发送单元,用于根据所述请求链所记录的请求时间顺序,将与所述所有待响应的请求报文对应的响应报文按序发送给对应的虚拟队列。
[0043] 优选地,所述数据链表单元,具体用于:
[0044] 在将任一个响应报文发送给所述虚拟队列之后,获取所述任一个响应报文所对应的一个请求地址、一个或多个存储地址,并对所述一个请求地址及其对应的数据链、所述一个或多个存储地址及其对应的一个或多个存储单元进行释放,以用于循环使用。
[0045] 优选地,所述请求链表单元,还用于:
[0046] 若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内未接收到所述虚拟队列发送的新的待响应的请求报文,则对所述虚拟队列所对应的请求链进行释放,以用于循环使用;
[0047] 若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内接收到所述虚拟队列发送的新的待响应的请求报文,则为所述新的待响应的请求报文分配一个空闲的请求地址;根据分配给所述新的待响应的请求报文的请求地址更新所述请求链;以及,将分配给所述新的待响应的请求报文的请求地址和所述新的待响应的请求报文一并发送至对端设备。
[0048] 优选地,所述请求链表单元,具体用于:
[0049] 获取所述虚拟队列的队列编号,根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,若存在,则获取对应的请求链;若不存在,则新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系。
[0050] 优选地,所述请求链表单元,具体用于:
[0051] 根据所述队列编号查询虚拟队列寄存器,若所述虚拟队列寄存器中与所述虚拟队列的队列编号对应的一个位的值为1,则表示存在一个与所述虚拟队列对应的请求链;若所述虚拟队列寄存器中与所述队列编号对应的一个位的值为0,则表示不存在一个与所述虚拟队列对应的请求链;
[0052] 其中,所述虚拟队列寄存器的位宽与虚拟队列的总数相同,所述虚拟队列寄存器的每个位的初始值均为0。
[0053] 优选地,所述请求链表单元,具体用于:
[0054] 获取一个空闲的请求链地址,建立所述队列编号与所述请求链地址之间的映射关系,并根据所述请求链地址在预设的请求链表中新增一条请求链;
[0055] 其中,所述请求链包括头指针单元、尾指针单元;所述请求链的头指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;所述请求链的尾指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最晚的一个请求报文的请求地址;
[0056] 其中,所述请求链表包括第一nxt指针链,所述第一nxt指针链包括多个第一nxt指针单元,每个第一nxt指针单元分别对应一个请求地址,且每个第一nxt指针单元的地址为与其对应的请求地址,每个第一nxt指针单元存储其指向的另一个第一nxt指针单元的地址;所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系表示所述虚拟队列的所有待响应的请求报文的请求时间顺序。
[0057] 优选地,所述请求链表单元,还用于:
[0058] 当将响应所述请求报文的响应报文发送给所述虚拟队列之后,完成对所述请求报文的响应,则根据所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系更新所述请求链的头指针单元,使得所述请求链的头指针单元存储剩余所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;并对所述请求报文对应的请求地址和第一nxt指针单元进行释放,以用于循环使用。
[0059] 优选地,所述请求链表单元,具体用于:
[0060] 根据所述请求地址更新所述请求链的头指针单元、尾指针单元和第一nxt指针链;其中,若所述请求报文是所述请求链接收到的第一个请求报文时,则使所述请求链的头指针单元、尾指针单元均存储所述请求地址;若所述请求报文是所述请求链接收到的第i+1个请求报文时,则使所述请求链的头指针单元保持不变,所述请求链的尾指针单元存储所述请求地址,第i个请求报文的请求地址对应的第一nxt指针单元存储第i+1个请求报文的请求地址,i为正整数。
[0061] 优选地,所述数据链表单元,具体用于:
[0062] 确定是否存在一条与所述地址信息对应的数据链,若存在,则获取对应的数据链;若不存在,则新建一条数据链。
[0063] 优选地,所述数据链表单元,具体用于:
[0064] 在预设的数据链表中新增一条数据链;其中,所述数据链包括头指针单元、尾指针单元;所述数据链的头指针单元的地址为所述地址信息,其存储所述对端设备最早响应所述请求报文返回一个响应数据的存储地址;所述数据链的尾指针单元的地址为所述地址信息,其存储所述对端设备最晚响应所述请求报文返回一个响应数据的存储地址;
[0065] 其中,所述数据链表包括第二nxt指针链,所述第二nxt指针链包括多个第二nxt指针单元,每个第二nxt指针单元分别对应一个存储地址,且每个第二nxt指针单元的地址为与其对应的存储地址,每个第二nxt指针单元存储其指向的另一个第二nxt指针单元的地址;所述数据链的头指针和尾指针的存储地址所对应的第二nxt指针单元之间的指向关系表示所述对端设备响应所述请求报文返回的所有响应数据的返回时间顺序。
[0066] 优选地,所述数据链表单元,具体用于:
[0067] 根据所述存储地址更新所述数据链的头指针单元、尾指针单元和第二nxt指针链;其中,若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第一个响应数据,则使所述数据链的头指针单元、尾指针单元均存储所述存储地址;若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第j+1响应数据,则使所述数据链的头指针单元保持不变,所述数据链的尾指针单元存储所述存储地址,第j个响应数据的存储地址对应的第二nxt指针单元存储第j+1个响应数据的存储地址,j为正整数。
[0068] 本发明的第三方面提出一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时,实现如上述第一方面所述的多个虚拟队列的报文保序方法。
[0069] 本发明的第四方面提出一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述第一方面所述的多个虚拟队列的报文保序方法。
[0070] 本发明的各个方面至少具有以下有益效果:
[0071] 本发明的各个方面可以应用于多个虚拟队列共同工作的高性能场景,可以理解为是在多个虚拟队列和对端设备之间设置一个报文保序装置;具体地,每个虚拟队列接收到请求报文时,会将请求报文发给报文保序装置,报文保序装置接收到每个虚拟队列发送的请求报文时,为请求报文分配一个空闲的请求地址,将请求报文和请求地址一并发送给对端设备,并通过建立请求链表和数据链表的方式来分别独立对每个虚拟队列的所有请求报文及对端设备其对响应返回的响应数据的请求时间/返回时间顺序进行管理,最终根据所述请求时间/返回时间顺序将对端设备返回的响应数据分别按序发送给对应的虚拟队列;从而实现了每个虚拟队列的报文独立保序。以2000个虚拟队列为例,相对于通过FIFO装置实现的报文保序而言,无需使用256个FIFO装置,能够更加节约资源;相对于单独使用链表嵌套保序而言,无须建立2000条链,请求链和数据链的地址与虚拟队列之间的映射关系并不是固定不变的,处于空闲状态的请求链和数据链是可以提供给不同虚拟队列循环使用的,能够避免造成资源浪费,并能实现同时收发请求报文。
[0072] 本发明的其它特征和优点将在随后的说明书中阐述。

附图说明

[0073] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要根据所述预设签名认证算法和的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0074] 图1为目前使用的报文数据流示意图。
[0075] 图2为本发明实施例中一种多个虚拟队列的报文保序方法的流程图。
[0076] 图3为本发明实施例中一种多个虚拟队列的报文保序方法的报文数据流示意图。
[0077] 图4为本发明实施例中一种多个虚拟队列的报文保序方法的请求链表示意图。
[0078] 图5为本发明实施例中一种多个虚拟队列的报文保序方法的数据链表和存储单元示意图。
[0079] 图6为本发明实施例中一种多个虚拟队列的报文保序方法的请求链上链流程图。
[0080] 图7为本发明实施例中一种多个虚拟队列的报文保序方法的请求链下链流程图。
[0081] 图8为本发明实施例中一种报文保序装置的框架示意图。

具体实施方式

[0082] 附图的详细说明意在作为本发明的当前优选实施例的说明,而非意在代表本发明能够得以实现的仅有形式。应理解的是,相同或等同的功能可以由意在包含于本发明的精神和范围之内的不同实施例完成。
[0083] 本发明的一个实施例提出一种多个虚拟队列的报文保序方法,应用于多个虚拟队列(virtio queue)共同工作的高性能场景,在多个虚拟队列和对端设备之间设置一个报文保序装置,也即,每个虚拟队列接收到请求报文时,会将请求报文发给报文保序装置,报文保序装置接收到每个虚拟队列发送的请求报文时,为请求报文分配一个空闲的请求地址,将请求报文和请求地址一并发送给对端设备,并通过建立请求链表和数据链表的方式来分别独立对每个虚拟队列的所有请求报文及对端设备其对响应返回的响应数据的请求时间/返回时间顺序进行管理,最终根据所述请求时间/返回时间顺序将对端设备返回的响应数据分别按序发送给对应的虚拟队列;从而实现了每个虚拟队列的报文独立保序。
[0084] 其中,所述对端设备指的是包括有存储器和处理器的设备,存储器存储有虚拟队列请求的数据,处理器能够接收和响应所述请求报文和请求地址,根据所述请求报文和请求地址向所述报文保序装置返回相应的响应数据,具体地,该对端设备可以是Host主机。
[0085] 图2为本实施例方法的流程图,图3为本实施例方法的报文数据流示意图,图3中queue为虚拟列队,req表示请求报文,rdata表示返回给虚拟队列的响应报文,req和rdata的请求顺序和返回顺序是一致的,arid表示请求地址;参阅图2‑3,本实施例的方法包括由所述报文保序装置作为执行主体执行以下步骤:
[0086] 步骤S1、当接收到任一个虚拟队列发送的任一个待响应的请求报文时,获取与所述虚拟队列对应的一条请求链;为所述请求报文分配一个空闲的请求地址;根据所述请求地址更新所述请求链;以及,将所述请求地址和所述请求报文一并发送至对端设备;其中,所述请求链用于记录所述虚拟队列发送的所有待响应的请求报文的请求时间顺序。
[0087] 具体而言,所述报文保序装置将所述请求地址和所述请求报文生成请求,将该请求发送至所述对端设备;所述对端设备对其接收到的每个请求进行响应,把响应的数据报文返回给所述报文保序装置。
[0088] 步骤S2、当接收到所述对端设备响应所述请求报文返回的任一个数据报文时,确定所述数据报文携带的地址信息和响应数据;获取与所述地址信息对应的数据链;为所述响应数据分配一个空闲的存储地址;根据所述存储地址更新所述数据链;以及,将所述响应数据存储在与所述存储地址对应的存储单元中;其中,所述数据链用于记录所述对端设备响应所述请求报文返回的一个或多个响应数据的返回时间顺序;所述地址信息与所述请求地址相同。
[0089] 具体而言,所述数据链是根据所述请求地址建立的,一条数据链对应一个请求地址,也即对应一个请求报文,用于对响应该一个请求报文的所有响应数据进行管理,因此,所述数据链与所述地址信息也是一一对应的;
[0090] 具体而言,一个响应数据的位宽是固定的,例如是64B,假设所述请求报文请求一个512bit的数据A,所述对端设备响应所述请求报文,需要返回一个512bit的数据A给虚拟队列,但受数据传输的位宽限制,每次只能返回一个64B的响应数据,因此需要多次返回数据报文;当为某一个64B的响应数据分配一个存储地址时,则将该一个64B的响应数据存储于该一个存储地址对应的存储单元中;
[0091] 需说明的是,所述对端设备在返回响应数据时是乱序的,例如,所述报文保序装置接收到的上一个响应数据是第一虚拟队列的第一个64B的响应数据,当前接收到的是第二虚拟队列的第三个64B的响应数据;因此,需要记录数据报文,也即响应数据的返回时间顺序,以便于按序从对应的存储单元中提取一个完整的512bit的响应数据A;并且,对端设备数据返回时会携带对应的地址信息,这个地址信息是与请求地址对应的,用于所述报文保序装置通过其找到对应的数据链;如上所述,一个请求地址对应的是虚拟队列的一个请求报文,也可以理解为,一个请求地址也对应的需要返回给虚拟队列的一个响应报文,基于所述对端设备返回的数据报文中的地址信息,所述报文保序装置建立与请求地址对应的数据链,通过数据链来记录数据报文/响应数据的返回时间顺序。
[0092] 步骤S3、在完成所述对端设备响应所述请求报文返回的所有响应数据的接收之后,根据所述数据链所记录的返回时间顺序以及所述所有响应数据的存储地址从对应的一个或多个存储单元中读取一个或多个响应数据,根据读取的一个或多个响应数据生成对应的一个响应报文;
[0093] 具体而言,所述响应报文例如是上述的512bit的数据A。
[0094] 步骤S4、根据所述请求链所记录的请求时间顺序,将与所述所有待响应的请求报文对应的响应报文按序发送给对应的虚拟队列。
[0095] 需说明的是,本实施例实现了基于每个虚拟队列独立保序,以2000个虚拟队列为例,相对于通过FIFO装置实现的报文保序而言,无需使用256个FIFO装置,能够更加节约资源;相对于单独使用链表嵌套保序而言,无须建立2000条链,请求链和数据链的地址与虚拟队列之间的映射关系并不是固定不变的,处于空闲状态的请求链和数据链是可以提供给不同虚拟队列循环使用的,能够避免造成资源浪费,并能实现同时收发请求报文。
[0096] 在一些实施例中,所述方法还包括:
[0097] 在将任一个响应报文发送给所述虚拟队列之后,获取所述任一个响应报文所对应的一个请求地址、一个或多个存储地址,并对所述一个请求地址及其对应的数据链、所述一个或多个存储地址及其对应的一个或多个存储单元进行释放,以用于循环使用。
[0098] 具体而言,如上所述,一个请求地址对应的是虚拟队列的一个请求报文,也可以理解为,一个请求地址也对应的需要返回给虚拟队列的一个响应报文,在将响应报文发送给对应的虚拟队列之后,此时,该虚拟队列的一个请求报文的处理已经结束,完成对该一个请求报文的响应,可以对相关的请求地址、数据链、存储地址和存储单元等资源进行释放,以供其他虚拟队列使用,避免资源浪费,提高性能。本实施例中预先设置有多个请求地址和多个存储地址,当请求地址、存储地址被使用时,其状态变为忙碌,当请求地址、存储地址被释放时,其状态变为空闲,忙碌和空闲可以用0/1进行表示。
[0099] 在一些实施例中,所述方法还包括:
[0100] 若所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内未接收到所述虚拟队列发送的新的待响应的请求报文,则对所述虚拟队列所对应的请求链进行释放,以用于循环使用;若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内接收到所述虚拟队列发送的新的待响应的请求报文,则为所述新的待响应的请求报文分配一个空闲的请求地址;根据分配给所述新的待响应的请求报文的请求地址更新所述请求链;以及,将分配给所述新的待响应的请求报文的请求地址和所述新的待响应的请求报文一并发送至对端设备。
[0101] 具体而言,如果虚拟队列的所有请求报文的均已响应完毕,并且在预设时间来没有新的请求报文,则可以对相关的请求链的资源进行释放,对请求链进行下链,即删除请求链。
[0102] 具体而言,本实施例方法在不影响性能的同时,请求链表的上链、下链可同时进行,数据不会断流,因此,性能较高且节省资源。
[0103] 在一些实施例中,所述获取与所述虚拟队列对应的一条请求链,包括:
[0104] 获取所述虚拟队列的队列编号,根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,若存在,则获取对应的请求链;若不存在,则新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系。
[0105] 进一步地,所述根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,包括:
[0106] 根据所述队列编号查询虚拟队列寄存器,若所述虚拟队列寄存器中与所述虚拟队列的队列编号对应的一个位的值为1,则表示存在一个与所述虚拟队列对应的请求链;若所述虚拟队列寄存器中与所述队列编号对应的一个位的值为0,则表示不存在一个与所述虚拟队列对应的请求链;
[0107] 其中,所述虚拟队列寄存器的位宽与虚拟队列的总数相同,所述虚拟队列寄存器的每个位的初始值均为0。
[0108] 更进一步地,所述新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系,包括:
[0109] 获取一个空闲的请求链地址,建立所述队列编号与所述请求链地址之间的映射关系,并根据所述请求链地址在预设的请求链表中新增一条请求链;
[0110] 其中,所述请求链包括头指针单元、尾指针单元;所述请求链的头指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;所述请求链的尾指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最晚的一个请求报文的请求地址;
[0111] 其中,所述请求链表包括第一nxt指针链,所述第一nxt指针链包括多个第一nxt指针单元,每个第一nxt指针单元分别对应一个请求地址,且每个第一nxt指针单元的地址为与其对应的请求地址,每个第一nxt指针单元存储其指向的另一个第一nxt指针单元的地址;所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系表示所述虚拟队列的所有待响应的请求报文的请求时间顺序。
[0112] 如图4所示为本实施例中列举的一个请求链表的结构示意图,下面结合图4对本发明实施例方法的请求链表内容进行详细说明;
[0113] 在虚拟队列的个数远大于总线处理能力的情况下,同时处理的虚拟队列的队列编号虽然不同,但是最大同时处理的虚拟队列个数可以确定,因此只需要提供与最大同时处理的虚拟队列个数相当的链表资源即可,当某个虚拟队列有请求报文发出时,先从本地的tagid池中找寻一个空闲tagid,tagid即所述请求链地址,再将虚拟队列的队列编号映射为寻找到的空闲tagid,每个tagid对应建立一条请求链。
[0114] 空闲tagid找寻方式如下:设定一个位宽相同于tagid个数的寄存器free_id,该寄存器初始值为全1,从free_id最低位开始,找第一个值为1的bit,这个bit即为找到的一个空闲tagid。当该tagid使用完成,将该bit的值写1,即完成tagid的释放。
[0115] 建立一组虚拟队列寄存器,虚拟队列寄存器的位宽相同于虚拟队列个数,初始值为全0。在某个虚拟队列映射为内部tagid后,将该虚拟队列对应的tagid存储于内部缓存中,该缓存的地址为虚拟队列的队列编号,内部存放的数据为tagid,同时拉高该虚拟队列寄存器中对应的一个bit;例如,当前处理虚拟队列10的请求,则拉高虚拟队列寄存器的第10bit。
[0116] 映射完成后建立请求链,进行上链操作;每条请求链(每个虚拟队列都会经过映射后生成一条请求链)都有一个头指针和一个尾指针,请求链的头指针和尾指针的地址是对应的tagid,即请求链地址,存放的数据是对应的请求报文的请求地址,图中的arid即是请求地址。此外还有一条第一nxt指针链,第一nxt指针链包括多个第一nxt指针单元,多个第一nxt指针单元的地址是按顺序排列的arid,第一nxt指针链的每个第一nxt指针单元存放的数据另一个nxt指针单元的地址,即是选中的虚拟队列的下一个请求报文所对应请求地址arid,表示同一个虚拟队列的相邻两个请求报文之间的前后关系,因此,根据请求链的头指针和尾指针所对应的两个第一nxt指针单元存放的数据(指向关系),可以找到多个请求地址之间的关系,也就找到了多个请求报文之间的请求时间顺序,需说明的是,本实施例的请求链表可以任意继续挂链,以满足实际需求。
[0117] 进一步地,假设读取存储延时等原因导致影响延时有6个时钟周期,则在这6个时钟周期内,只要报文保序装置收到虚拟队列的新的请求报文,虚拟队列寄存器中的对应bit不会拉高,对应的tagid不会释放,请求链仍然存在;如果报文保序装置未收到新的请求报文,虚拟队列寄存器中的对应bit将拉高,对应的tagid释放,请求链撤链完成。
[0118] 进一步地,如上所述,在将响应报文发送给虚拟队列之后,需要对相应的请求地址以及第一nxt指针单元等进行释放,因此,参阅图4可知,当任一条请求链的头指针单元和尾指针单元相同时,则认为这条请求链是可以进行释放的,请求链对应的tagid可以继续用于下个需要处理的虚拟队列的映射,这样请求链表中的所有链可以共享存储资源,做到资源使用的最大化。
[0119] 在一些实施例中,所述方法还包括:
[0120] 当将响应所述请求报文的响应报文发送给所述虚拟队列之后,完成对所述请求报文的响应,则根据所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系更新所述请求链的头指针单元,使得所述请求链的头指针单元存储剩余所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;并对所述请求报文对应的请求地址和第一nxt指针单元进行释放,以用于循环使用。
[0121] 具体而言,如上所述,当将任一个响应报文发送给对应的虚拟队列之后,表示该虚拟队列的一个请求报文的处理已经结束,则虚拟队列的请求链中不需要再记录该请求报文的有关信息,也即记录其请求地址,则可以对该虚拟队列对应的请求链的头指针单元的存储数据修改为该虚拟队列对应的tagid以及该虚拟队列发送给报文保序装置(也即虚拟队列接收的)的下一个请求报文的请求地址;同时,因为头指针单元对应使用了一个nxt指针单元,因此,可以将该头指针单元对应的一个nxt指针单元进行释放。
[0122] 在一些实施例中,所述根据所述请求地址更新所述请求链,包括:
[0123] 根据所述请求地址更新所述请求链的头指针单元、尾指针单元和第一nxt指针链;其中,若所述请求报文是所述请求链接收到的第一个请求报文时,则使所述请求链的头指针单元、尾指针单元均存储所述请求地址;若所述请求报文是所述请求链接收到的第i+1个请求报文时,则使所述请求链的头指针单元保持不变,所述请求链的尾指针单元存储所述请求地址,第i个请求报文的请求地址对应的第一nxt指针单元存储第i+1个请求报文的请求地址,i为正整数。
[0124] 在一些实施例中,所述步骤S2中,获取与所述地址信息对应的数据链,包括:
[0125] 确定是否存在一条与所述地址信息对应的数据链,若存在,则获取对应的数据链;若不存在,则新建一条数据链。
[0126] 进一步地,所述新建一条数据链,包括:
[0127] 在预设的数据链表中新增一条数据链;其中,所述数据链包括头指针单元、尾指针单元;所述数据链的头指针单元的地址为所述地址信息,其存储所述对端设备最早响应所述请求报文返回一个响应数据的存储地址;所述数据链的尾指针单元的地址为所述地址信息,其存储所述对端设备最晚响应所述请求报文返回一个响应数据的存储地址;
[0128] 其中,所述数据链表包括第二nxt指针链,所述第二nxt指针链包括多个第二nxt指针单元,每个第二nxt指针单元分别对应一个存储地址,且每个第二nxt指针单元的地址为与其对应的存储地址,每个第二nxt指针单元存储其指向的另一个第二nxt指针单元的地址;所述数据链的头指针和尾指针的存储地址所对应的第二nxt指针单元之间的指向关系表示所述对端设备响应所述请求报文返回的所有响应数据的返回时间顺序。
[0129] 在一些实施例中,所述根据所述存储地址更新所述数据链,包括:
[0130] 根据所述存储地址更新所述数据链的头指针单元、尾指针单元和第二nxt指针链;其中,若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第一个响应数据,则使所述数据链的头指针单元、尾指针单元均存储所述存储地址;若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第j+1响应数据,则使所述数据链的头指针单元保持不变,所述数据链的尾指针单元存储所述存储地址,第j个响应数据的存储地址对应的第二nxt指针单元存储第j+1个响应数据的存储地址,j为正整数。
[0131] 如图5所示为本实施例中列举的一个数据链表的结构示意图,图5中data id表示数据编号, rid=7表示返回的数据报文携带的地址信息为7,地址信息与请求地址arid是对应的;图5中每一条数据链对应一个请求地址,也对应一个请求报文,也对应一个需要返回给虚拟队列的一个响应报文,该一个响应报文可能是包括分多次返回的多个64B数据(响应数据);如图5中还示出了多个存储单元,用于存储对端设备返回的64B数据(响应数据),与响应数据的存储地址一一对应;
[0132] 图6和7分别为本发明的一个实施例中的请求链上链和下链的流程图,下面结合图4‑7对本发明实施例方法进行详细举例说明;
[0133] 假设请求报文的发送顺序依次为:queue0的req0,queue0的req1,queue0的req2,queue0的req3,queue1的req0,queue1的req1,queue1的req2,queuex的req0,queue1的req3,queue1的req4,queuex的req1,queue2047的req0,queue2047的req1,queuex的req2,queue2047的req2,queue2047的req3,queuex的req3,…, queue2047的req4。这些请求报文会被映射为不同的请求编号arid,映射情况如下:queue0的req0分配为arid0,queue0的req1分配为arid1,queue0的req2分配为arid2,queue0的req3分配为arid3,queue1的req0分配为arid4,queue1的req1分配为arid5,queue1的req2分配为arid6,queuex的req0分配为arid7,queue1的req3分配为arid8,queue1的req4分配为arid9,queuex的req1分配为arid10,queue2047的req0分配为arid11,queue2047的req1分配为arid12,queuex的req2分配为arid13,queue2047的req2分配为arid14,queue2047的req3分配为arid15,queuex的req3分配为arid16,…, queue2047的req4分配为arid511。
[0134] 以虚拟队列x,即queuex为例,说明上链下链流程。
[0135] 第一种情况为,请求链未出现同时上链下链的情况:
[0136] 收到请求后,请求链开始上链;
[0137] (1.1)queuex收到请求时,映射为内部一个空闲请求链地址举例步地tagid,建立tagid=x(x为任意值,不一定会同于queue的编号)的请求链,根据请求报文的请求顺序进行上链;
[0138] (1.2)queuex的req0(请求大小为320BYTE)发送过来时,被分配为arid=7,tagid=x的头指针为arid=7,tagid=x的尾指针暂时也为arid=7,并将queuex对应的tagid存储于内部缓存(图中未示出该缓存空间)中;
[0139] (1.3)queuex的req1(请求大小为448BYTE)发送过来时,被分配为arid=10,此时查询到queue_inuse_flg[x](queuex对应的bit)已经拉高,证明queuex已经建立链表;查询内部缓存,queuex对应的链表为tagidx;查询tagidx的尾指针为arid7,改写尾指针为arid10,nxt指针中地址arid7中存放的数据改写为原始tagidx的尾指针即arid7;
[0140] (1.4)queuex的req2(请求大小为320BYTE)发送过来时,被分配为arid=13,此时查询到queue_inuse_flg[x](queuex对应的bit)已经拉高,证明queuex已经建立链表;查询内部缓存,queuex对应的链表为tagid;查询tagidx的尾指针为arid10,改写尾指针为arid13,nxt指针中地址arid10中存放的数据改写为原始tagidx的尾指针即arid13;
[0141] (1.5)queuex的req3(请求大小为320BYTE)发送过来时,被分配为arid=16,此时查询到queue_inuse_flg[x](queuex对应的bit)已经拉高,证明queuex已经建立链表;查询内部缓存,queuex对应的链表为tagidx;查询tagidx的尾指针为arid13,改写尾指针为arid16,nxt指针中地址arid13中存放的数据改写为原始tagidx的尾指针即arid16;
[0142] 由此可以看到如图5所示的tagid=x的头指针为arid7,尾指针为arid16;nxt指针中地址arid7对应的指针为arid10;地址arid10对应的指针为arid13;地址arid13对应的指针为arid16;
[0143] 从对端设备收到数据后,开始数据链的上链;需说明的是,图5中的数据链共512条,与请求地址arid一一对应,无需像请求链那样,将虚拟队列queuex映射为tagidx;
[0144] (1.6)第一个收到的数据为rid=10的第一个64BYTE响应数据,该笔数据被分配为dataid=0,同时建立数据链10;数据链10的头指针为dataid0,数据链10的尾指针为dataid0;
[0145] (1.7)第二个收到的数据为rid=7的第一个64BYTE响应数据,该笔数据被分配为dataid=1,同时建立数据链7;数据链7的头指针为dataid1,数据链7的尾指针为dataid1;
[0146] (1.8)第三个收到的数据为rid=7的第二个64BYTE响应数据,该笔数据被分配为dataid=2,查询数据链7的尾指针当前为dataid1;改写尾指针为dataid2,并将dataid1对应的nxt指针改写为dataid2;
[0147] (1.9)第四个收到的数据为rid=7的第三个64BYTE响应数据,该笔数据被分配为dataid=3,查询数据链7的尾指针当前为dataid2;改写尾指针为dataid3,并将dataid2对应的nxt指针改写为dataid3;
[0148] (1.10)第五个收到的数据为rid=7的第四个64BYTE响应数据,该笔数据被分配为dataid=5,查询数据链7的尾指针当前为dataid3;改写尾指针为dataid5,并将dataid3对应的nxt指针改写为dataid5;
[0149] (1.11)第六个收到的数据为rid=10的第二个64BYTE响应数据,该笔数据被分配为dataid=6,查询数据链10的尾指针当前为dataid0;改写尾指针为dataid6,并将dataid0对应的nxt指针改写为dataid6;
[0150] (1.12)第七个收到的数据为rid=7的第四个64BYTE响应数据,该笔数据被分配为dataid=7,查询数据链7的尾指针当前为dataid5;改写尾指针为dataid7,并将dataid5对应的nxt指针改写为dataid7;至此数据链7的320BYTE数据全部收齐;按照数据链7的指顺序,依次读取数据存储单元;即按顺序读取地址为1,2,3,5,7的存储单元的数据,并将读取的数据发送至queuex;查询arid7对应的nxt指针为arid10,改写请求链tagidx的头指针为arid10;同时进行指针回退,即数据链的指针dataid1,2,3,5,7可以回收;请求链的指针arid7可以回收;
[0151] 其他请求链和数据链的处理与上述流程相同;
[0152] (1.13)最后一个数据链arid16的数据收集完成后,tagidx对应的头指针和尾指针都为arid=16;此时头尾指针相同,拉高req_clear_pending[tagidx]所需的处理周期(该周期跟数据处理所需要的周期有关),在该信号为1时,如果queuex未收到新的请求,tagidx被回收,可以用于下次建链;
[0153] 第二种情况为,请求链上链下链同时出现:
[0154] (2.1)queuex收到请求时,映射为内部任一tagid,建立tagid=x(x为任意值,不一定会同于queue的编号)的链表,根据请求顺序上链;
[0155] (2.2)queuex的req0(请求大小为320BYTE)发送过来时,被分配为arid=7,tagid=x的头指针为arid=7,tagid=x的尾指针暂时也为arid=7,并将queuex对应的tagid存储于内部缓存(图中未示出该缓存空间)中;
[0156] (2.3)queuex的req1(请求大小为448BYTE)发送过来时,被分配为arid=10,此时查询到queue_inuse_flg[x](queuex对应的bit)已经拉高,证明queuex已经建立链表;查询内部缓存,queuex对应的链表为tagidx;查询tagidx的尾指针为arid7,改写尾指针为arid10,nxt指针中地址arid7中存放的数据改写为原始tagidx的尾指针即arid7;
[0157] (2.4)queuex的req2(请求大小为320BYTE)发送过来时,被分配为arid=13,此时查询到queue_inuse_flg[x](queuex对应的bit)已经拉高,证明queuex已经建立链表;查询内部缓存,queuex对应的链表为tagid;查询tagidx的尾指针为arid10,改写尾指针为arid13,nxt指针中地址arid10中存放的数据改写为原始tagidx的尾指针即arid13;(前4步和第一种情况完全相同)
[0158] 在这时,数据开始返回,直至尾指针arid13对应的数据链也收集完成;数据链的处理同于情况一的步骤1.6‑1.12;区别为步骤1.13对tagidx撤链的同时收到queuex的请求;
[0159] (2.5)queuex的req3(请求大小为320BYTE)发送过来时,被分配为arid=16;将tagidx的头尾指针变更为arid=16;即再次进行上链操作;
[0160] (2.6)后续收到请求处理方式同于步骤2.2‑2.4;收到数据的处理同于情况一的步骤1.6‑1.13;
[0161] 与上述实施例的对应,本发明的另一个实施例提出一种多个虚拟队列的报文保序装置,参阅图8,本实施例的装置包括以下功能单元:
[0162] 请求链表单元1,用于当接收到任一个虚拟队列发送的任一个待响应的请求报文时,获取与所述虚拟队列对应的一条请求链;为所述请求报文分配一个空闲的请求地址;根据所述请求地址更新所述请求链;以及,将所述请求地址和所述请求报文一并发送至对端设备;其中,所述请求链用于记录所述虚拟队列发送的所有待响应的请求报文的请求时间顺序;
[0163] 数据链表单元2,用于当接收到所述对端设备响应所述请求报文返回的任一个数据报文时,确定所述数据报文携带的地址信息和响应数据;获取与所述地址信息对应的数据链;为所述响应数据分配一个空闲的存储地址;根据所述存储地址更新所述数据链;以及,将所述响应数据存储在与所述存储地址对应的存储单元中;其中,所述数据链用于记录所述对端设备响应所述请求报文返回的一个或多个响应数据的返回时间顺序;所述地址信息与所述请求地址相同;
[0164] 报文生成单元3,用于在完成所述对端设备响应所述请求报文返回的所有响应数据的接收之后,根据所述数据链所记录的返回时间顺序以及所述所有响应数据的存储地址从对应的一个或多个存储单元中读取一个或多个响应数据,根据读取的一个或多个响应数据生成对应的一个响应报文;
[0165] 报文发送单元4,用于根据所述请求链所记录的请求时间顺序,将与所述所有待响应的请求报文对应的响应报文按序发送给对应的虚拟队列。
[0166] 在一些实施例中,所述数据链表单元2,具体用于:
[0167] 在将任一个响应报文发送给所述虚拟队列之后,获取所述任一个响应报文所对应的一个请求地址、一个或多个存储地址,并对所述一个请求地址及其对应的数据链、所述一个或多个存储地址及其对应的一个或多个存储单元进行释放,以用于循环使用。
[0168] 在一些实施例中,所述请求链表单元1,还用于:
[0169] 若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内未接收到所述虚拟队列发送的新的待响应的请求报文,则对所述虚拟队列所对应的请求链进行释放,以用于循环使用;
[0170] 若与所述所有待响应的请求报文均已返回给所述虚拟队列,且在预设时间内接收到所述虚拟队列发送的新的待响应的请求报文,则为所述新的待响应的请求报文分配一个空闲的请求地址;根据分配给所述新的待响应的请求报文的请求地址更新所述请求链;以及,将分配给所述新的待响应的请求报文的请求地址和所述新的待响应的请求报文一并发送至对端设备。
[0171] 在一些实施例中,所述请求链表单元1,具体用于:
[0172] 获取所述虚拟队列的队列编号,根据所述队列编号确定是否存在一个与所述虚拟队列对应的请求链,若存在,则获取对应的请求链;若不存在,则新建一条请求链,并建立所述请求链与所述虚拟队列的映射关系。
[0173] 在一些实施例中,所述请求链表单元1,具体用于:
[0174] 根据所述队列编号查询虚拟队列寄存器,若所述虚拟队列寄存器中与所述虚拟队列的队列编号对应的一个位的值为1,则表示存在一个与所述虚拟队列对应的请求链;若所述虚拟队列寄存器中与所述队列编号对应的一个位的值为0,则表示不存在一个与所述虚拟队列对应的请求链;
[0175] 其中,所述虚拟队列寄存器的位宽与虚拟队列的总数相同,所述虚拟队列寄存器的每个位的初始值均为0。
[0176] 在一些实施例中,所述请求链表单元1,具体用于:
[0177] 获取一个空闲的请求链地址,建立所述队列编号与所述请求链地址之间的映射关系,并根据所述请求链地址在预设的请求链表中新增一条请求链;
[0178] 其中,所述请求链包括头指针单元、尾指针单元;所述请求链的头指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;所述请求链的尾指针单元的地址为所述请求链地址,且其存储所述所有待响应的请求报文中请求时间最晚的一个请求报文的请求地址;
[0179] 其中,所述请求链表包括第一nxt指针链,所述第一nxt指针链包括多个第一nxt指针单元,每个第一nxt指针单元分别对应一个请求地址,且每个第一nxt指针单元的地址为与其对应的请求地址,每个第一nxt指针单元存储其指向的另一个第一nxt指针单元的地址;所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系表示所述虚拟队列的所有待响应的请求报文的请求时间顺序。
[0180] 在一些实施例中,所述请求链表单元1,还用于:
[0181] 当将响应所述请求报文的响应报文发送给所述虚拟队列之后,完成对所述请求报文的响应,则根据所述请求链的头指针和尾指针的请求地址所对应的第一nxt指针单元之间的指向关系更新所述请求链的头指针单元,使得所述请求链的头指针单元存储剩余所有待响应的请求报文中请求时间最早的一个请求报文的请求地址;并对所述请求报文对应的请求地址和第一nxt指针单元进行释放,以用于循环使用。
[0182] 在一些实施例中,所述请求链表单元1,具体用于:
[0183] 根据所述请求地址更新所述请求链的头指针单元、尾指针单元和第一nxt指针链;其中,若所述请求报文是所述请求链接收到的第一个请求报文时,则使所述请求链的头指针单元、尾指针单元均存储所述请求地址;若所述请求报文是所述请求链接收到的第i+1个请求报文时,则使所述请求链的头指针单元保持不变,所述请求链的尾指针单元存储所述请求地址,第i个请求报文的请求地址对应的第一nxt指针单元存储第i+1个请求报文的请求地址,i为正整数。
[0184] 在一些实施例中,所述数据链表单元2,具体用于:
[0185] 确定是否存在一条与所述地址信息对应的数据链,若存在,则获取对应的数据链;若不存在,则新建一条数据链。
[0186] 在一些实施例中,所述数据链表单元2,具体用于:
[0187] 在预设的数据链表中新增一条数据链;其中,所述数据链包括头指针单元、尾指针单元;所述数据链的头指针单元的地址为所述地址信息,其存储所述对端设备最早响应所述请求报文返回一个响应数据的存储地址;所述数据链的尾指针单元的地址为所述地址信息,其存储所述对端设备最晚响应所述请求报文返回一个响应数据的存储地址;
[0188] 其中,所述数据链表包括第二nxt指针链,所述第二nxt指针链包括多个第二nxt指针单元,每个第二nxt指针单元分别对应一个存储地址,且每个第二nxt指针单元的地址为与其对应的存储地址,每个第二nxt指针单元存储其指向的另一个第二nxt指针单元的地址;所述数据链的头指针和尾指针的存储地址所对应的第二nxt指针单元之间的指向关系表示所述对端设备响应所述请求报文返回的所有响应数据的返回时间顺序。
[0189] 在一些实施例中,所述数据链表单元2,具体用于:
[0190] 根据所述存储地址更新所述数据链的头指针单元、尾指针单元和第二nxt指针链;其中,若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第一个响应数据,则使所述数据链的头指针单元、尾指针单元均存储所述存储地址;若当前接收到的响应数据是所述对端设备响应所述请求报文返回的第j+1响应数据,则使所述数据链的头指针单元保持不变,所述数据链的尾指针单元存储所述存储地址,第j个响应数据的存储地址对应的第二nxt指针单元存储第j+1个响应数据的存储地址,j为正整数。
[0191] 需说明的是,本实施例所述的多个虚拟队列的报文保序装置与上述实施例所述的多个虚拟队列的报文保序方法对应,因此,本实施例所述的多个虚拟队列的报文保序装置未详述的部分可以参阅上述实施例所述的多个虚拟队列的报文保序方法的内容得到,故此处不进行赘述。
[0192] 并且,上述实施例的多个虚拟队列的报文保序装置若以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在计算机可读取存储介质中。
[0193] 本发明的另一个实施例提出一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时,实现如上述实施例所述的多个虚拟队列的报文保序方法。
[0194] 具体而言,所述计算机可读存储介质可以包括:能够携带所述计算机程序指令的任何实体或记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read‑Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。
[0195] 本发明的另一个实施例提出一种电子设备,包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述实施例所述的多个虚拟队列的报文保序方法。
[0196] 其中,电子设备还可以包括连接不同组件(包括存储器和处理器)的总线。存储器可以包括易失性存储器形式的计算机可读介质,例如随机存取存储器(RAM)和/或高速缓存存储器。存储器也可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本申请各实施例的功能。电子设备也可以与一个或多个外部设备(例如键盘、指向设备、显示器等)通信,还可与一个或者多个使得用户能与该电子设备交互的设备通信,和/或与使得该电子设备能与一个或多个其他计算设备进行通信的任何设备(例如网卡)通信,这种通信可以通过输入/输出(I/O)接口进行,并且,电子设备还可以通过网络适配器与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。
[0197] 以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多更新和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。