一种堆栈式缓冲区管理方法
技术领域
本发明涉及计算机和通讯领域,具体涉及一种堆栈式缓冲区管理方法。
背景技术
通信和计算机领域中,经常需要用一大块快速读写存储器memory用来暂存接收到的数据、等待处理的数据、以及等待发送出去的数据。这一大块存储器在逻辑上被分割为很多小块。这些小块被称为缓冲区buffer。对这些缓冲区进行有效地管理的机制及其具体实现,称为缓冲区管理器buffer manager。缓冲区管理器完成的主要功能有:外部有缓冲区申请请求时,根据分配策略进行答复,分配具体的缓冲区或者拒绝分配缓冲区;外部有缓冲区释放请求时,响应释放请求,将待释放的缓冲区列入空闲缓冲区池供以后分配使用。
比较通用的缓冲区管理器有堆栈式stack管理器和先进先出式First InFirst Out管理器,简称FIFO管理器。和本发明相关的是堆栈式stack缓冲区管理器。
堆栈式缓冲区管理器3的实现如附图1所示。包括控制逻辑101、堆栈指针102、空闲缓冲区堆栈103三个部分。索引图105是为了表示方便,物理上并不存在;大容量存储器104是缓冲区管理器所要管理的对象。将这一块存储器分成n个小块缓冲区,每个缓冲区用一个索引index来寻址,索引和缓冲区一一对应。空闲缓冲区堆栈中保存的是空闲缓冲区的索引,初始状态下,堆栈是满的,所有的索引都在堆栈中,堆栈指针指向堆栈地址addr0。工作原理为:①出栈操作POP:外部有申请缓冲区的请求后,如果允许分配缓冲区,则将堆栈指针指向的索引分配给申请源,同时将堆栈指针下移一步;②入栈操作PUSH:如果外部要求释放缓冲区,则将堆栈指针上移一步,并将需要释放的缓冲区索引写入堆栈。经过多次的出栈,入栈操作后,如图2中所示,空闲缓冲区堆栈103中的索引排列是无序的。缓冲区管理器3和缓冲区使用者的交互信号有:缓冲区使用者分配缓冲区请求信号、缓冲区管理器分配应答信号、分配给缓冲区使用者的缓冲区索引、缓冲区使用者请求释放缓冲区请求信号、缓冲区使用者请求释放的缓冲区索引、缓冲区管理器释放应答信号。
现有的堆栈式缓冲区管理器,分配缓冲区时直接执行压栈操作,释放缓冲区时执行入栈操作。外部缓冲区使用模块必须维护自己使用的缓冲区索引。如果外部缓冲区使用模块维护缓冲区索引出错,申请释放缓冲区时,给出了错误的缓冲区索引,或者对同一缓冲区索引连续释放多次,就会引起空闲缓冲区堆栈内的索引混乱。如附图3所示:假设空闲缓冲区堆栈103初始指针301原本指向addr3,addr3中存放的索引是index3;这时候如果有外部请求释放一个索引为index3的缓冲区,执行入栈操作,索引index3会被再次写入堆栈,堆栈目前指针302指向addr2。而根据上文所述,堆栈中的索引表示空闲缓冲区,堆栈中存在重复的索引,当有外部模块申请分配缓冲区时,缓冲区管理器就有可能把相同的一块缓冲区索引index3同时分配给不同的外部模块使用,造成冲突。这样的后果是很严重的,如果用在数据通信中,轻则会有丢包现象,重则数据转发完全混乱,业务中断。而目前的缓冲区管理器无法检测到这种情况的发生,也无法从这种混乱状态中恢复正常。
发明内容
本发明需要解决的技术问题是提供一种堆栈式缓冲区管理方法,能够避免一个缓冲区同时被多个外部模块使用。
本发明的上述技术问题这样解决,提供一种堆栈式缓冲区管理方法,在空闲缓冲区堆栈中保存空闲缓冲区的索引,当释放缓冲区,并利用空闲缓冲区堆栈进行缓冲区索引的PUSH操作时,如果被释放缓冲区的索引对应的缓冲区信息为已使用,则允许将所述索引写入空闲缓冲区堆栈,如果被释放缓冲区的索引对应的缓冲区信息为未使用,则拒绝将所述索引写入空闲缓冲堆栈;当分配缓冲区,并利用空闲缓冲区堆栈(103)进行缓冲区索引的POP操作时,将当前指针(102)指向的索引对应的缓冲区分配给申请者并将该索引对应的缓冲区信息修改为已使用。
按照本发明提供的管理方法,进行PUSH操作时还包括根据被释放缓冲区的索引存在于空闲缓冲堆栈中空闲索引集合内与否判断该被释放缓冲区的索引对应的缓冲区信息为为使用或已使用。
按照本发明提供的管理方法,使用缓冲区使用信息表记录被管理所有缓冲区的索引及其对应已使用或未使用标记,进行PUSH操作时还包括根据被释放缓冲区的索引在所述缓冲区使用信息表内的对应记录判断该被释放缓冲区的索引为已使用或未使用。
按照本发明提供的管理方法,使用缓冲区使用信息表记录所有已使用缓冲区的索引,进行PUSH操作时还包括根据被释放缓冲区的索引是否存在于所述缓冲区使用信息表来判断该被释放缓冲区的索引为已使用或未使用。
按照本发明提供的管理方法,进行PUSH操作时还包括根据允许被释放索引写入空闲缓冲堆栈修改或删除所述缓冲区使用信息表中对应记录。
按照本发明提供的管理方法,该管理方法还包括初始化所述缓冲区使用信息表,记录被管理所有缓冲区的索引并全部初始化为未使用标记。
按照本发明提供的管理方法,该管理方法包括初始化所述缓冲区使用信息表为空。
按照本发明提供的管理方法,该管理方法还包括进行POP操作时,在所述缓冲区使用信息表增加该索引的记录。
本发明提供的一种堆栈式缓冲区管理方法,根据被释放索引使用与否允许或拒绝其写入空闲缓冲堆栈,避免空闲缓冲区堆栈中会存在重复的索引,拒绝将已重复索引压入空闲缓冲区堆栈,而直接向提供重复索引的缓冲区使用者给出释放缓冲区应答信号;该机制维护了空闲缓冲区堆栈内部索引的正确性,避免引起缓冲区分配的冲突;另一方面,也不会因外部使用模块的错误导致缓冲区管理内部的混乱,提高了缓冲区管理器的健壮性,可靠性。
附图说明
下面结合附图和具体实施例进一步对本发明进行详细说明。
图1是传统的堆栈式缓冲区管理器系统结构示意图;
图2是经过一段时间的分配释放后,传统空闲缓冲区堆栈中的内容;
图3是释放出错后,传统空闲缓冲区堆栈中的内容;
图4是一种按照本发明思路改进后的堆栈式缓冲区管理器系统结构示意图;
图5是图4所示堆栈式缓冲区管理器缓冲区分配流程图;
图6是图4所示堆栈式缓冲区管理器缓冲区释放流程图。
具体实施方式
本发明包括但不限制于以下具体实施例:
首先,说明本发明可靠的缓冲区管理器3系统,如图4所示,包含四个组成部分:控制逻辑101、堆栈指针102、空闲缓冲区堆栈103、记录缓冲区使用信息表的缓冲区信息记录器401。存储器104是被管理的对象,存储器104划分成很多小块缓冲区,每个缓冲区用一个索引index来表示。索引图105物理上不存在,为了理解方便,用来说明缓冲区索引和缓冲区,信息记录器条目的一一对应关系。在缓冲区信息记录器401中为每个索引创建一个条目,每个条目和索引一一对应,如index0对应info0、index1对应info1、index2对应info2、依次类推。
第二步,说明本发明缓冲区管理器的分配流程和释放流程:
(一)分配流程
如图5所示,该分配流程具体包括以下步骤:
501)开始;
502)缓冲区使用者申请缓冲区;
503)查找堆栈指针指向的缓冲区索引;
504)根据缓冲区索引操作缓冲区信息记录器,完成缓冲区信息的记录;
505)将缓冲区分配给使用者,堆栈指针下移;
506)结束。
(二)释放流程
如图6所示,该释放流程具体包括以下步骤:
601)开始;
602)缓冲区使用者释放缓冲区;
603)记录缓冲区索引,查找缓冲区记录器;
604)判断缓冲区信息是否为空闲缓冲区?是,进入步骤6051);否则进入步骤6050);
6050)改写缓冲区记录器,并将缓冲区索引压入空闲缓冲区,堆栈指针上移,进入步骤606);
6051)使用者申请释放错误的缓冲区索引,不进行压栈操作,堆栈指针不变;
606)响应缓冲区释放操作;
607)结束。
最后,以实际应用场景详细说明本发明:缓冲区管理器可以服务多个缓冲区使用者,使用者需要使用缓冲区时向缓冲区管理器申请分配,使用完缓冲区后向缓冲区管理器申请释放该缓冲区,回收供以后使用。控制逻辑部分根据外部的分配或者释放请求,根据优先级策略仲裁,选择处理某一个申请源的请求,然后访问堆栈指针、空闲缓冲区堆栈、缓冲区信息记录器,根据本发明上面公开的流程进行处理,如下面的实例所描述:
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,表示该缓冲区已经是空闲缓冲区,企图释放一个空闲缓冲区是个错误的,不把缓冲区索引入栈,堆栈指针不变。直接给出释放缓冲区应该信号,释放缓冲区结束。
在C4步骤中,采用本发明的缓冲区管理器成功地检测到了外部释放缓冲区操作的错误,拒绝执行会引起空闲缓冲区堆栈混乱的操作,直接给出释放应答信号,大大提高了缓冲区管理器的健壮性、可靠性。
以上,缓冲区管理器是执行分配操作,还是执行释放操作,取决于外部缓冲区使用者的使用情况。