掌桥专利:专业的专利平台
掌桥专利
首页

基于双链表结构的I/O指令管理方法及装置

文献发布时间:2023-06-19 10:08:35


基于双链表结构的I/O指令管理方法及装置

技术领域

本发明属于磁盘阵列读写领域,特别涉及一种基于双链表结构的I/O指令管理方法及装置。

背景技术

存储系统是满足大量数据应用读写需求的基础设施,其输入/输出(input/output,I/O)性能直接决定数据读写效率,是影响数据应用整体性能的关键因素。应用层软件下发I/O的策略、RAID卡软硬件对I/O指令的管理和调度、扩展卡Expander的带宽和数据交换性能、底层物理通道的带宽、磁盘本身的访问速率等,每一个环节都可能影响存储系统的I/O性能。

如图1所示,在典型的磁盘阵列系统中,主机通过RAID(Redundant Array ofIndependent Disks)卡、扩展卡(Expander)实现对数以千计的物理磁盘的访问,如SAS(Serial Attached SCSI)固态盘、SAS机械盘、SATA(Serial AT Attachment)机械盘等。主机应用层软件下发大量读写磁盘的I/O(input/output)指令,等待磁盘的响应。这些指令在下发到磁盘之前通常以FIFO形式缓存在主机内存(DDR)的I/O队列中,由驱动软件或RAID卡硬件完成这些I/O指令的管理,根据I/O的目标磁盘地址和存储系统的网络拓扑架构选择合适的物理通道完成I/O指令的发送和接收,图1所示每个物理通道对应一个PHY。I/O队列中的命令支持乱序派发、乱序返回。通常情况下,一个磁盘阵列系统需要支持多达4K~8K个I/O指令的并发执行。且这些指令在执行过程中存在一定的生命周期,每个I/O指令会拆分成多个阶段执行。

以SAS盘为例,通常一条写指令会分成4个或4个以上的阶段执行,每个阶段的间隔期间链路可能会被其他I/O占用。所以需要对这些I/O进行非常频繁的调度和管理,而现有技术主要基于FIFO即先来先服务机制进行I/O指令的管理。

参见图2,为了方便硬件快速访问和流水操作,通常还会在SRAM中开辟一部分存储空间,用于存储即将执行的I/O指令和正在执行中被挂起的I/O指令、I/O指令相关的上下文信息(命令控制字)、I/O指令的执行完成状态,这些也都是通过FIFO机制进行管理。具体的执行流程说明如下:

1.主机应用层软件在内存(DDR)中开辟连续存储空间用于存储I/O指令,并将I/O指令下发到位于内存(DDR)中的I/O队列FIFO。

2.当底层驱动软件判断Pending命令队列FIFO有空闲槽位时,从内存(DDR)中读取一条I/O指令加入Pending命令队列FIFO中。

3.命令执行状态机轮询当前端口下的所有通道状态,判断是否存在空闲通道。如果有空闲通道,则从SRAM中的Pending命令队列FIFO中取出一条指令,派发到当前空闲通道。

4.轮询下一个通道状态,等待发送下一条指令。如果收到某个指令完成的响应帧,则将完成信息写入指令完成命令FIFO,等待软件处理。

可见,现有基于FIFO的I/O指令管理机制存在如下缺点:

1.Pending FIFO的深度是固定的,I/O的并发度受FIFO设计深度的约束;由于深度越大,需要的硬件资源越多,所以也无法将FIFO的深度设计得过大。这种设计会影响整个系统的性能,而且不够灵活。

2.由于Pending FIFO的深度是固定的,而主机下发的I/O数量远远大于PendingFIFO的深度,一般情况下Pending FIFO长期处于接近满的状态。在I/O执行过程中,对于需要重新调度的I/O,在重新写回Pending FIFO时有可能碰到队列满而无法写入的问题,这样会导致通道拥塞,从而影响系统性能。

3.基于先进先出的特点,FIFO机制无法实现I/O指令的优先级处理,不利于I/O的灵活调度。例如重新调度的I/O、Task指令往往都拥有较高优先级,但在FIFO机制下无法实现高优先级指令的优先调度,也影响整个系统的灵活性。

