一种缓存分配方法、装置及设备的制作方法

文档序号:7776778阅读:262来源:国知局
一种缓存分配方法、装置及设备的制作方法
【专利摘要】本发明实施例提供了一种缓存分配方法、装置及设备,当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将待缓存数据从所述当前可用位置写入所述当前可用缓存块;当当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将写入点指示的位置更新为当前剩余可用空间的起始位置;当当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将写入点指示的位置更新为加入缓存块的起始位置,其中,预设缓存池用于存储预先设置的多个长度不小于预设最大长度的缓存块。本发明实施例提供的缓存分配方法使得缓存的分配更加合理。本发明涉及计算机【技术领域】。
【专利说明】一种缓存分配方法、装置及设备
【技术领域】
[0001]本发明涉及计算机【技术领域】,尤其涉及一种缓存分配方法、装置及设备。
【背景技术】
[0002]缓存的管理和分配在计算机编程领域、网络通信领域等领域中都有很广泛的应用。因为在很多情况下都需要对一些临时数据进行临时存储,下面以网络通信领域中,对接收到的数据包的缓存为例进行说明。
[0003]Web应用防火墙(WAF, Web Application Firewall)作为Web客户端和服务器端的中间设备,部署在Web服务器之前,对超文本传输协议(Hyper Text Transfer Protocol,简称:HTTP)或基于安全套接字的超文本传输协议(Hypertext Transfer Protocol overSecure Socket Layer,简称HTTPS)的双向流量执行检测扫描来保证Web应用的安全。WAF的“在线检测”工作模式,通常是通过Web “代理(Proxy)”的方式,在Web客户端和Web服务器之间分别建立TCP连接,作为两者之间的中间人,对HTTP、HTTPS流量进行扫描,用以检测来自恶意攻击者的非法有害请求,并且对该类请求采取相应的措施进行处理;而WAF的“离线检测”工作模式,不是作为中间人的角色,而是作为旁观者的角色,通过报文嗅探的方式,将Web客户端和Web服务器之间的HTTP、HTTPS交互的TCP报文抓取到WAF中,并且在应用层重组TCP连接,对重组后的TCP连接,进行安全检测、审计等工作。
[0004]进一步地,在WAF “离线检测”工作模式下,需要对嗅探后的报文进行缓存,现有技术中主要包括如下几种方案:
[0005]第一种方案:随时为接收到的报文申请缓存块
[0006]由嗅探线程申请一块能容纳最大长度的报文(可以称为“大报文”)的缓存作为嗅探报文的临时存储区。具体为当报文嗅探成功后,根据嗅探报文的大小,从系统中申请相应大小的缓存块,将报文从临时存储区拷贝至新申请的缓存块,并且将新申请的缓存块插入到处理队列,多个处理线程从处理队列中获取报文进行处理。但是,该种机制存在如下问题:首先,频繁地从系统申请缓存,会造成频繁地系统调用,降低工作效率;其次,从报文的临时存储区将报文拷贝至新申请的缓存块的过程,也会耗费一定的时间,降低对报文的处理速度。
[0007]第二种方案:使用固定大小缓存池方案
[0008]这种方案的处理机制是在第一种方案的基础上,对第一种方案存在的两个问题进行优化处理得到的。具体为在程序启动时,创建一个固定大小缓存块为基础的“缓存池”,每个缓存块大小为大报文的大小,该缓存池提供申请、释放固定大报文的接口。在调用报文嗅探的系统调用时,直接使用从缓存池中获得的大报文缓存,而不使用临时存储区。实现了所谓的“零拷贝”,解决了第一种方案中存在的两个问题,但是却引入了一个新问题:由于要嗅探的报文既可能包含几KB的大报文、也可能包含几十B的“小报文”,如果存储每个报文都使用存储大报文的缓存块进行存储,会造成大量的缓存浪费。当网口瞬间流量较大,且包含大量小报文,而处理流程不够迅速时,就会很快用完缓存池空间。如果从缓存池中申请不到缓存块,也会造成一定的丢包率。

【发明内容】

