一种缓冲区管理方法及系统
技术领域
本发明涉及通信、电子领域中的缓冲区管理系统,尤其涉及一种具有老化功能的可以防止缓冲区泄漏的缓冲区管理方法及系统。
背景技术
通信和计算机领域中,经常需要用一大块快速读写存储器(memory)用来暂存接收到的数据、等待处理的数据、以及等待发送出去的数据。这一大块存储器在逻辑上被分割为很多小块。这些小块被称为缓冲区(buffer)。对这些缓冲区进行有效地管理及具体实现的实体,称为缓冲区管理器(buffer manager)。缓冲区管理器完成的主要功能有:外部有缓冲区申请请求时,根据分配策略进行答复,分配具体的缓冲区或者拒绝分配缓冲区;外部有缓冲区释放请求时,响应释放请求,将待释放的缓冲区列入空闲缓冲区池供以后分配使用。
比较通用的缓冲区管理器有堆栈式(stack)管理器和先进先出式(First In FirstOut,FIFO)管理器。和本发明相关的是堆栈式缓冲区管理器。
堆栈式缓冲区管理器的实现如附图1所示。包括控制逻辑实体101、堆栈指针102、空闲缓冲区堆栈103三个部分。索引图105是为了表示方便,物理上并不存在;大容量存储器104是缓冲区管理器所要管理的对象,将这一块存储器分成n个小块缓冲区,每个缓冲区用一个索引(index)来寻址,索引和缓冲区一一对应。空闲缓冲区堆栈中保存的是空闲缓冲区的索引,初始状态下,堆栈是满的,所有的索引都在堆栈中,堆栈指针指向堆栈地址addr0。工作原理为:若外部有向控制逻辑实体申请缓冲区的请求,如果允许分配缓冲区,则控制逻辑实体将堆栈指针指向的索引分配给申请源,同时将堆栈指针下移一步(出栈操作,POP);如果外部请求控制逻辑实体释放缓冲区,则控制逻辑实体将堆栈指 针上移一步,并将需要释放的缓冲区索引写入堆栈(入栈操作,PUSH)。经过多次的出栈、入栈操作后,堆栈中的索引排列是无序的,例如图2中空闲缓冲区堆栈所示,这是正常现象。缓冲区管理器和缓冲区使用者的交互信号有:缓冲区使用者分配缓冲区请求信号、缓冲区管理器分配应答信号、分配给缓冲区使用者的缓冲区索引、缓冲区使用者请求释放缓冲区请求信号、缓冲区使用者请求释放的缓冲区索引、缓冲区管理器释放应答信号。
现有的堆栈式缓冲区管理器,分配缓冲区时直接执行出栈操作,释放缓冲区时执行入栈操作。外部缓冲区使用模块必须维护自己使用的缓冲区索引。如果外部缓冲区使用模块维护缓冲区索引出错,申请释放缓冲区时,给出了错误的缓冲区索引,或者对同一缓冲区索引连续释放多次,就会引起空闲缓冲区堆栈内的索引混乱。如附图3所示:假设堆栈指针原本指向addr3,addr3中存放的索引是index3(图3中303);这时候如果有外部请求释放一个索引为index3的缓冲区,执行入栈操作,索引index3会被再次写入堆栈,堆栈指针指向addr2(图3中304)。而根据上文所述,堆栈中的索引表示空闲缓冲区,堆栈中存在重复的索引,当有外部模块申请分配缓冲区时,缓冲区管理器就有可能把相同的一块缓冲区index3同时分配给不同的外部模块使用,造成冲突。这样的后果是很严重的,如果用在数据通信中,轻则会有丢包现象,重则数据转发完全混乱,业务中断。而缓冲区管理器无法检测到这种情况的发生,也无法从这种混乱状态中恢复正常。
为了解决缓冲区堆栈内的索引出现混乱,在缓冲区管理器中引入了缓冲区信息记录器,在分配缓冲区的时候向缓冲区信息记录器写入该缓冲区已经被分配的标识,在释放缓冲区的时候,首先通过读取缓冲区信息记录器中的缓冲区分配标识判断该缓冲区是否已经被分配出去,只释放已经被分配出去的缓冲区,对于申请释放未分配的缓冲区的操作不执行缓冲区索引压入空闲缓冲区堆栈的操作,有效的避免了空闲缓冲区堆栈内的索引出现混乱情况的发生。但是,通过增加缓冲区信息记录器,只能保证空闲缓冲区堆栈内的索引不会混乱。当外部缓冲区使用模块维护缓冲区索引出现错误时,已经被分配的缓冲区就不能被 释放,就会导致缓冲区泄漏情况发生。
发明内容
有鉴于此,本发明的主要目的在于提供一种缓冲区管理方法,用于解决缓冲区泄露的技术问题,为达到上述目的,本发明的技术方案是这样实现的:
一种缓冲区管理方法,其特征在于,
A、根据用户请求分配缓冲区的请求为用户分配缓冲区,并记录缓冲区分配的时间;
B、根据缓冲区信息记录器中记录的缓冲区被分配的时刻判断该缓冲区被分配的时间是否超过了老化定时周期,若未超过老化定时周期则不做处理,若超过了老化定时周期则进一步判断该缓冲区的老化标识是否为老化状态,若为老化状态则释放该缓冲区;若为新分配状态则将该缓冲区标记为老化状态;
C、根据用户请求释放缓冲区的请求,释放标识为已被分配的缓冲区。
进一步地,步骤A具体为:
A1、接收到用户请求分配缓冲区的请求后,获取当前堆栈指针指向的缓冲区索引;
A2、在缓冲区信息记录器中标识当前堆栈指针指向的缓冲区索引对应的缓冲区已被分配、记录该缓冲区被分配的时间、标识缓冲区老化标记为新分配状态;
A3、执行空闲缓冲区堆栈出栈操作并向用户反馈分配结果。
进一步地,步骤C具体为:
判断用户请求释放的缓冲区是否为已被分配的缓冲区,若是则将缓冲区信息记录器中该缓冲区的已分配标识修改为未分配状态并对该缓冲区执行入栈操作,向用户反馈缓冲区释放操作结果;若请求释放的缓冲区为空闲状态则直接 向用户反馈缓冲区释放操作结果。
本发明的另一目的在于提供一种缓冲区管理系统,为达到上述目的,本发明的技术方案是这样实现的:
一种缓冲区管理系统,包括控制逻辑实体、堆栈指针、空闲缓冲区堆栈、缓冲区信息记录器及缓冲区老化模块。缓冲区老化模块,用于定时逐一判断已被分配的缓冲区是否长时间没有释放,若是则通知控制逻辑实体执行回收操作;
所述缓冲区信息记录器中还包括已分配标识、缓冲区被分配的时间及缓冲区老化标记,所述缓冲区老化模块根据所述缓冲区被分配的时间及缓冲区老化标记判断已被分配的缓冲区是否长时间没有释放;
所述控制逻辑实体根据缓冲区信息记录器中记录的缓冲区被分配的时刻判断该缓冲区被分配的时间是否超过了老化定时周期,若未超过老化定时周期则不做处理,若超过了老化定时周期则继续判断该缓冲区老化标记是否为老化状态,若为老化状态则释放该缓冲区,否则将该缓冲区的老化标记设置为老化状态。
进一步地,在接收到用户请求分配缓冲区的的请求后,由控制逻辑实体执行缓冲区的出栈操作,并在所述缓冲区信息记录器中记录当前被分配的缓冲区的被分配时间、标识该缓冲区的老化标识为新分配状态、向用户反馈缓冲区分配结果。
进一步地,控制逻辑实体接收到用户的释放请求后,根据缓冲区信息记录器中的已分配标识判断用户请求释放的缓冲区是否为已被分配的缓冲区,若是则将缓冲区信息记录器中该缓冲区的已分配标识修改为未分配状态并控制堆栈指针及空闲缓冲区堆栈执行入栈操作;否则不执行入栈操作;然后向用户反馈缓冲区释放操作结果。
通过本发明公开的上述系统结构和操作方法,在分配缓冲区的时候,在对应的信息记录器条目中记录下该缓冲区已经被分配;在释放缓冲区的时候,首先要查询待释放的缓冲区的信息,如果该缓冲区是已经被分配出去的缓冲区, 下一步可以释放该缓冲区,将该缓冲区索引压入空闲缓冲区堆栈。如果该缓冲区是空闲缓冲区,说明外部出现了错误,给出了错误的缓冲区索引或连续多次企图释放同一缓冲区,为了避免空闲缓冲区堆栈中会存在重复的索引,拒绝将这个缓冲区索引压入空闲缓冲区堆栈,直接向缓冲区使用者给出释放缓冲区应答信号。对于这些出错的缓冲区索引,通过引入了缓冲区老化机制,避免了缓冲区泄漏的发生,提高了缓冲区管理器的健壮性,可靠性。
图1为传统的堆栈式缓冲区管理器系统结构示意图;
图2为经过一段时间的分配释放后,传统空闲缓冲区堆栈中的内容;
图3为释放出错后,传统空闲缓冲区堆栈中的内容;
附图说明
图4为本发明改进后的堆栈式缓冲区管理器系统结构示意图;
图5为本发明缓冲区分配流程图;
图6为本发明缓冲区释放流程图;
图7为本发明缓冲区老化流程图。
为使本发明的目的、技术方案和优点更加清楚明白,以下举实施例并参照附图,对本发明进一步详细说明。
本发明公开的可靠的缓冲区管理器系统如附图4中,包含五个组成部分:控制逻辑实体401、堆栈指针402、空闲缓冲区堆栈403、缓冲区信息记录器404、缓冲区老化模块407。存储器405是被管理的对象,存储器划分成很多小块缓冲区,每个缓冲区用一个索引index来表示。索引图406物理上不存在,是为了理解方便,用来说明缓冲区索引和缓冲区与缓冲区信息记录器条目之间的一一对应关系。在缓冲区信息记录器中为每个索引创建一个条目info,每个条目和索引一一对应,如index0对应info0、index1对应info1、index2对应info2、依次类推。
具体实施方式
本发明与传统缓冲区管理器相比,增加了缓冲区老化模块,并对缓冲区信息记录器记录的信息进行了扩充,增加了缓冲区分配的时间信息以及老化标记。缓冲区信息记录器的每一个记录条目分别和一块缓冲区一一对应。缓冲区信息记录器用来记录每一块缓冲区的相关信息,包括该缓冲区是处于空闲状态还是正在被使用中,该缓冲区被分配的时间,该缓冲区是否被老化的标记。为了防止缓冲区被错误老化,在缓冲区记录器中设置了缓冲区老化标记,使用方法例如:当该标记为表示新分配状态值1时表示该缓冲区刚被分配,当该标记为老化状态值0时表示该缓冲区已经长时间没有被使用过。当设置的用于定时执行缓冲区老化检测的定时器的老化定时周期到时,控制逻辑实体就逐条扫描缓冲区信息记录器,判断已经被分配出去的缓冲区的分配时间是否超过老化定时周期,如果是就将缓冲区老化标记为新分配状态1的置为老化状态0,不进行缓冲区的回收;否则将缓冲区老化标记为老化状态0的进行缓冲区的回收操作。
图5为本发明缓冲区分配步骤流程图,具体步骤如下:
501,缓冲区管理器收到缓冲区使用者的分配请求后,由控制逻辑实体访问堆栈指针,查找当前堆栈指针指向的缓冲区索引;
502,控制逻辑实体从堆栈指针指向的空闲缓冲区堆栈记录中读取缓冲区索引,并在缓冲区信息记录器中该索引对应的条目中记录分配的相关信息;
分配的相关信息包括:该缓冲区被分配的状态、缓冲区被分配的时刻、缓冲区使用者、缓冲区老化标记等信息,该步骤中将缓冲区老化标记置为新分配状态1,表示该缓冲区为新分配的缓冲区;
503,在控制逻辑实体的控制下,空闲缓冲区堆栈执行出栈操作,堆栈指针下移一步;
504,控制逻辑实体将该缓冲区索引通知给发起本次请求的缓冲区使用者,并给出缓冲区分配应答信号,分配缓冲区操作结束。
图6为本发明缓冲区释放缓步骤流程图,具体步骤如下:
601,控制逻辑实体收到缓冲区使用者的释放请求后,记录下该使用者企图释放的缓冲区索引;
602,查找缓冲区信息记录器中该缓冲区索引对应的条目,读取条目中记录的缓冲区信息;
603,控制逻辑实体根据读取到的缓冲区信息进行判断;该缓冲区是否为空闲缓冲区,若是则执行步骤605;否则执行步骤604;
604,如果缓冲区信息表明此缓冲区是非空闲缓冲区,及被分配出去的缓冲区,则改写缓冲区信息,将该缓冲区的已分配标识设置为未分配状态,以及将缓冲区被分配的时间、老化标记都置空,表明该缓冲区已经被释放,控制逻辑实体将缓冲区索引压入空闲缓冲区堆栈,执行入栈操作,堆栈指针上移一步;转到606;
605,如果缓冲区信息表明此缓冲区是空闲缓冲区,没有被使用,则一定是外部使用者维护索引出错了,控制逻辑实体不进行压栈操作,堆栈指针也不变;
606,控制逻辑实体向使用者反馈缓冲区释放操作结果,释放缓冲区操作结束。
图7为本发明缓冲区老化处理流程图,具体步骤如下:
701,缓冲区老化模块从缓冲区信息记录器中读取一条为处理的条目;
缓冲区老化模块启动一老化定时器,该定时器的定时周期设置为老化定时周期,当缓冲区老化定时周期到时,缓冲区老化模块开始逐一读取缓冲区信息记录器中的条目,需要说明的是,缓冲区老化模块只读取已经被分配出去的缓冲区对应的条目,对未被分配的条目不做处理,缓冲区老化模块将根据读取的条目信息判断对应的缓冲区是否达到老化要求,然后对于已经老化,达到回收时间条件的缓冲区执行回收操作。
702,根据读取到的缓冲区信息进行判断,判断分配出去的时间是否超过了老化定时周期,如果是则执行步骤703;否则执行步骤701;
如果未超过老化定时周期,则不对该条目对应的缓冲区进行处理,返回处理下一条目。
703,在超过老化定时周期的情况下,判断对应缓冲区老化标记是否为老化状态0;若是则执行步骤704;否则执行步骤705;
704,将该条目对应的缓冲区释放;然后执行步骤706;
705,将该条目中的缓冲区老化标记修改为老化状态0,并重新写入缓冲区信息记录器中;
706,判断是否处理完缓冲区信息记录器中的所有条目,若是则结束该轮操作,等待下一个老化定时周期到达;否则执行步骤701。
缓冲区管理器可以服务多个缓冲区使用者,使用者需要使用缓冲区时向缓冲区管理器申请分配,使用完缓冲区后向缓冲区管理器申请释放该缓冲区,回收供以后使用。控制逻辑实体部分根据外部的分配或者释放请求,根据优先级策略仲裁,选择处理某一个申请源的请求,然后访问堆栈指针、空闲缓冲区堆栈、缓冲区信息记录器,根据本发明公开的方法步骤进行处理,以下给出一实施例来模拟实际的运行过程:
C1,初始时,堆栈指针指向addr0,外部缓冲区使用者申请分配缓冲区时,地址addr0中的索引是index0,index0对应的缓冲区信息记录器条目是info0,往info0写入标志1,表示index0缓冲区已经被分配使用,并记录该缓冲区分配的时间信息,堆栈指针下移一步,指向addr1,然后把index0及缓冲区分配应答信号一起送给缓冲区使用者,分配缓冲区结束;
C2,缓冲区使用者申请分配缓冲区,addr1中的索引是index1,index1对应的缓冲区信息记录器条目是info1,往info1写入标志1,并记录该缓冲区分配的时间信息,堆栈指针下移一步,指向addr2,然后把index1及缓冲区分配应答信号一起送给缓冲区使用者,分配缓冲区结束;
C3,缓冲区使用者请求释放缓冲区index0,读取缓冲区信息记录器info0中的标志,标志是1,表明该缓冲区已经被分配使用,可以释放,改写标志,将标志写为0,表明该缓冲区将被释放,转为空闲状态。将堆栈指针上移一步,指向addr1,将index0写入堆栈中addr1处,给出释放缓冲区应答信号,释放缓冲区结束;
C4,缓冲区使用者请求释放缓冲区index0,读取缓冲区信息记录器info0条目。由于C3步骤时,info0已经被写为0,表示该缓冲区已经是空闲缓冲区, 企图释放一个空闲缓冲区是错误的,不把缓冲区索引入栈,堆栈指针不变。直接给出释放缓冲区应答信号,释放缓冲区结束。
C5,老化定时时间到,扫描缓冲区信息记录器,缓冲区信息记录器中记录的时间信息进行判断,对于已经被分配出去的缓冲区,如果缓冲区被分配的时间超过了老化定时周期,即达到了老化要求,则判断缓冲区老化标记,如果为1,将其置0重新写入该条缓冲区信息记录器,如果为0,则将该缓冲区释放。如果未达到老化要求或者该缓冲区未分配出去,则不对该条缓冲区信息记录器进行操作
在C4步骤中,可以成功地检测到了外部释放缓冲区操作的错误,拒绝执行会引起空闲缓冲区堆栈混乱的操作,直接给出释放应答信号;步骤C5采用本发明的缓冲区管理器可以将错误分配的缓冲区再利用,避免了缓冲区泄漏,大大提高了缓冲区管理器的健壮性、可靠性。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。