4.对于已经进入Pending FIFO,但是应用层软件需要中止(Abort)的I/O指令,FIFO机制无法提前将这些指令从队列中删除,必须等到调度到该指令时判断当前I/O的上下文才能知道是否需要丢弃该指令。这种操作会浪费系统开销,影响系统性能。

发明内容

本发明的目的在于一种基于硬盘的I/O指令调度管理方法和装置,基于FIFO的I/O管理方案进行优化,解决磁盘阵列系统中多I/O并发的灵活调度和管理问题。

参见图4,本发明在第一方面提供了一种基于双链表结构的I/O指令管理方法,包括:

从内存中的I/O指令队列读取I/O指令;

根据所述I/O指令的目标磁盘设备生成设备链表,并根据所述I/O指令生成与所述目标磁盘设备相对应的指令链表;

通过对物理通道进行轮询,选择空闲状态的第一物理通道;

从所述设备链表中选择第一磁盘设备;

从所述第一磁盘设备对应的指令链表中选择第一I/O指令;

将所述第一I/O指令和所述第一磁盘设备下发至所述第一物理通道。

优选地,所述根据I/O指令的目标磁盘信息生成设备链表,并根据所述I/O指令生成对应于所述目标磁盘的指令链表,进一步包括:

如果当前I/O指令的目标磁盘设备不在所述设备链表中,则将当前目标磁盘设备插入设备链表,同时将当前I/O指令插入当前目标磁盘设备所对应的指令链表中;

如果所述当前目标磁盘设备已在设备链表中,则仅将所述当前I/O指令插入当前目标磁盘设备所对应的指令链表中。

优选地,所述指令链表包括指令发送子链表和数据发送子链表,其中所述指令发送子链表用于表示指令发送请求,即下一帧为指令帧,所述数据发送子链表用于表示数据发送请求,即下一帧为写数据帧;

所述从第一磁盘设备对应的指令链表中选择第一I/O指令,进一步包括:根据预先配置的优先级,从所述第一磁盘设备对应的所述指令发送子链表中选择第一指令帧,或从所述第一磁盘设备对应的所述数据发送子链表中选择第一写数据帧。

优选地,所述将当前I/O指令插入当前目标磁盘设备所对应的指令链表中,进一步包括:

根据当前I/O指令的优先级,确定将当前I/O指令挂载到所述指令链表的位置,所述位置包括指令链表的头部、尾部或中部。

优选地,所述第一I/O指令是所述第一磁盘设备对应的指令链表的链头节点。

参见图5,本发明在第二方面提供了一种基于双链表结构的I/O指令管理装置,包括:

链表生成模块,被配置为从内存中的I/O指令队列读取I/O指令,根据所述I/O指令的目标磁盘设备生成设备链表,并根据所述I/O指令生成与所述目标磁盘设备相对应的指令链表;

通道选择模块,被配置为通过对物理通道进行轮询,选择空闲状态的第一物理通道;

设备选择模块,被配置为从所述设备链表中选择第一磁盘设备;

指令选择模块,被配置为从所述第一磁盘设备对应的指令链表中选择第一I/O指令;

指令下发选择模块,被配置为将所述第一I/O指令和所述第一磁盘设备下发至所述第一物理通道。

优选地,所述链表生成模块进一步被配置为,如果当前I/O指令的目标磁盘设备不在所述设备链表中,则将当前目标磁盘设备插入设备链表,同时将当前I/O指令插入当前目标磁盘设备所对应的指令链表中;如果所述当前目标磁盘设备已在设备链表中,则仅将所述当前I/O指令插入当前目标磁盘设备所对应的指令链表中。

优选地,所述指令链表包括指令发送子链表和数据发送子链表,其中所述指令发送子链表用于表示指令发送请求,即下一帧为指令帧,所述数据发送子链表用于表示数据发送请求,即下一帧为写数据帧;

所述指令选择模块进一步被配置为,根据预先配置的优先级,从所述第一磁盘设备对应的所述指令发送子链表中选择第一指令帧,或从所述第一磁盘设备对应的所述数据发送子链表中选择第一写数据帧。