[0009]本发明实施例提供了一种缓存分配方法、装置及设备,用以解决现有技术中缓存分配不合理的问题。
[0010]基于上述问题,本发明实施例提供的一种缓存分配方法,包括:
[0011]当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将所述待缓存数据从所述当前可用位置写入所述当前可用缓存块;
[0012]当所述当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将所述写入点指示的位置更新为所述当前剩余可用空间的起始位置;
[0013]当所述当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将所述写入点指示的位置更新为加入缓存块的起始位置,其中,所述预设缓存池用于存储预先设置的多个长度不小于所述预设最大长度的缓存块。
[0014]本发明实施例提供的一种缓存分配装置,包括:
[0015]写入模块,用于当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将所述待缓存数据从所述当前可用位置写入所述当前可用缓存块;
[0016]更新模块,用于当所述当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将所述写入点指示的位置更新为所述当前剩余可用空间的起始位置;当所述当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将所述写入点指示的位置更新为加入缓存块的起始位置,其中,所述预设缓存池用于存储预先设置的多个长度不小于所述预设最大长度的缓存块。
[0017]本发明实施例提供的一种缓存分配设备,包括上述缓存分配装置。
[0018]本发明实施例的有益效果包括:
[0019]本发明实施例提供的一种缓存分配方法、装置及设备,当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将待缓存数据从所述当前可用位置写入所述当前可用缓存块;当当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将写入点指示的位置更新为当前剩余可用空间的起始位置;当当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将写入点指示的位置更新为加入缓存块的起始位置,其中,预设缓存池用于存储预先设置的多个长度不小于预设最大长度的缓存块。由于缓存队列中的缓存块长度大于预设最大长度,采用本发明实施例提供的一种缓存分配方法对嗅探数据包进行缓存分配,可以将预设最大长度设置为不小于“大报文”长度,当嗅探到的数据包长度较大时,可以独自占用一个缓存块,当嗅探到的数据包长度较小、且多个小数据包长度和不大于预设最大长度时,可以使多个小数据包共同占用一个缓存块,不仅实现了所谓的“零拷贝”,还节省了缓存空间,减小了丢包率,使得缓存的分配更加合理。
【专利附图】

