具体实施方式
为使本发明的目的和优点更加清楚,下面结合附图和实施例对本发明作进一步的详细说明。
在本发明的缓存管理方法中,将所有地址指针分为若干份,设置这若干份地址指针的释放顺序,即设置哪一份地址指针先被释放,哪一份地址指针后被释放。例如,将所有地址指针分为1024份,随机给每一份地址指针设置编号1、2、......、1024,这些编号就是前文所述的释放顺序,后续地址回收步骤中将按照该编号从小到大或从大到小进行释放。以上对释放顺序的介绍仅为一个具体的举例,并不限定在其他应用场景下按照其他方式确定该释放顺序。
本发明的缓存管理方法包括同时进行的数据包收发步骤和地址回收步骤。
图1为本发明中数据包收发步骤的流程图,该流程包括:
步骤101:接收数据包时,从空闲指针存储队列中除地址回收步骤当前释放地址指针外的其他地址指针中申请地址指针。
步骤102:发送数据包或解析数据包出错时,将为数据包申请的地址指针释放到空闲指针存储队列中。
图2为本发明中地址回收步骤的流程图,该流程包括:
步骤201:启动第一定时器,所述第一定时器的定时周期包含若干个时长为数据缓存时间的时间段。
本步骤中,数据缓存时间为数据包在缓存管理***中的最大缓存时间,即地址指针从被申请出去到释放回来的最大时间。
步骤202:在所述第一定时器的每个定时周期中除第一个时间段外的一个时间段内,按照设定的释放顺序将一份地址指针中当前未包含在空闲指针存储队列中的地址指针释放到空闲指针存储队列中。
本步骤中,在第一定时器的不同定时周期中,释放地址指针的时间段可以不同,只要满足不是第一个时间段这一条件即可。例如,在第一定时周期中的第三个时间段释放一份地址指针,在第二定时周期的最后一个时间段释放一份地址指针。
在图1和图2所示的流程中,假设一种应用场景,即在地址回收步骤中,在第一个定时周期的第二个时间段内释放的一份地址指针中包括地址指针2,3和4,且在释放开始时刻,地址指针4已在空闲指针存储队列中。
一方面,如果在第一定时器的第一个定时周期开始时地址指针4被正常申请,由于第一定时周期中的每个时间段的时长都等于数据缓存时间,所以在第二个时间段开始时,地址指针4肯定已被正常释放,因此在第二个时间段内释放这一份地址指针,可以避免地址指针4被正常申请但对应数据包还没有发送或还没有解析完时,将地址指针4在地址回收步骤中释放。
另一方面,如果在第一定时器的第一个定时周期中,第二个时间段开始时,释放地址指针2、并在数据包收发步骤中为新收到的数据包申请地址指针4,由于从地址指针4被申请到该第二时间段结束,时长小于数据缓存时间,所以会导致在第二时间段结束时地址指针4也不会在数据包收发步骤中被正常释放到空闲指针存储队列中,这就导致在地址回收步骤中在第二时间段内将地址指针4释放到空闲指针存储队列中,而此时申请地址指针4的数据包可能还没有发送或还没有解析完时。可见,为解决这一问题,在数据包收发步骤中,应该避免在当前地址回收步骤中释放的地址指针中为数据包申 请地址指针。
可见,在本发明的缓存管理方法中,在执行数据包收发步骤的同时,还启动了地址回收步骤,在地址回收步骤中的每个定时周期内,将一份地址指针中当前未包含在空闲指针存储队列中的地址指针释放到空闲指针存储队列中,这样既能在几个定时周期后遍历所有地址指针,从而及时回收一些被申请但长时间未释放的地址指针,即解决地址泄露的问题,另一方面,由于地址回收步骤中每次释放的只是一份地址指针,不会影响数据包收发步骤的正常执行。
下面给出本发明方法的一个实施例。
设置第一定时器,第一定时器的定时周期为T1=n×t,其中t为数据缓存时间,n为大于2的整数。第一定时器的定时时长为1024×T1。
将所有地址指针分为1024等份,每一等份中包括连续的地址指针。
按照上述具体设置,本实施例中的数据包收发步骤和地址回收步骤可以按照图1和图2所示执行。
进一步,考虑到某些时候,可能出现某个地址指针在数据包收发步骤中被申请两次或被释放两次等地址指针出现异常错误的情况,在地址回收步骤中检测到地址指针的异常错误时,执行流程与图2所示的稍有不同。
进一步设置第二定时器,第二定时器的定时周期为T1=m×t,其中t为数据缓存时间,m为大于等于2且小于n的整数,作为一种较佳的实施方式,m可以取尽量小的值,例如m取2。第二定时器的定时时长为1024×T2。
图3为本发明实施例中检测到地址指针的异常错误时的地址回收流程图,该流程包括:
步骤301:当检测到地址指针的异常错误时,停止第一定时器、并启动第二定时器。
本步骤中,地址指针的异常错误包括以下三种情况:
第一、地址指针在数据包收发步骤中被申请两次;
第二、地址指针在数据包收发步骤中被释放两次;
第三、在数据包收发步骤中被申请的地址指针与被释放的地址指针的总和,与地址指针的总数不相等。
针对上述第一种和第二种情况,本实施例中设置一个标志表,该标志表中包括每个地址指针的状态指示位,当某个地址指针对应的状态指示位中为1时,代表该地址指针为空闲地址指针,为0时,代表该地址指针已被申请。基于该标志表,在数据包收发步骤中,当为接收到的数据包申请地址指针时,从空闲指针存储队列中除地址回收步骤当前释放地址指针外的其他地址指针中选择一个地址指针,根据标志表检测选择出的地址指针的状态指示位中是否为1,如果是则正常申请,否则将该地址指针从空闲指针存储队列中读出丢弃,并确定当前检测到地址指针的异常错误。同样的,当发送数据包或解析数据包出错时释放地址指针之前,需检查标志表中该数据包对应的地址指针的状态指示位中是否为0,如果是则正常释放,同时把该地址指针的状态指示位置为1,否则不释放该地址指针,并确定当前检测到地址指针的异常错误。
针对上述第三种情况,设置两个计数器,一个对数据包收发步骤中被申请的地址指针数进行计数,一个对数据包收发步骤中被释放的地址指针数进行计数,如果检测这两个计数器的计数之和与地址指针的总数不相等,则确定当前检测到地址指针的异常错误。
如果在本步骤中检测到地址指针的异常错误,则说明需要及时处理已发生的这些异常错误,此时停止第一定时器并启动第二定时器,即在后续步骤中,需基于第二定时器的定时周期执行地址回收的步骤,这样可以更快的回收一次地址指针。
步骤302:在第二定时器的每个定时周期中的最后一个时间段,按照设定的释放顺序将1/1024份地址指针释放到空闲指针存储队列中。
步骤303:当遍历所有地址指针后,停止第二定时器、并重新启动第一定时器。
本步骤中,重新启动第一定时器后,重新开始基于第一定时器的定时周 期的地址回收步骤。重新开始后,可以按照设定的释放顺序,从第一份地址指针开始回收,也可以接着第一定时器暂停时的那一份地址指针继续执行回收,本发明中对这里不作限定。
图4为本发明中的缓存管理***的结构示意图,该***包括:包发送模块41、包接收模块42、地址释放单元43、地址申请单元44、第一定时器45、地址回收单元46、空闲指针单元47和报文信息队列48。
上述地址申请单元44,用于针对包接收模块42接收的数据包,从所述空闲指针单元47中除地址回收单元46当前释放的地址指针外的其他地址指针中申请地址指针。
上述地址释放单元43,用于在包发送模块41发送数据包或包接收模块解析数据包错误后,将地址申请单元44为该数据包申请的地址指针释放到空闲指针单元47中。
上述第一定时器45,用于执行定时,定时周期包含若干个时长为数据缓存时间的时间段。
上述地址回收单元46,用于在所述第一定时器45的每个定时周期中除第一个时间段外的一个时间段内,按照设定的释放顺序将一份地址指针中当前未包含在空闲指针单元47中的地址指针释放到空闲指针单元47中。
可见,在本发明的缓存管理***中,在包发送模块41、包接收模块42、地址申请单元44和地址释放单元43执行数据包收发步骤的同时,还有地址回收单元46执行地址回收步骤,在地址回收步骤中的每个定时周期内,将一份地址指针中当前未包含在空闲指针单元47中的地址指针释放到空闲指针单元47中,这样既能在几个定时周期后遍历所有地址指针,从而及时回收一些被申请但长时间未释放的地址指针,即解决地址泄露的问题,另一方面,由于地址回收步骤中每次释放的只是一份地址指针,不会影响数据包收发步骤的正常执行。
下面给出本发明***的一个实施例。
图5为本发明实施例中缓存管理***的结构示意图。
如图5所示,考虑到地址指针的异常错误,该装置中还包括一个第二定时器49,用于执行定时,定时周期小于第一定时器的定时周期、且包含若干个时长为数据缓存时间的时间段。
在此基础上,地址回收单元46包括:检测子单元461、第一回收子单元462和第二回收子单元463。
上述检测子单元461,用于在检测到地址指针的异常错误时,触发第一定时器45停止、并触发第二定时器49启动。
上述第一回收子单元462,用于在第一定时器45的每个定时周期中除第一个时间段外的一个时间段内,按照设定的释放顺序将一份地址指针中当前未包含在空闲指针单元47中的地址指针释放到空闲指针单元47中。
上述第二回收子单元463,用于在第二定时器49的每个定时周期中除第一个时间段外的一个时间段内,按照设定的释放顺序将一份地址指针中当前未包含在空闲指针单元47中的地址指针释放到空闲指针单元47中,直至针对每份地址指针都执行过一次释放,触发所述第二定时器49停止、并触发所述第一定时器45重新启动。
针对方法实施例中所介绍的第三种地址指针的异常错误,为了实现上述检测子单元461的检测功能,该装置中还包括:对地址申请单元申请的地址指针进行计数的第一计数器51、和对地址释放单元释放的地址指针数进行计数的第二计数器52。
上述检测子单元461检测所述第一计数器51和第二计数器52的计数之和是否与地址指针的总数相等,如果不是确认检测到地址指针的异常错误。
针对方法实施例中所介绍的第一种和第二种地址指针的异常错误,为了实现上述检测子单元461的检测功能,上述空闲指针单元47中还存储有包括每个地址指针的状态指示位的标志表。
上述检测子单元461接收所述地址申请单元44或地址释放单元43的上报,确定检测到地址指针的异常错误。
上述地址申请单元44在申请地址指针时,从所述空闲指针单元中除地址回收单元当前释放地址指针外的其他地址指针中选择一个地址指针,根据所述标志表检测选择出的地址指针是否已被申请,如果是,则将该地址指针从空闲指针单元47中读出丢弃、并上报地址指针出现异常错误。
上述地址释放单元43在释放地址指针之前,根据所述标志表检测包发送模块41发送数据包或包接收模块42解析错误的数据包对应的地址指针是否已被释放,如果是,则不释放该地址指针、并上报地址指针出现异常错误。
本发明中的缓存管理***也可以基于地址指针链表实现。
图6为本发明中基于地址指针链表的缓存管理***的结构示意图,该***包括缓存空间(BUFFER)61、包接收模块(INPUT)42、包发送模块(OUTPUT)41、报文信息队列48及缓存管理装置(BUFFER MANAGER)62。
缓存空间61被划分成多个缓存块。
包接收模块42针对每一个接收数据包,向缓存管理装置62申请空闲缓存块的地址指针,并在对该接收数据包成功解析后,依据申请到的地址指针,将该接收数据包以块为单位存到对应的各缓存块。
包接收模块42还将在对接收数据包成功解析后,将为该接收数据包包头申请到的地址指针及该接收数据包对应的缓存块数发送到报文信息队列48中存储。
包发送模块41根据报文信息队列48中的存储的信息,向缓存管理装置62查询待发送数据包对应的各缓存块的地址指针,并依据查询到的地址指针依次从对应缓存块中读出完整的数据包并发送。
对同一数据包来说,其内部的连续数据并不是存储在连续的缓存块中,因此缓存管理装置62中还需维护一个地址指针链表,用来记录每一个已申请的地址指针的下一个地址指针,这样缓存管理装置62才能够连续查询到同一数据包的连续数据。
在包接收模块42对接收数据包解析错误后、或者包发送模块41发送完整数据包后,缓存管理装置62将释放数据包所对应的各缓存块的地址指针。
图7为图6中的缓存管理装置的逻辑结构示意图,该缓存管理装置包括:空闲指针单元47、地址申请单元(Request)44、第一地址释放信息存储单元71、链表信息单元73、链表建立单元(UpBuild)74、链表查询单元(LookUp)75、地址释放信息存储单元72、地址释放单元(Release)43和地址回收单元46。
地址回收单元46的功能与前文中介绍的相同,这里不再赘述。
空闲指针单元47,即图7中所示的空闲指针存储队列PTRQ,为一宽度为地址指针深度、深度为BUFFER中所有缓存块总数的先进先出存储器(FIFO),内部记录BUFFER中空闲缓存块的空闲地址指针,图8为PTRQ记录的空闲地址指针队列的一个实例。初始化时,BUFFER中所有缓存块均为空闲,相应地,所有地址指针均作为空闲地址指针记录于PTRQ中。
地址申请单元44在包接收模块42开始解析接收数据包时,从PTRQ中记录的空闲地址指针中依次为接收数据包中的每一块连续数据块申请对应的缓存块的地址指针。
地址释放信息存储单元72,即图7中所示的包发送模块41地址释放信息队列RLSQ0,其为一宽度为地址指针深度的FIFO,包发送模块41在读取并发送完整数据包后,将该发送数据包的地址信息记录在RLSQ0中,该地址信息包括发送数据包包头的地址指针、及发送数据包所占用的缓存块数量。
第一地址释放信息存储单元71,即图7中所示的包接收模块42地址释放信息队列RLSQ1,其为一宽度为地址指针深度的FIFO,包接收模块42在解析接收数据包时,只有解析至包尾才能获知该接收数据包是否有错误,如果错误,则由于该接收数据包中的所有连续数据块均已被申请了对应缓存块的地址指针,因此,包接收模块42将解析错误的接收包数据已申请的地址信息记录在RLSQ1中,该地址信息包括解析错误的接收数据包包头的地址指针、及该接收数据包所占用的缓存块数量。
链表信息单元73为一宽度为指针深度、深度为BUFFER中所有缓存块总数的随机存储器(RAM),图7中将该RAM示为ADDR_LINK_RAM, 记录已申请地址指针的下一个地址指针,图9中按照如图8中所示的地址指针排列顺序,示出了ADD_LINK_RAM所记录的已申请地址指针的下一个地址指针的实例。
链表建立单元74将当前申请的地址指针写入至上一个申请的地址指针在ADD_LINK_RAM中对应的位置,用以表示当前申请的地址指针,为上一个申请的地址指针的下一个地址指针。
链表查询单元75在包发送模块41从BUFFER中读取同一数据包中每一连续数据块之前,依次查找ADD_LINK_RAM中对应的已申请地址指针的下一个地址指针,使得包发送模块41可以从BUFFER中的对应缓存块读取数据包。
地址释放单元43将RLSQ0和RLSQ1中记录的地址信息所表示的地址指针均释放到PTRQ中。但由于RLSQ0和RLSQ1中记录的地址信息仅包括包头的地址指针、以及数据块占用的缓存块数量,所以除了数据包包头的地址指针可以直接释放之外,其余的数据块对应的缓存块的地址指针均需通过链表查询单元在ADD_LINK_RAM中依次查找。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。