优选地,所述链表生成模块进一步被配置为,根据当前I/O指令的优先级,确定将当前I/O指令挂载到所述指令链表的位置,所述位置包括指令链表的头部、尾部或中部。

优选地,所述第一I/O指令是所述第一磁盘设备对应的指令链表的链头节点。

本发明采用双链表机制代替FIFO机制进行I/O指令的管理。相比于现有技术,使系统根据实际运行状态灵活处理I/O的并发度,避免FIFO写满的情况而导致通道进入等待调度响应的状态,而且实现了I/O指令的不同优先级的调度,减少系统无效开销,灵活地实现了指令帧与数据帧的不同优先级派发机制,提高系统的整体灵活性和处理性能。

本发明的其它特征和优点将在随后的说明书中阐述,并且部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所指出的结构来实现和获得。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来说,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了根据现有技术的典型磁盘阵列结构示意图。

图2示出了根据现有技术的I/O指令调度和管理方案示意图。

图3示出了根据本发明实施例的基于磁盘和I/O指令的双链表结构示意图。

图4示出了根据本发明实施例的基于双链表结构的I/O指令调度管理方法流程图。

图5示出了根据本发明实施例的基于双链表结构的I/O指令调度管理装置的模块图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地说明,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如前所述,基于FIFO的I/O管理机制不利于I/O的高并发性,同时受硬件的资源限制而容易引起通道进入等待调度响应的状态,损失了系统I/O性能。有鉴于此,本发明主要针对基于FIFO的I/O管理方案进行优化,解决磁盘阵列系统中多I/O并发的灵活调度和管理问题,因此提出了基于双链表的I/O指令管理方法和装置,使I/O指令的并发与硬件资源解耦合,避免出现通道利用率损失,提升系统的I/O性能。

本发明针对磁盘阵列系统中大量I/O指令的并发调度问题,提出了针对磁盘建立链表(ITCT_List)和针对I/O指令本身建立链表(IOST_List)的双链表管理策略。包含双链表的磁盘I/O指令调度架构示意图如图3所示。说明如下:

在一个优选的实施例中,将上述双链表管理策略的具体过程描述如下:

步骤101.主机应用层软件在内存中建立I/O指令存储空间。

具体地,所述主机应用层软件在内存(DDR)中开辟第一连续存储空间,作为用于存储I/O指令的I/O队列。优选地,第一存储空间可以存储4~8K条指令,具体根据应用场景而定。

此外,所述主机应用层软件还可同时开辟第二连续存储空间,用于存储I/O指令完成状态。第一和第二存储空间均以FIFO机制进行管理。

步骤102.主机应用层软件将I/O指令下发到内存的I/O队列。

在第一存储空间已准备就绪之后,主机应用层软件将I/O指令下发到位于内存(DDR)中的第一存储空间,即I/O队列FIFO。由于主机应用层软件按序生成I/O指令,因而每个软件线程生成的I/O指令可以按原始顺序存储在I/O队列中。优选地,对于支持多线程的系统,多个软件线程可分别建立单独的I/O队列。

步骤103.从I/O队列FIFO中读取I/O指令,根据I/O指令的目标磁盘信息生成设备链表,并根据所述I/O指令生成指令链表。

在具体实现中,命令执行状态机可初始化一个空的链表(ITCT_List),用于维护与每个磁盘设备相对应的信息。所述设备链表的每个节点均与相应的指令链表相关联。每次从主机内存(DDR)中的I/O队列FIFO中读取I/O指令时,命令执行状态机解析I/O指令的目标磁盘信息,将当前目标磁盘设备标识插入设备链表。链表中的节点与目标磁盘设备标识一一对应,即对I/O指令所关联的每个目标磁盘设备标识(下文也称设备编号ICT),在设备链表ITCT_List中仅建立一个节点。链表的新建、插入操作为本领域所公知,本文不再赘述。由于FIFO的先入先出机制,多个I/O指令按队列的顺序插入链表。对于上述支持多线程的多个I/O队列FIFO,在生成双链表时,可通过轮询操作插入双链表中。等待派发执行。