【附图说明】
[0020]图1为本发明实施例提供的一种缓存分配方法的流程图;[0021]图2为本发明实施例1提供的一种缓存分配方法的流程图;
[0022]图3为本发明实施例2提供的判断当前待读取数据之后是否存储有待读取数据的方法的流程图;
[0023]图4为本发明实施例3提供的缓存队列的初始化的流程图;
[0024]图5a-图5f为本发明实施例提供的以WAF “离线检测”工作模式为例,对嗅探后的报文进行缓存过程的示意图;
[0025]图6为本发明实施例提供的一种缓存分配装置的结构示意图。
【具体实施方式】
[0026]本发明实施例提供了一种缓存分配方法、装置及设备,以下结合说明书附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。并且在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
[0027]本发明实施例提供一种缓存分配方法,如图1所示,包括:
[0028]S101、当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将待缓存数据从当前可用位置写入当前可用缓存块。
[0029]S102、当当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将写入点指示的位置更新为当前剩余可用空间的起始位置。
[0030]S103、当当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入缓存队列的队尾,并将写入点指示的位置更新为加入缓存块的起始位置,其中,预设缓存池用于存储预先设置的多个长度不小于预设最大长度的缓存块。
[0031]较佳地,本实施例更适用于能够预先确定需要缓存的待缓存数据的最大长度的情况。
[0032]下面结合附图,用具体实施例对本发明提供的方法及相关设备进行详细描述。
[0033]实施例1:
[0034]本发明实施例1中,如图2所示,具体包括如下步骤:
[0035]S201、当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将待缓存数据从当前可用位置写入当前可用缓存块。
[0036]S202、判断当前可用缓存块的当前剩余可用空间是否不小于预设最大长度,若是,则进入步骤S203 ;若否,则进入步骤S204。
[0037]S203、当当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将写入点指示的位置更新为当前剩余可用空间的起始位置。进入步骤S201。
[0038]S204、当当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入缓存队列的队尾,并将写入点指示的位置更新为加入缓存块的起始位置,其中,预设缓存池用于存储预先设置的多个长度不小于预设最大长度的缓存块。进入步骤S201。
[0039]进一步地,本步骤中,当当前剩余可用空间小于预设最大长度时,将写入点指示的位置更新为加入缓存块的起始位置,那么,该当前剩余可用空间会成为缓存队列中的“碎片”。即使缓存队列中存在一些碎片,由于碎片的长度比较小,因此,本发明实施例提供的缓存分配方法,与现有技术相比,仍然能够更加充分地利用缓存资源,使缓存分配更合理。[0040]进一步地,当当前剩余可用空间为“碎片”时,将写入点指示的位置更新为加入缓存块的起始位置,而不更新为“碎片”的起始位置,原因如下:
[0041]由于“碎片”的长度小于预设最大长度,那么,就可能接收到的下一个待缓存数据的长度大于该“碎片”的长度,如果要利用该“碎片”存储大于“碎片”长度的待缓存数据,需要将该待缓存数据跨块存储,也就是说,将该待缓存数据拆分成两个部分,第一部分存储在该“碎片”中,另一部分存储在下一个缓存块中,并且在读取时,将该跨块存储的数据进行组合。这些拆分和组合的工作需要耗费一定的内存。
[0042]进一步地,本发明实施例提供的缓存分配方法,可以看作是一个生产者和消费者模型,当生产和消费的速度平衡时,该模型能够取得最佳效果。也就是说,可以将从缓存池中获取缓存块放入缓存队列中看作是生产的过程,将在缓存块中写入待缓存数据看作是消费的过程。虽然从表面上看浪费了“碎片”的空间,但是写入和读取的速度变快了,缓存池中缓存块的数量是有限的,写入和读取的速度变快也就加快了缓存块被释放及重新利用的速度,使得生产和消费达到了平衡。如果将“碎片”利用起来,跨块存储待缓存数据,虽然将“碎片”的空间利用了,但是造成了时间上的浪费,也就减慢了缓存块释放重新利用的速度,甚至导致缓存池中没有可以获取的缓存块,造成无缓存可以分配,破坏了生产和消费的平衡,得不偿失。
[0043]较佳地,为了便于对预设缓存池中的缓存块进行管理,预设缓存池中存储的预先设置的多个缓存块长度可以相同。
[0044]S205、当读取缓存队列中的待读取数据时,判断读取点指示的位置与写入点指示的位置是否为同一位置,若是,则本读取流程结束;若否,进入步骤S206 ;
[0045]本步骤中,当读取缓存队列中的待读取数据时,循环执行步骤S206?S210,直到读取点指示的位置与所述写入点指示的位置为同一缓存块的起始位置为止。
[0046]进一步地,在缓存队列中,写入点和读取点为单向移动。当读取点的位置和写入点的位置同为一个缓存块的同一位置时,说明缓存队列中已不存在待读取的数据,则读取流程结束。
[0047]进一步地,可以在将待缓存数据写入当前可用缓存块之后,即步骤S201之后,通过事件机制触发对缓存队列中的数据的读取操作。也就是说,当缓存队列中有数据写入时,可以通过事件机制通知读取点对缓存中的数据进行读取。
[0048]S206、根据缓存队列中读取点指示的当前待读取数据的起始位置,读取上述当前待读取数据。
[0049]S207、判断上述当前待读取数据所在缓存块内,在上述当前待读取数据之后是否还存储有待读取数据,若是,则进入步骤S208 ;若否,则进入步骤S209。
[0050]S208、当上述当前待读取数据所在缓存块内,在上述当前待读取数据之后还存储有待读取数据时,将读取点指示的位置更新为紧邻上述当前待读取数据存储的待读取数据的起始位置。进入步骤S206;
[0051]S209、当上述当前待读取数据所在缓存块内,在上述当前待读取数据之后不存在待读取数据时,判断当前写入点指示的位置是否为上述当前待读取数据的结束位置,若否,则进入步骤S210 ;若是,则进入步骤S212。
[0052]本步骤中,当前待读取数据的结束位置可以为该当前待读取数据的最后一个字符所在存储位置的下一个存储位置,即上述待读取数据之后、且紧邻上述待读取数据的存储位置。
[0053]S210、当上述当前待读取数据所在缓存块内,在上述当前待读取数据之后不存在待读取数据,且写入点指示的位置不为上述当前待读取数据的结束位置时,将读取点指示的位置更新为缓存队列中,上述当前待读取数据所在缓存块之后的下一个缓存块的起始位置。
[0054]本步骤中,当前待读取数据所在缓存块内,在当前待读取数据之后不存在待读取数据,且写入点指示的位置不为当前待读取数据的结束位置,说明当前待读取数据所在缓存块内,当前待读取数据之后剩余的存储空间,长度不大于预设最大长度,也就是说该剩余的存储空间为一块“碎片”,此时,并不能说明缓存队列中不存在待读取数据了,待读取数据可能存储在当前待读取数据所在缓存块之后的下一个缓存块中,因此,可以将读取点指示的位置更新为缓存队列中,当前待读取数据所在缓存块之后的下一个缓存块的起始位置。若写入点指示的位置也在该下一个缓存块的起始位置,则在进入步骤S205时,会判断出读取点指示的位置与写入点指示的位置为同一位置,说明缓存队列中的待读取数据已经读取完毕,读取流程结束,若写入点指示的位置不在该下一个缓存块的起始位置,则在进入步骤S205时,会判断出读取点指示的位置与写入点指示的位置为非同一位置,说明缓存队列中还存在未读取的数据,则进入步骤S206,读取当前待读取数据。
[0055]S211、将上述当前待读取数据所在缓存块释放到预设缓存池。进入步骤S205。
[0056]本步骤中,将当前待读取数据所在缓存块释放到预设缓存池中,可以供后续从预设缓存池中获取缓存块时使用。
[0057]S212、当上述当前待读取数据所在缓存块内,在上述当前待读取数据之后不存在待读取数据,且写入点指示的位置为上述当前待读取数据的结束位置时,将读取点指示的位置更新为写入点指示的位置。本读取流程结束。
[0058]本步骤中,当前待读取数据所在缓存块内,在当前待读取数据之后不存在待读取数据,且写入点指示的位置为当前待读取数据的结束位置,说明当前待读取数据所在缓存块内,当前待读取数据之后剩余的存储空间,长度大于预设最大长度,且缓存队列中不存在未读取数据,将读取点指示的位置更新为写入点指示的位置。在进入步骤S205时,会判断出读取点指示的位置与写入点指示的位置为同一位置,读取流程结束。
[0059]实施例2:
[0060]针对本发明实施例1中的步骤S201,从当前可用位置写入当前可用缓存块的数据可以包括:顺次存储的待缓存数据的长度信息以及待缓存数据的内容;因此,针对上述步骤S207、判断当前待读取数据所在缓存块内,在当前待读取数据之后是否还存储有待读取数据,本发明实施例2提供了具体的实施方式,如图3所示,可以包括如下步骤:
[0061 ] S301、确定紧邻当前待读取数据的、用于存储待缓存数据的长度的存储位置,存储的内容是否为零,若否,则进入步骤S302 ;若是,则进入步骤S303。
[0062] 进一步地,本实施例中,当写入当前可用缓存块的数据包括待缓存数据的长度以及待缓存数据时,在读取缓存块中的数据时,首先读取到待读取数据的长度,再根据该长度,从存储该长度的存储位置之后,读取该长度的数据,即完成了当前待读取数据的读取。如果该当前待读取数据之后,还存储有待读取数据,那么在该当前待读取数据之后,紧邻该当前待读取数据的存储位置,应该存储有下一个待读取数据的长度,如果存储的内容为零,说明当前待读取数据所在缓存块内,在待读取数据之后未存储待读取数据,如果存储的内容不为零,说明当前待读取数据所在缓存块内,在待读取数据之后存储有待读取数据。
[0063]S302、若不为零,则确定当前待读取数据所在缓存块内,在待读取数据之后存储有待读取数据。
[0064]S303、否则,确定当前待读取数据所在缓存块内,在待读取数据之后未存储待读取数据。
[0065]实施例3:
[0066]本发明实施例3提供了缓存队列的初始化流程,如图4所示,具体包括如下步骤:
[0067]S401、从预设缓存池中获取一个缓存块作为缓存队列中的第一个节点。
[0068]S402、将写入点指示的位置和读取点指示的位置初始化为上述第一个节点缓存块的起始位置。
[0069]下面以WAF “离线检测”工作模式下,对嗅探后的报文进行缓存为例,说明本发明实施例提供的缓存分配方法,假设预设最大长度为“大报文”长度加4个字节(4个字节可以存储一个整型数据,即用于存储接收到的报文的长度信息),如图5a-图5f所示:
[0070]图5a为预设缓存池中的缓存块示意图,在预设缓存池501中每个缓存块大小相同,且为1.5倍的预设最大长度;
[0071]图5b为初始化后的缓存队列示意图,队列中包括一个从预设缓存池中获取的第一个缓存块502,指向缓存队列的表头指针,指向该第一个缓存块502起始位置的读取点指针和写入点指针;
[0072]假设嗅探到的第一个数据包长度为“大报文”长度,则将该第一个数据包的长度信息,及该第一个数据包的内容,从写入点指针指示的位置(第一个缓存块起始位置)写入该第一个缓存块502,将该第一个数据包写入第一个缓存块502之后,第一个缓存块502中剩余存储空间小于预设最大长度,从预设缓存池中获取第二个缓存块503放入缓存队列的队尾,并将写入点指针更新为该第二个缓存块503的起始位置;图5c为将第一个数据包写入第一个缓存块502之后缓存队列状态示意图;
[0073]假设嗅探到的第二个数据包长度为0.3倍的“大报文”长度,则将第二个数据包的长度信息,及该第二个数据包的内容,从写入点指针指示的位置(第二个缓存块起始位置)写入该第二个缓存块503,将该第二个数据包写入第二个缓存块503之后,第二个缓存块503中剩余存储空间大于预设最大长度,将写入点指针更新为该第二个缓存块503中剩余存储空间的起始位置;图5d为将第二个数据包写入第二个缓存块503之后缓存队列状态示意图;
[0074]当将第一个数据包写入第一个缓存块502之后,通过事件机制触发对缓存队列中的数据的读取操作。当确定当前读取点指针指示的位置与写入点指针指示的位置不同时,读取读取点指针所指示的当前待读取数据,即第一个数据包的长度信息,以及根据读取到的长度信息读取的第一个数据包,由于第一个数据包之后,与第一个数据包紧邻的存储位置存储的内容为零(碎片),确定在第一个缓存块502内,第一个数据包之后不存在待读取数据,又由于写入点指针指示的位置不为第一个数据包之后,与第一个数据包紧邻的存储位置,将读取点指针指示的位置更新为第二个缓存块503的起始位置,并将第一个缓存块502释放回预设缓存池;图5e为将第一个缓存块502释放之后缓存队列状态示意图;
[0075]再次对读取点指针指示的位置和写入点指针指示的位置进行判断,由于更新后的读取点指针指示的位置与写入点指针指示的位置不同,读取读取点指针所指示的当前待读取数据,即第二个数据包的长度信息,以及根据读取到的长度信息读取的第二个数据包,由于第二个数据包之后,与第二个数据包紧邻的存储位置存储的内容为零,确定在第二个缓存块503内,第一个数据包之后不存在待读取数据,又由于写入点指针指示的位置为第一个数据包之后,与第一个数据包紧邻的存储位置,将读取点指针指示的位置更新为写入点指针指示的位置,由于更新后的读取点指针指示的位置与写入点指针指示的位置相同,读取流程结束。图5f为读取第二个数据包之后缓存队列状态示意图。
[0076]基于同一发明构思,本发明实施例还提供了一种缓存分配装置及设备,由于这些装置和设备所解决问题的原理与前述缓存分配方法相似,因此该装置和设备的实施可以参见前述方法的实施,重复之处不再赘述。
[0077]本发明实施例提供的一种缓存分配装置,如图6所示,包括如下模块:
[0078]写入模块601,用于当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将所述待缓存数据从所述当前可用位置写入所述当前可用缓存块;
[0079]更新模块602,用于当所述当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将所述写入点指示的位置更新为所述当前剩余可用空间的起始位置;当所述当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将所述写入点指示的位置更新为加入缓存块的起始位置,其中,所述预设缓存池用于存储预先设置的多个长度不小于所述预设最大长度的缓存块。
[0080]进一步地,所述装置,还包括:
[0081]读取模块603,用于当读取所述缓存队列中的待读取数据时,循环执行如下步骤,直到所述读取点指示的位置与所述写入点指示的位置为同一位置为止:根据所述缓存队列中读取点指示的当前待读取数据的起始位置,读取所述当前待读取数据;当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后还存储有待读取数据时,将所述读取点指示的位置更新为紧邻所述当前待读取数据存储的待读取数据的起始位置;当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后不存在待读取数据,且所述写入点指示的位置不为所述当前待读取数据的结束位置时,将所述读取点指示的位置更新为所述缓存队列中,所述当前待读取数据所在缓存块之后的下一个缓存块的起始位置,并将所述当前待读取数据所在缓存块释放到所述预设缓存池;当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后不存在待读取数据,且所述写入点指示的位置为所述当前待读取数据的结束位置时,将所述读取点指示的位置更新为所述写入点指示的位置。
[0082]进一步地,所述写入模块601从所述当前可用位置顺次写入所述当前可用缓存块的数据包括:所述待缓存数据的长度信息以及所述待缓存数据的内容;
[0083]所述读取模块603,具体用于采用如下方式确定所述当前待读取数据所在缓存块内,在所述待读取数据之后是否存储有待读取数据:确定紧邻所述当前待读取数据的、用于存储待缓存数据的长度的存储位置,存储的内容是否为零;若不为零,则确定所述当前待读取数据所在缓存块内,在所述待读取数据之后存储有待读取数据;否则,确定所述当前待读取数据所在缓存块内,在所述待读取数据之后未存储待读取数据。
[0084]进一步地,所述装置,还包括:
[0085]触发模块604,用于在所述写入模块将所述待缓存数据写入所述当前可用缓存块之后,通过事件机制触发对所述缓存队列中的数据的读取操作。
[0086]进一步地,所述装置,还包括:
[0087]初始化模块605,用于采用如下方式对所述缓存队列进行初始化:从所述预设缓存池中获取一个缓存块作为缓存队列中的第一个节点;并将写入点指示的位置和读取点指示的位置初始化为所述第一个节点缓存块的起始位置。
[0088]本发明实施例提供的一种缓存分配设备,包括上述的缓存分配装置。
[0089]上述各单元的功能可对应于图1至图4所示流程中的相应处理步骤,在此不再赘述。
[0090]本发明实施例提供的一种缓存分配方法、装置及设备,当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将待缓存数据从所述当前可用位置写入所述当前可用缓存块;当当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将写入点指示的位置更新为当前剩余可用空间的起始位置;当当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将写入点指示的位置更新为加入缓存块的起始位置,其中,预设缓存池用于存储预先设置的多个长度不小于预设最大长度的缓存块。由于缓存队列中的缓存块长度大于预设最大长度,采用本发明实施例提供的一种缓存分配方法对嗅探数据包进行缓存分配,可以将预设最大长度设置为不小于“大报文”长度,当嗅探到的数据包长度较大时,可以独自占用一个缓存块,当嗅探到的数据包长度较小、且多个小数据包长度和不大于预设最大长度时,可以使多个小数据包共同占用一个缓存块,不仅实现了所谓的“零拷贝”,还节省了缓存空间,减小了丢包率,使得缓存的分配更加合理。
[0091]通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明实施例可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是⑶-R0M,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0092]本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
[0093]本领域技术人员可以理解实施例中的装置中的模块可以按照实施例描述进行分布于实施例的装置中,也可以进行相应变化位于不同于本实施例的一个或多个装置中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
[0094]上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0095]显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
【权利要求】
1.一种缓存分配方法,其特征在于,包括: 当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将所述待缓存数据从所述当前可用位置写入所述当前可用缓存块; 当所述当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将所述写入点指示的位置更新为所述当前剩余可用空间的起始位置; 当所述当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将所述写入点指示的位置更新为加入缓存块的起始位置,其中,所述预设缓存池用于存储预先设置的多个长度不小于所述预设最大长度的缓存块。
2.如权利要求1所述的方法,其特征在于,还包括: 当读取所述缓存队列中的待读取数据时,循环执行如下步骤,直到所述读取点指示的位置与所述写入点指示的位置为同一位置为止: 根据所述缓存队列中读取点指示的当前待读取数据的起始位置,读取所述当前待读取数据; 当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后还存储有待读取数据时,将所述读取点指示的位置更新为紧邻所述当前待读取数据存储的待读取数据的起始位置; 当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后不存在待读取数据,且所述写入点指示的位置不为所述当前待读取数据的结束位置时,将所述读取点指示的位置更新为所述缓存队列中,所述当前待读取数据所在缓存块之后的下一个缓存块的起始位置,并将所述当前待读取数据所在缓存块释放到所述预设缓存池; 当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后不存在待读取数据,且所述写入点指示的位置为所述当前待读取数据的结束位置时,将所述读取点指示的位置更新为所述写入点指示的位置。
3.如权利要求2所述的方法,其特征在于,从所述当前可用位置写入所述当前可用缓存块的数据包括:顺次存储的所述待缓存数据的长度信息以及所述待缓存数据的内容; 所述方法,采用如下方式确定所述当前待读取数据所在缓存块内,在所述待读取数据之后是否存储有待读取数据: 确定紧邻所述当前待读取数据的、用于存储待缓存数据的长度的存储位置,存储的内容是否为零; 若不为零,则确定所述当前待读取数据所在缓存块内,在所述待读取数据之后存储有待读取数据; 否则,确定所述当前待读取数据所在缓存块内,在所述待读取数据之后未存储待读取数据。
4.如权利要求1-3任一项所述的方法,其特征在于,还包括: 在将所述待缓存数据写入所述当前可用缓存块之后,通过事件机制触发对所述缓存队列中的数据的读取操作。
5.如权利要求1-3任一项所述的方法,其特征在于,采用如下方式对所述缓存队列进行初始化: 从所述预设缓存池中获取一个缓存块作为缓存队列中的第一个节点;并将写入点指示的位置和读取点指示的位置初始化为所述第一个节点缓存块的起始位置。
6.一种缓存分配装置,其特征在于,包括: 写入模块,用于当接收到待缓存数据时,根据缓存队列中写入点指示的当前可用缓存块的当前可用位置,将所述待缓存数据从所述当前可用位置写入所述当前可用缓存块; 更新模块,用于当所述当前可用缓存块的当前剩余可用空间不小于预设最大长度时,将所述写入点指示的位置更新为所述当前剩余可用空间的起始位置;当所述当前剩余可用空间小于预设最大长度时,从预设缓存池中获取一个缓存块加入所述缓存队列的队尾,并将所述写入点指示的位置更新为加入缓存块的起始位置,其中,所述预设缓存池用于存储预先设置的多个长度不小于所述预设最大长度的缓存块。
7.如权利要求6所述的装置,其特征在于,还包括: 读取模块,用于当读取所述缓存队列中的待读取数据时,循环执行如下步骤,直到所述读取点指示的位置与所述写入点指示的位置为同一位置为止:根据所述缓存队列中读取点指示的当前待读取数据的起始位置,读取所述当前待读取数据;当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后还存储有待读取数据时,将所述读取点指示的位置更新为紧邻所述当前待读取数据存储的待读取数据的起始位置;当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后不存在待读取数据,且所述写入点指示的位置不为所述当前待读取数据的结束位置时,将所述读取点指示的位置更新为所述缓存队列中,所述当前待读取数据所在缓存块之后的下一个缓存块的起始位置,并将所述当前待读取数据所在缓存块释放到所述预设缓存池;当所述当前待读取数据所在缓存块内,在所述当前待读取数据之后不存在待读取数据,且所述写入点指示的位置为所述当前待读取数据的结束位置时,将所述读取点指示的位置更新为所述写入点指示的位置。
8.如权利要求7所述的装置,其特征在于,所述写入模块从所述当前可用位置写入所述当前可用缓存块的数据包括:顺次存储的所述待缓存数据的长度信息以及所述待缓存数据的内容; 所述读取模块,具体用于采用如下方式确定所述当前待读取数据所在缓存块内,在所述待读取数据之后是否存储有待读取数据:确定紧邻所述当前待读取数据的、用于存储待缓存数据的长度的存储位置,存储的内容是否为零;若不为零,则确定所述当前待读取数据所在缓存块内,在所述待读取数据之后存储有待读取数据;否则,确定所述当前待读取数据所在缓存块内,在所述待读取数据之后未存储待读取数据。
9.如权利要求6-8任一项所述的装置,其特征在于,还包括: 触发模块,用于在所述写入模块将所述待缓存数据写入所述当前可用缓存块之后,通过事件机制触发对所述缓存队列中的数据的读取操作。
10.如权利要求6-8任一项所述的装置,其特征在于,还包括: 初始化模块,用于采用如下方式对所述缓存队列进行初始化:从所述预设缓存池中获取一个缓存块作为缓存队列中的第一个节点;并将写入点指示的位置和读取点指示的位置初始化为所述第一个节点缓存块的起始位置。
11.一种缓存分配设备,其特征在于,包括如权利要求6-10任一项所述的缓存分配装置。
【文档编号】H04L12/861GK103595653SQ201310577399
【公开日】2014年2月19日 申请日期:2013年11月18日 优先权日:2013年11月18日
【发明者】刘冀鹏 申请人:福建星网锐捷网络有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1