本发明属于网卡数据处理技术领域,具体涉及一种网卡数据包缓存管理方法、装置、终端及存储介质。
背景技术:
为提高收包效率,网卡驱动对收到的数据包会进行缓存处理,上层网络应用会从缓存结构中消费数据包,通过缓存的形式处理数据包,能够较大程度上提高上网卡收发包的效率。但由于网卡驱动和上层应用需要同时对缓存结构中的数据包进行处理,对缓存结构中的元素进行添加或删除处理时,往往需要对缓存结构元素进行加锁/解锁处理,在一定程度上会影响网卡收发包的效率,同时异常情况下还有可能死锁,导致驱动崩溃。
此为现有技术的不足,因此,针对现有技术中的上述缺陷,提供一种网卡数据包缓存管理方法、装置、终端及存储介质,是非常有必要的。
技术实现要素:
针对现有技术的上述网卡驱动和上层应用同时进行数据处理时,需要对缓存结构元素进行加解锁处理,影响网卡收发包效率的缺陷,本发明提供一种网卡数据包缓存管理方法、装置、终端及存储介质,以解决上述技术问题。
第一方面,本发明提供一种网卡数据包缓存管理方法,包括如下步骤:
s1.设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;
s2.网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中,再将忙碌队列中缓存数据包的地址依次映射到空闲队列;
s3.通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
s4.上层应用通过忙碌队列的读指针依次获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址。
进一步地,还包括如下步骤:
s5.获取忙碌队列及空闲队列实时的读指针和写指针,并根据两个队列各自实时的读写指针的关系,判断缓存数据包在存储池的状态,以及是否需要增设缓存池。
进一步地,步骤s1具体步骤如下:
s11.计算环形缓存队列长度=总缓存空间大小/(上层应用线程数*分类后单个数据包大小);
s12.以设定的环形缓存队列长度创建两个环形缓存队列;
s13.设定两个环形缓存队列中一个为忙碌队列,另一个为空闲队列;
s14.将忙碌队列和空闲队列设定为一个缓存池。
进一步地,步骤s2具体步骤如下:
s21.网卡驱动从数据链路接收数据包到接收链路环中;
s22.网卡驱动对数据包进行hash分类;
s23.网卡驱动通过忙碌队列的写指针将分类后数据包依次缓存到忙碌队列中;
s24.网卡驱动将忙碌队列缓存数据包的地址依次映射到空闲队列。
进一步地,步骤s4具体步骤如下:
s41.上层应用通过忙碌队列的读指针依次获取缓存的数据包;
s42.上层应用依次对缓存数据包进行处理;
s43.上层应用通过空闲队列的写指针从空闲队列依次获取并释放处理完的缓存数据包在忙碌队列的地址。
进一步地,步骤s5具体步骤如下:
s51.获取忙碌队列及空闲队列实时的读指针和写指针;
s52.判断忙碌队列的读指针和写指针是否相等;
若是,判定忙碌队列为空,无缓存数据包,返回步骤s2;
若否,进入步骤s53,或者进入步骤s54;
s53.判断是否忙碌队列的下一个写指针为读指针,即忙碌队列写指针 1=忙碌队列读指针;
若是,判定忙碌队列已满,进入步骤s55;
若否,返回步骤s2;
s54.判断空闲队列的下一个读指针大于写指针,即空闲队列读指针 1>空闲队列写指针;
若是,判定空闲队列的空闲内存地址已消耗完毕,进入步骤s55;
若否,返回步骤s2;
s55.重复步骤s1步骤增设缓存池。
第二方面,本发明提供一种网卡数据包缓存管理装置,包括:
缓存池设置模块,用于设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;
数据缓存模块,用于设置网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中,再将忙碌队列中缓存数据包的地址依次映射到空闲队列;
缓存地址获取模块,通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
数据处理模块,用于通过上层应用通过忙碌队列的读指针依次获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址。
进一步地,还包括:
缓存数量确定模块,用于获取忙碌队列及空闲队列实时的读指针和写指针,并根据两个队列各自实时的读写指针的关系,判断缓存数据包在存储池的状态,以及是否需要增设缓存池。
第三方面,提供一种终端,包括:
处理器、存储器,其中,
该存储器用于存储计算机程序,
该处理器用于从存储器中调用并运行该计算机程序,使得终端执行上述的第一方面的方法。
第四方面,提供了一种计算机存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面所述的方法。
本发明的有益效果在于,
本发明提供的网卡数据包缓存管理方法、装置、终端及存储介质,通过两个环形队列来管理数据包缓存的收发和释放,网卡驱动和上层应用分别操作环形队列上的读写指针,利用环形的特性实现数据包收发和释放,从而在数据包处理过程中无须对环形队列中的缓存结构元素进行加锁和解锁处理,提高网卡收发包效率,提升网卡驱动运行的稳定性。
此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。
由此可见,本发明与现有技术相比,具有突出的实质性特点和显著的进步,其实施的有益效果也是显而易见的。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明的方法流程示意图一;
图2是本发明的方法流程示意图二;
图3是本发明的系统示意图;
图中,1-缓存池设置模块;1.1-队列长度计算单元;1.2-环形缓存队列创建单元;1.3-环形缓存队列分工设置单元;1.4-缓存池设定单元;2-数据缓存模块;2.1-数据包接收单元;2.2-数据包分类单元;2.3-数据包缓存单元;2.4-地址存储单元;3-缓存地址获取模块;4-数据处理模块;4.1-数据包获取单元;4.2-数据包处理单元;4.3-地址释放单元;5-缓存数量确定模块;5.1-指针获取单元;5.2-指针相等判断单元;5.3-队列为空判定单元;5.4-忙碌队列写指针判断单元;5.5-忙碌队列已满判定单元;5.6-空闲队列读指针判断单元;5.7-空闲地址用尽判定单元;5.8-缓存池增设单元。
具体实施方式
为了使本技术领域的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
实施例1:
如图1所示,本发明提供一种网卡数据包缓存管理方法,包括如下步骤:
s1.设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;
s2.网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针将分类后数据包缓存到忙碌队列中,再依次将忙碌队列中缓存数据包的地址依次映射到空闲队列;
s3.通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
s4.上层应用通过忙碌队列的读指针依获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址。
实施例2:
如图2所示,本发明提供一种网卡数据包缓存管理方法,包括如下步骤:
s1.设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;具体步骤如下:
s11.计算环形缓存队列长度=总缓存空间大小/(上层应用线程数*分类后单个数据包大小);
s12.以设定的环形缓存队列长度创建两个环形缓存队列;
s13.设定两个环形缓存队列中一个为忙碌队列,另一个为空闲队列;
s14.将忙碌队列和空闲队列设定为一个缓存池;
s2.网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中,再将忙碌队列中缓存数据包的地址指向空闲队列;具体步骤如下:
s21.网卡驱动从数据链路接收数据包到接收链路环中;
s22.网卡驱动对数据包进行hash分类;
s23.网卡驱动通过忙碌队列的写指针将分类后数据包依次缓存到忙碌队列中;
s24.网卡驱动将忙碌队列缓存数据包的地址依次映射到空闲队列;
s3.通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
s4.上层应用通过忙碌队列的读指针依次获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址;具体步骤如下:
s41.上层应用通过忙碌队列的读指针依次获取缓存的数据包;
s42.上层应用依次对缓存数据包进行处理;
s43.上层应用通过空闲队列的写指针从空闲队列依次获取并释放处理完的缓存数据包在忙碌队列的地址;
s5.获取忙碌队列及空闲队列实时的读指针和写指针,并根据两个队列各自实时的读写指针的关系,判断缓存数据包在存储池的状态,以及是否需要增设缓存池;具体步骤如下:
s51.获取忙碌队列及空闲队列实时的读指针和写指针;
s52.判断忙碌队列的读指针和写指针是否相等;
若是,判定忙碌队列为空,无缓存数据包,返回步骤s2;
若否,进入步骤s53,或者进入步骤s54;
s53.判断是否忙碌队列的下一个写指针为读指针,即忙碌队列写指针 1=忙碌队列读指针;
若是,判定忙碌队列已满,进入步骤s55;
若否,返回步骤s2;
s54.判断空闲队列的下一个读指针大于写指针,即空闲队列读指针 1>空闲队列写指针;
若是,判定空闲队列的空闲内存地址已消耗完毕,进入步骤s55;
若否,返回步骤s2;
s55.重复步骤s1步骤增设缓存池。
在某些实施例中,也可根据上层应用的收发包线程数提前将缓存池设置为多组。
在某些实施例中,网卡驱动只操作忙碌队列的写指针和读指针;
忙碌队列的读指针永远不能超过写指针,初始状态,忙碌队列的读指针与写指针在相同位置;
当忙碌队列读指针与写指针相等时,代表忙碌队列为空,缓存数据包被处理完毕,此时无缓存数据包;
而当写指针下一个位置为读指针,即bwp 1==brp,代表忙碌队列满,此时会出现丢包。
在某些实施例中,上层应用只操作空闲队列的写指针和读指针;
空闲队列的读指针永远不能超过写指针,初始状态,读指针和写指针位于第一个空闲的内存地址上;
当空闲队列读指针下一个位置超过写指针时,代表空闲队列的内存地址已经消耗完毕,此时无法缓存数据包,将出现丢包。
实施例3:
如图3所示,本发明提供一种网卡数据包缓存管理装置,包括:
缓存池设置模块1,用于设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;缓存池设置模块1包括:
队列长度计算单元1.1,用于计算环形缓存队列长度=总缓存空间大小/(上层应用线程数*分类后单个数据包大小);
环形缓存队列创建单元1.2,用于以设定的环形缓存队列长度创建两个环形缓存队列;
环形缓存队列分工设置单元1.3,用于设定两个环形缓存队列中一个为忙碌队列,另一个为空闲队列;
缓存池设定单元1.4,用于将忙碌队列和空闲队列设定为一个缓存池;
数据缓存模块2,用于设置网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中,再将忙碌队列中缓存数据包的地址依次映射到空闲队列;数据缓存模块2包括:
数据包接收单元2.1,用于设置网卡驱动从数据链路接收数据包到接收链路环中;
数据包分类单元2.2,用于设置网卡驱动对数据包进行hash分类;
数据包缓存单元2.3,用于设置网卡驱动通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中;
地址存储单元2.4,用于设置网卡驱动将忙碌队列缓存数据包的地址依次映射到空闲队列;
缓存地址获取模块3,通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
数据处理模块4,用于通过上层应用通过忙碌队列的读指针依次获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址;数据处理模块4包括:
数据包获取单元4.1,用于设置上层应用通过忙碌队列的读指针依次获取缓存的数据包;
数据包处理单元4.2,用于依次对缓存数据包进行处理;
地址释放单元4.3,用于设置上层应用通过空闲队列的写指针从空闲队列依次获取并释放处理完的缓存数据包在忙碌队列的地址;
缓存数量确定模块5,用于获取忙碌队列及空闲队列实时的读指针和写指针,并根据两个队列各自实时的读写指针的关系,判断缓存数据包在存储池的状态,以及是否需要增设缓存池;缓存数量确定模块5包括:
指针获取单元5.1,用于获取忙碌队列及空闲队列实时的读指针和写指针;
指针相等判断单元5.2,用于判断忙碌队列的读指针和写指针是否相等;
队列为空判定单元5.3,用于忙碌队列的读指针和写指针相等时,判定忙碌队列为空,无缓存数据包;
忙碌队列写指针判断单元5.4,用于判断是否忙碌队列的下一个写指针为读指针,即忙碌队列写指针 1=忙碌队列读指针;
忙碌队列已满判定单元5.5,用于忙碌队列的下一个写指针为读指针时,判定忙碌队列已满;
空闲队列读指针判断单元5.6,用于判断空闲队列的下一个读指针大于写指针,即空闲队列读指针 1>空闲队列写指针;
空闲地址用尽判定单元5.7,用于判定空闲队列的空闲内存地址已消耗完毕;
缓存池增设单元5.8,用于忙碌队列已满及空闲队列的空闲内存地址已消耗完毕时,增设缓存池。
实施例4:
本发明提供一种终端,
处理器、存储器,其中,
该存储器用于存储计算机程序,该处理器用于从存储器中调用并运行该计算机程序,使得终端执行上述第一方面或第二方面所述的方法。
实施例5:
本发明提供一种存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面或第二方面所述的方法。
尽管通过参考附图并结合优选实施例的方式对本发明进行了详细描述,但本发明并不限于此。在不脱离本发明的精神和实质的前提下,本领域普通技术人员可以对本发明的实施例进行各种等效的修改或替换,而这些修改或替换都应在本发明的涵盖范围内/任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
1.一种网卡数据包缓存管理方法,其特征在于,包括如下步骤:
s1.设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;
s2.网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中,再将忙碌队列中缓存数据包的地址依次映射到空闲队列;
s3.通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
s4.上层应用通过忙碌队列的读指针依次获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址。
2.如权利要求1所述的网卡数据包缓存管理方法,其特征在于,还包括如下步骤:
s5.获取忙碌队列及空闲队列实时的读指针和写指针,并根据两个队列各自实时的读写指针的关系,判断缓存数据包在存储池的状态,以及是否需要增设缓存池。
3.如权利要求2所述的网卡数据包缓存管理方法,其特征在于,步骤s1具体步骤如下:
s11.计算环形缓存队列长度=总缓存空间大小/(上层应用线程数*分类后单个数据包大小);
s12.以设定的环形缓存队列长度创建两个环形缓存队列;
s13.设定两个环形缓存队列中一个为忙碌队列,另一个为空闲队列;
s14.将忙碌队列和空闲队列设定为一个缓存池。
4.如权利要求3所述的网卡数据包缓存管理方法,其特征在于,步骤s2具体步骤如下:
s21.网卡驱动从数据链路接收数据包到接收链路环中;
s22.网卡驱动对数据包进行hash分类;
s23.网卡驱动通过忙碌队列的写指针将分类后数据包依次缓存到忙碌队列中;
s24.网卡驱动将忙碌队列缓存数据包的地址依次映射到空闲队列。
5.如权利要求4所述的网卡数据包缓存管理方法,其特征在于,步骤s4具体步骤如下:
s41.上层应用通过忙碌队列的读指针依次获取缓存的数据包;
s42.上层应用依次对缓存数据包进行处理;
s43.上层应用通过空闲队列的写指针从空闲队列依次获取并释放处理完的缓存数据包在忙碌队列的地址。
6.如权利要求5所述的网卡数据包缓存管理方法,其特征在于,步骤s5具体步骤如下:
s51.获取忙碌队列及空闲队列实时的读指针和写指针;
s52.判断忙碌队列的读指针和写指针是否相等;
若是,判定忙碌队列为空,无缓存数据包,返回步骤s2;
若否,进入步骤s53,或者进入步骤s54;
s53.判断是否忙碌队列的下一个写指针为读指针,即忙碌队列写指针 1=忙碌队列读指针;
若是,判定忙碌队列已满,进入步骤s55;
若否,返回步骤s2;
s54.判断空闲队列的下一个读指针大于写指针,即空闲队列读指针 1>空闲队列写指针;
若是,判定空闲队列的空闲内存地址已消耗完毕,进入步骤s55;
若否,返回步骤s2;
s55.重复步骤s1步骤增设缓存池。
7.一种网卡数据包缓存管理装置,其特征在于,包括:
缓存池设置模块(1),用于设置环形缓存队列,并根据总缓存空间大小及上层应用线程数设定环形缓存队列长度,再将两个环形缓存队列设置为一个缓存池,且设定缓存池中两个环形缓存队列分别为忙碌队列和空闲队列;
数据缓存模块(2),用于设置网卡驱动从数据链路接收数据包,将数据包分类,并通过忙碌队列的写指针依次将分类后数据包缓存到忙碌队列中,再将忙碌队列中缓存数据包的地址依次映射到空闲队列;
缓存地址获取模块(3),通过空闲队列读指针获取缓存数据包在忙碌队列的最新地址;
数据处理模块(4),用于通过上层应用通过忙碌队列的读指针依次获取缓存的数据包,对数据包进行处理,并在数据包处理完成后,通过空闲队列的写指针依次释放该处理完的缓存数据包在忙碌队列的地址。
8.如权利要求7所述的网卡数据包缓存管理装置,其特征在于,还包括:
缓存数量确定模块(5),用于获取忙碌队列及空闲队列实时的读指针和写指针,并根据两个队列各自实时的读写指针的关系,判断缓存数据包在存储池的状态,以及是否需要增设缓存池。
9.一种终端,其特征在于,
处理器、存储器,其中,
该存储器用于存储计算机程序,该处理器用于从存储器中调用并运行该计算机程序,使得终端执行上述权利要求1-6任一项所述的方法。
10.一种存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述权利要求1-6任一项所述的方法。
技术总结