特别地,如图3所示,所述设备链表与指令链表相关联的具体实现方式为,所述设备链表节点与指令链表的链头相关联。如果在读取某个I/O指令时,当前设备不在设备链表中,则在将当前目标磁盘设备插入设备链表的同时,将当前I/O指令插入当前目标磁盘设备所对应的指令链表中;如果在读取某个I/O指令时,发现当前目标磁盘设备已经在设备链表中,则将所读取的I/O指令挂载到当前磁盘设备下的指令链表中,例如通过链表的插入操作,加入到指令链表的链尾。

与FIFO队列的固定大小不同,本发明采用可变长度的链表结构来存储I/O指令,理论上支持将任意数量的I/O指令插入链表中,并且在没有待派发的指令时,链表可以为空。因此合理高效地利用内存空间,更重要的是可以避免FIFO写满的情况而导致通道经常进入等待调度响应的状态,提高磁盘阵列系统的并发处理性能。

作为进一步示例,将指令链表划分为2个发送子链表,分别是指令发送子链表和数据发送子链表,当访问到指令发送子链表节点时,表示待发送的下一帧为指令帧,当访问到数据发送子链表节点时,表示待发送的下一帧为写数据帧。指令链表和数据链表的优先级可被预先配置。一般地,数据链表的优先级高于指令链表,即优先于指令而发送数据,因为数据一定是依附先前已发送的某条指令的。此外对于优先级高的指令,也可预先配置为优先于数据而发送该高优先级指令。在具体的优先级判断的方式上,优选地可以同时读取指令链表和数据链表的链头,判断两个链头节点的优先级,则执行较高优先级的对应子链表的取链操作。

采用数据帧链和指令帧链分开的方式,可以根据不同优先级要求,灵活实现指令帧与数据帧的派发,同时减少链表的寻址时间。

利用上述实施例的层次化链表结构,当遍历双链表时,命令执行状态机首先定位设备链表的某个目标磁盘设备,接下来对属于该目标磁盘设备的指令链表的链头进行寻址。由于该指令链表所存储的多个I/O指令均以当前磁盘设备为目标,从而间接地定位到指令链表内部的每一个链表节点,包括数据发送子链表节点和指令发送子链表节点,即遍历到与当前磁盘设备相关联的多个待派发的I/O指令。

步骤104.通过对物理通道的轮询,选择空闲状态的第一物理通道。

由于宽端口场景下存在多个物理通道PHY,因此命令执行状态机对所有物理通道进行轮询,判断每个通道的忙闲状态,选择策略是尽可能不让发送通道空闲。即如果轮询到当前通道为空闲状态,则将当前通道确定为待传输的第一物理通道。

步骤105.选择所述设备链表中的第一磁盘设备,执行所述第一磁盘设备的发送任务。

对设备(Device)的选择实质上是设备链表(ITCT_List)节点的选择,命令执行状态机从设备链表ITCT_List中选择一个Device,从而执行这个Device的发送任务。优选地,在选择磁盘设备时,选择表头节点的设备作为第一磁盘设备。即在执行磁盘调度时,从链头开始搜索,选择第一个磁盘作为第一磁盘设备。相对于传统的FIFO结构,设备链表可以避免因磁盘忙而出现无效的指令调度。

在可选的实施例中,为在一定程度上保证各个设备并发I/O的均衡,ITCT_List之间的选择策略是RR即轮转算法,即沿链表的方向,依次响应各个设备(Device)的发送请求。

在另一可选的实施例中,在RR策略的基础上,磁盘设备的选择基于当前设备的忙闲状态,即某个磁盘是否正在其他通道处于链路建立状态下执行数据收发操作。从链头开始搜索,如果磁盘状态为空闲,则选择当前设备为第一磁盘设备;如果忙,则判断下一个磁盘设备,直到发现空闲磁盘,即作为当前时间片的第一磁盘设备。

更具体地说,所有磁盘的忙闲状态可使用位图的形式来维护,即针对每个磁盘建立一个1bit的忙闲状态标志位,如果当前磁盘正处于链路成功建立状态,正在执行数据的收发操作,则表示该磁盘处于忙状态,否则为空闲状态。

步骤106.选择指令链表中的第一I/O指令。

类似地,I/O指令的选择实质上是对I/O指令链表(IOST_List)节点的选择,由于在设备链表ITCT_List内保留了特定设备的数据发送子链表和指令发送子链表的链头,所以在选定设备链表ITCT_List节点之后,能够寻址到I/O指令链表IOST_List的链头,从而确定待处理的I/O指令。优选地,为实现按序调度,第一I/O指令始终是I/O指令链表的链头节点的I/O指令。

此外,待处理的I/O指令可被映射到两个子链表之一,以实现数据和指令之间的选择。当某个磁盘设备(Device)的待发送请求I/O指令链表中,既有指令发送请求(指令发送子链表),又有数据发送请求(数据发送子链表)时,步骤106还可包括,在所述指令发送子链表和数据发送子链表两者之间选择一个进行响应。

在一个实施例中,可以依据软件的配置进行优先级的设置,例如在某些特定条件下优先响应指令发送请求,在某些其他条件下优先响应数据发送请求。具体的优先级设置方式可由本领域技术人员根据系统实际状态来制定相应的派发策略。

步骤107.将所选择的第一I/O指令和第一磁盘设备下发至所选择的第一物理通道。

在I/O指令队列FIFO中,不同的I/O指令采用IPTT(Initiator port transfertag)号进行唯一的标识。而不同的磁盘设备采用磁盘设备编号ICT进行唯一的标识。因此命令执行状态机可将I/O指令编号IPTT、磁盘设备编号ICT以及相关信息下发至所选择的物理通道。

作为优选的实施例,所述步骤107进一步包括,读取被选择的I/O的IOST和ITCT上下文信息,将其下发至选择的通道,以使通道根据上下文信息控制相关指令(Command)的发送属性。

此外,在对所选择的通道进行某个I/O指令的相关发送操作之后,命令执行状态机需要根据通道的反馈来决定后续的操作。因此方法还可进一步包括:

步骤108.当收到从物理通道返回的指令帧时,如果需要重新派发的I/O指令,则将返回的指令重新加入对应磁盘设备下的I/O指令链表中。

具体地,被成功派发的指令如果不需要状态机执行重发,则执行摘链的操作,将I/O指令从链表中删除。然而,如果收到从某个通道返回的指令帧,命令执行状态机根据指令帧对应的IPTT号获取对应I/O指令的上下文信息,以根据当前指令帧的内容执行相应的操作,例如根据返回数据的类型,确定是否将该I/O指令重新加入I/O指令链表,例如插入链尾,等待下一次派发。

如果I/O指令发送失败或者收到来自磁盘的请求主机执行写数据操作的响应,需要将该I/O重新派发,或由命令/状态机自动执行再次入队的操作。例如,在收到SSP写指令的XFER_RDY帧时,确定需要重新派发完成写数据帧的发送。此时,将当前I/O指令的IPTT号重新写入与相关磁盘设备相对应的I/O指令链表。

作为可选的实施例,在步骤103中,所述将当前I/O指令挂载到当前磁盘设备下的指令链表中,可进一步根据I/O指令的优先级高低,确定将当前I/O指令挂载到所述指令链表的具体位置。众所周知,链表的插入操作包括在链头插入、在链尾插入和在链表中部插入。例如对于高优先级的I/O指令,可以直接插入I/O指令链表的链头位置,确保下次调度时按预先设定的顺序而优先派发该指令。因此对于任意优先级的I/O指令,命令执行状态机都可以根据该指令下一次需要被派发的时间紧急程度,选择在I/O指令链表被插入的位置。通过对不同I/O指令优先级的调度,提高了系统管理指令的灵活性。

作为可选的实施例,在步骤103之后,如果主机应用层软件需要中止(Abort)的某个I/O指令,则命令执行状态机获取目标I/O指令的IPTT号和目标磁盘号,搜索设备链表,找到对应的磁盘,然后搜索该磁盘设备下的I/O指令链表,找到对应IPTT号的指令,执行摘链操作,即可提前完成I/O指令的Abort操作,且不影响链路其他业务的下发和接收。链表的节点删除操作为本领域所公知,本文不再赘述。显然,链表本身支持任意节点的删除,而不限于先入先出的按序删除,相比于传统的FIFO机制,减少系统的无效开销,提高了指令管理的灵活性。

可选地,在步骤103之后,如果主机应用层软件需要中止(Abort)的某个磁盘设备的所有I/O指令,则在设备链表中将对应的磁盘设备节点直接删除。例如系统有时会发生某个设备的硬件故障问题,此时命令执行状态机需要Abort整个设备的I/O指令,根据本发明的双链表结构,只需搜索设备链表,将对应的设备直接删除,即可实现整个设备的I/O指令全部Abort。由于当前设备的I/O指令均存储在当前设备下的指令链表中,而指令链表必须由设备链表中对应的设备节点来寻址,因此无需将对应的设备下的指令链表节点逐个删除,相比于传统的FIFO机制,提高了指令管理效率。

需要说明的是,图3所示的用于I/O指令调度的总体硬件架构仅用于说明而非限定本发明的技术方案。本领域技术人员应当理解,在本发明的基础上可以根据实际需要对各个软件和硬件模块的结构关系、指令帧格式,以及指令FIFO的数量、磁盘设备的数量、物理通道的数量等做出任意的调整,而不应将本发明限于上述示例的具体结构和参数。

本发明通过上述方法,优化了磁盘阵列系统中大量I/O指令的并发调度方案,提高整个系统的I/O效率。其优点主要包括如下几方面:

1、由于采用双链表机制进行I/O指令的管理,使系统可以根据实际的运行状态灵活处理I/O的并发度,避免FIFO写满的情况而导致通道经常进入等待调度响应的状态,提高系统的整体I/O性能。

2、由于采用双链表机制进行I/O指令的管理,相对于FIFO机制而言,能够实现不同I/O指令优先级的调度,提高系统的灵活性。

3、由于采用双链表机制,方便了软件执行I/O指令的管理,例如对于Abort等操作可以快速删除目标指令,减少系统的无效开销,提高系统性能,节省功耗。

4、本发明的I/O指令链表采用数据帧链和指令帧链分开的方式,可以灵活实现指令帧与数据帧的不同优先级的派发,同时减少了链表的寻址时间。

根据本发明的另一方面,相应地,提供了一种基于双链表结构的I/O指令管理装置。所述装置具体可由命令执行状态机来实现。其包括:

链表生成模块,用于从内存I/O队列FIFO中读取I/O指令,根据I/O指令的目标磁盘信息生成设备链表,并根据所述I/O指令生成指令链表;

通道选择模块,用于对物理通道进行轮询,选择空闲状态的第一物理通道;

设备选择模块,用于选择所述设备链表中的第一磁盘设备,执行所述第一磁盘设备的发送任务;

指令选择模块,用于选择所述I/O指令链表中的第一I/O指令;

指令下发模块,用于将所选择的第一I/O指令和第一磁盘设备下发至所选择的第一物理通道。

此外,在所述链表生成模块从内存I/O队列FIFO中读取I/O指令之前,主机应用层预先在内存中建立I/O指令队列,并将I/O指令下发到内存的I/O队列;

其中,所述主机应用层在内存(DDR)中开辟第一连续存储空间,作为用于存储I/O指令的I/O队列。优选地,第一存储空间可以存储4~8K条指令,具体根据应用场景而定。此外,所述主机应用层软件还可同时开辟第二连续存储空间,用于存储I/O指令完成状态。第一和第二存储空间均以FIFO机制进行管理。在第一存储空间已准备就绪之后,主机应用层软件将I/O指令下发到位于内存(DDR)中的第一存储空间,即I/O队列FIFO。

在具体实现中,所述命令执行状态机的链表生成模块可初始化一个空的链表(ITCT_List),用于维护与每个磁盘设备相对应的信息。所述设备链表与指令链表相关联。每次从主机内存(DDR)中的I/O队列FIFO中读取I/O指令时,解析I/O指令的目标磁盘信息,将当前目标磁盘设备标识插入设备链表。链表中的节点与目标磁盘设备标识一一对应,即对I/O指令所关联的每个目标磁盘设备标识(下文也称设备编号ICT),在设备链表ITCT_List中仅建立一个节点。链表的新建、插入操作为本领域所公知,本文不再赘述。

如图3所示,所述设备链表与指令链表相关联的具体实现方式为,所述设备链表节点与指令链表的链头相关联。如果在读取某个I/O指令时,当前设备不在设备链表中,则在将当前目标磁盘设备插入设备链表的同时,将当前I/O指令插入当前目标磁盘设备所对应的指令链表中;如果在读取某个I/O指令时,发现当前目标磁盘设备已经在设备链表中,则将所读取的I/O指令挂载到当前磁盘设备下的指令链表中,例如通过链表的插入操作,加入到指令链表的链尾。

与FIFO队列的固定大小不同,本发明采用可变长度的链表结构来存储I/O指令,理论上支持将任意数量的I/O指令插入链表中,并且在没有待派发的指令时,链表可以为空。因此合理高效地利用内存空间,更重要的是可以避免FIFO写满的情况而导致通道经常进入等待调度响应的状态,提高磁盘阵列系统的并发处理性能。

作为进一步示例,命令执行状态机的链表生成模块进一步被配置为,将指令链表划分为2个发送子链表,分别是指令发送子链表和数据发送子链表,当访问到指令发送子链表节点时,表示待发送的下一帧为指令帧,当访问到数据发送子链表节点时,表示待发送的下一帧为写数据帧。采用数据帧链和指令帧链分开的方式,可以根据不同优先级要求,灵活实现指令帧与数据帧的派发,同时减少链表的寻址时间。

利用上述实施例的层次化链表结构,当遍历双链表时,首先定位设备链表的某个目标磁盘设备,接下来对属于该目标磁盘设备的指令链表的链头进行寻址。由于该指令链表所存储的多个I/O指令均以当前磁盘设备为目标,从而间接地定位到指令链表内部的每一个链表节点,包括数据发送子链表节点和指令发送子链表节点,即遍历到与当前磁盘设备相关联的多个待派发的I/O指令。

其中,对于物理通道的轮询,由于宽端口场景下存在多个物理通道PHY,因此命令执行状态机的通道选择模块被配置为,对所有物理通道进行轮询,判断每个通道的忙闲状态,选择策略是尽可能不让发送通道空闲。即如果轮询到当前通道为空闲状态,则通道选择模块将当前通道确定为待传输的第一物理通道。

对于所述第一磁盘设备的选择,实质上是设备链表(ITCT_List)节点的选择,从设备链表ITCT_List中选择一个Device,从而执行这个Device的发送任务。优选地,为在一定程度上保证各个设备并发I/O的均衡,ITCT_List之间的选择策略是RR轮转算法,即命令执行状态机的设备选择模块被配置为沿链表的方向,依次响应各个设备(Device)的发送请求。

类似地,对于所述第一I/O指令的选择,实质上是对I/O指令链表(IOST_List)节点的选择,由于在设备链表ITCT_List内保留了特定设备的数据发送子链表和指令发送子链表的链头,所以在设备选择模块选定设备链表ITCT_List节点之后,能够寻址到I/O指令链表IOST_List的链头,从而使指令选择模块确定待处理的I/O指令。优选地,为实现按序调度,第一I/O指令始终是链头节点的I/O指令。

此外,待处理的I/O指令可被映射到两个子链表之一,以实现数据和指令之间的选择。当某个磁盘设备(Device)的待发送请求I/O指令链表中,既有指令发送请求(指令发送子链表),又有数据发送请求(数据发送子链表)时,命令执行状态机的指令选择模块进一步被配置为,在所述指令发送子链表和数据发送子链表两者之间选择一个进行响应。在具体实施例中,可以依据软件的配置进行优先级的设置,例如在某些特定条件下优先响应指令发送请求,在某些其他条件下优先响应数据发送请求。具体的优先级设置方式可由本领域技术人员根据系统实际状态来制定相应的派发策略。

在Pending命令队列FIFO中,不同的I/O指令采用IPTT(Initiator port transfertag)号进行唯一的标识。而不同的磁盘设备采用磁盘设备编号ICT进行唯一的标识。因此在指令实际派发阶段,命令执行状态机的指令下发模块被配置为将I/O指令编号IPTT、磁盘设备编号ICT以及相关信息下发至所选择的物理通道。

作为优选的实施例,所述命令执行状态机的指令下发模块进一步被配置为,读取被选择的I/O的IOST和ITCT上下文信息,将其下发至选择的通道,便于通道根据上下文信息控制相关指令(Command)的发送属性。

此外,在对所选择的通道进行某个I/O指令的相关发送操作之后,需要根据通道的反馈来决定后续的操作。因此所述命令执行状态机进一步包括指令返回模块,被配置为:

当收到从物理通道返回的指令帧时,如果需要重新派发的I/O指令,则重新加入对应磁盘设备下的I/O指令链表中。

具体地,如果收到从某个通道返回的指令帧,根据指令帧对应的IPTT号获取对应I/O指令的上下文信息,根据当前指令帧的内容执行相应的操作,例如根据返回数据的类型,确定是否将该I/O指令重新加入I/O指令链表,例如插入链尾,等待下一次派发。

例如,在收到SSP写指令的XFER_RDY帧时,确定需要重新派发完成写数据帧的发送。此时,将当前I/O指令的IPTT号重新写入与相关磁盘设备相对应的I/O指令链表。

作为可选的实施例,所述命令执行状态机的链表生成模块进一步配置为,在将当前I/O指令挂载到当前磁盘设备下的指令链表中时,可根据I/O指令的优先级高低,确定将当前I/O指令挂载到所述指令链表的具体位置。例如对于高优先级的I/O指令,可以直接插入I/O指令链表的链头位置,确保下次调度时按预先设定的顺序而优先派发该指令。因此对于任意优先级的I/O指令,链表生成模块都可以根据该指令下一次需要被派发的时间紧急程度,选择在I/O指令链表被插入的位置。通过对不同I/O指令优先级的调度,提高了系统管理指令的灵活性。

作为可选的实施例,在所述命令执行状态机进一步包括指令中止模块,在根据I/O指令的目标磁盘信息生成设备链表,并根据所述I/O指令生成指令链表之后,如果主机应用层软件需要中止(Abort)的某个I/O指令,则所述指令中止模块被配置为,获取目标I/O指令的IPTT号和目标磁盘号,并搜索设备链表,找到对应的目标磁盘号,然后搜索该磁盘设备下的I/O指令链表,找到对应IPTT号的指令,执行摘链操作,即可提前完成I/O指令的Abort操作,且不影响链路其他业务的下发和接收。显然,链表本身支持任意节点的删除,相比于传统的FIFO机制,减少系统的无效开销,提高了指令管理的灵活性。

可选地,在所述命令执行状态机的链表生成模块根据I/O指令的目标磁盘信息生成设备链表,并根据所述I/O指令生成指令链表之后,如果主机应用层软件需要中止(Abort)的某个磁盘设备的所有I/O指令,则所述指令中止模块进一步被配置为,在设备链表中将对应的磁盘设备节点直接删除。例如系统有时会发生某个设备的硬件故障问题,此时需要Abort整个设备的I/O指令,根据本发明的双链表结构,只需搜索设备链表,将对应的设备直接删除,即可实现整个设备的I/O指令全部Abort。由于当前设备的I/O指令均存储在当前设备下的指令链表中,而指令链表必须由设备链表中对应的设备节点来寻址,因此无需将对应的设备下的指令链表节点逐个删除,相比于传统的FIFO机制,提高了指令管理效率。

此外,本领域技术人员可以理解,图3所示的架构示意图并不构成对本发明的磁盘阵列结构的限定,而是可以包括现有技术中更多或更少的部件,或者某些部件的组合。

可以看出,本发明的上述基于双链表结构的I/O指令管理装置相比于现有技术,能够根据实际运行状态灵活处理I/O的并发度,避免FIFO写满的情况而导致通道进入等待调度响应的状态,而且实现I/O指令的不同优先级的调度,减少系统无效开销,灵活地实现指令帧与数据帧的不同优先级派发机制,提高系统的整体灵活性和处理性能。

尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

相关技术
  • 基于双链表结构的I/O指令管理方法及装置
  • 基于指令集体系结构的和自动的加载跟踪的方法和装置
技术分类

06120112438058