一种基于动态预测的网络驱动层数据包接收方法和系统技术方案

技术编号:9768228 阅读:169 留言:0更新日期:2014-03-15 23:22
本发明专利技术公开了一种基于动态预测的网络驱动层数据包接收方法,包括:建立空白链表和循环队列,并创建内核线程和内核定时器,接收网络设备中断,执行中断处理程序,并在进入中断处理程序后立即停止接收网络设备中断,判断网络设备中断指令的类型是接收指令还是错误指令,如果是接收指令,则判断接收指令的接收描述符中数据到达位是否为0,如果不是则判断空白链表中数据包缓存的数量是否低于阈值,如果不是则从空白链表中获取一个新数据包缓存,判断是否成功获取,如果不是则统计当前接收描述符对应的数据包缓存中有效数据的长度,并丢弃有效数据。本发明专利技术能够计算预分配数据包缓存的数量,以适应网络流量的变化,防止在数据流量较低时耗费过多内存。

【技术实现步骤摘要】
一种基于动态预测的网络驱动层数据包接收方法和系统
本专利技术属于网络
,更具体地,涉及一种基于动态预测的网络驱动层数据包接收方法和系统。
技术介绍
网络驱动在接收数据包的过程中采用两种方式,传统中断I/O方式和NAPI (NewAPI)方式。传统中断I/O方式在每次网络设备中断过程中仅处理一个数据包,优点是在数据流量不是很大的情况下,响应及时,节省系统资源;然而,如果数据流量较大,高频的中断调用将会过多的占用CPU时间,影响服务器的性能。NAPI (NEW API)是Linux系统中采用的有别于传统方式的数据包接收方式,NAPI方式结合中断触发和主动轮询方式接收数据,减少了数据包接收中断的频率以及高频中断调度造成的系统开销;在数据流量较高并且数据包较小时具有较高的效率;但其仍然存在一些缺点:由于采用了软件中断的方式,会有一定的延迟,当数据流量较低时,NAPI方式比传统中断I/O方式效率更低,并且当数据包较大时,申请数据包缓存和复制数据将占用大量的处理时间。
技术实现思路
针对现有技术的以上缺陷或改进需求,本专利技术提供了一种基于动态预测的网络驱动层数据包接收方法和系统,其目的在于,加速网络设备中断处理过程,使得每次数据包接收中断不需要申请数据包缓存来拷贝数据,并在每次中断过程中尽可能多的接收数据包,降低网络设备的中断频率,通过记录每次中断过程中接收到的数据包数量,来动态预测网络流量的高低,并动态计算预分配数据包缓存的数量,以适应网络流量的变化,防止在数据流量较低时耗费过多内存。为实现上述目的,按照本专利技术的一个方面,提供了一种基于动态预测的网络驱动层数据包接收方法,包括以下步骤:(I)建立空白链表和循环队列,并创建内核线程和内核定时器,其中空白链表用于保存内核线程分配的数据包缓存,循环队列用于保存每次网络设备中断所产生的状态数据,内核线程用于分配数据包缓存和进行错误处理,并将数据包缓存插入空白链表,内核定时器用于定时唤醒内核线程;(2)接收网络设备中断,执行中断处理程序,并在进入中断处理程序后立即停止接收网络设备中断;(3)判断网络设备中断指令的类型是接收指令还是错误指令,如果是接收指令,则转入步骤(4),如果是错误指令,则转入步骤(10);(4)判断接收指令的接收描述符中数据到达位是否为0,如果是则过程结束,转入步骤(12),如果不是则转入步骤(5);(5)判断空白链表中数据包缓存的数量是否低于阈值,如果是则转入步骤(6),如果不是则转入步骤(7);(6)设置数据包缓存分配标志,并唤醒内核线程,以分配数据包缓存:(7)从空白链表中获取一个新数据包缓存,判断是否成功获取,如果是则转入步骤(8),如果不是则转入步骤(9);(8)解除当前接收描述符对应的数据包缓存,并将新数据包缓存挂载到该接收描述符;(9)统计当前接收描述符对应的数据包缓存中有效数据的长度,并丢弃有效数据,不改变当前接收描述符数据包缓存;(10)判断错误指令的类型,如果是致命错误,则转入步骤(11),否则统计错误数据;(11)停止接收上层发送的数据包,设置网络设备错误标志,唤醒内核线程以进行错误处理;(12)在循环队列中保存本次的状态数据,打开网络设备中断。优选地,空白链表包括一个数据包缓存的指针和一个计数器,指针指向链表的第一个元素,初始时为空,计数器用于记录链表中元素的数量,初始时为0,循环队列是由η个元素的环形数组组成,用于保存状态数据,每个状态数据包括三个组成部分,分别用于记录一次中断当中接收到的数据包数量的计数器,用于记录开始接收第一个数据包的时间的变量,以及用于记录接收完最后一个数据包的时间的变量,初始时循环队列置为O。优选地,内核线程和内核定时器在驱动程序加载时被创建,内核线程在完成数据包缓存分配或错误处理后,进入休眠状态,内核定时器时间到期后,唤醒休眠状态的内核线程,以进行数据包缓存分配,并修改定时器时间,以在下一次时间到期后再次唤醒内核线程。优选地,步骤(6)中分配数据包缓存的步骤包括以下子步骤:(6-1)根据循环队列保存的状态数据,计算需要分配的数据包缓存数量(6-2)根据步骤(6-1)计算的需要分配的数据包缓存数量,分配对应数量的数据包缓存,对于分配的每一个数据包缓存,将其插入空白链表;(6-3)清除数据包缓存分配标志,内核线程进入休眠状态。优选地,步骤(6-1)中的计算过程包括以下子步骤:(6-1-1)计算接收单个数据包所需时间,并计算其与网络设备接收描述符数量的乘积--ΜΕ ;(6-1-2)获取循环队列中数据包的总数量SUM, 以及接收完成最后一个数据包的时间与开始接收第一个数据包的时间的差值TN ;(6-1-3)根据乘积--ΜΕ与差值TN计算最多需要分配的数据包缓存数量,计算方式为 SUM* (--ΜΕ/ΤΝ);(6-1-4)获取总共需要分配的数据包缓存数量,其为最多需要分配的数据包缓存数量和当前空白链表中剩余数据包缓存数量的差值。优选地,步骤(11)中的错误处理过程包括以下子步骤:(11-1)根据错误指令的类型,调用错误处理函数进行处理;(11-2)清除网络设备错误标志,开始接收上层发送的数据包,内核线程进入休眠状态。按照本专利技术的另一方面,提供了一种基于动态预测的网络驱动层数据包接收系统,包括:第一模块,用于建立空白链表和循环队列,并创建内核线程和内核定时器,其中空白链表用于保存内核线程分配的数据包缓存,循环队列用于保存每次网络设备中断所产生的状态数据,内核线程用于分配数据包缓存和进行错误处理,并将数据包缓存插入空白链表,内核定时器用于定时唤醒内核线程;第二模块,用于接收网络设备中断,执行中断处理程序,并在进入中断处理程序后立即停止接收网络设备中断;第三模块,用于判断网络设备中断指令的类型是接收指令还是错误指令,如果是接收指令,则转入第四模块,如果是错误指令,则转入第十模块;第四模块,用于判断接收指令的接收描述符中数据到达位是否为0,如果是则过程结束,转入第十二模块,如果不是则转入第五模块;第五模块,用于判断空白链表中数据包缓存的数量是否低于阈值,如果是则转入第六模块,如果不是则转入第七模块;第六模块,用于设置数据包缓存分配标志,并唤醒内核线程,以分配数据包缓存:第七模块,用于从空白链表中获取一个新数据包缓存,判断是否成功获取,如果是则转入第八模块,如果不是则转入第九模块;第八模块,用于解除当前接收描述符对应的数据包缓存,并将新数据包缓存挂载到该接收描述符;第九模块,用于统计当前接收描述符对应的数据包缓存中有效数据的长度,并丢弃有效数据,不改变当前接收描述符数据包缓存;第十模块,用于判断错误指令的类型,如果是致命错误,则转入第十一模块,否则统计错误数据;第十一模块,用于停止接收上层发送的数据包,设置网络设备错误标志,唤醒内核线程以进行错误处理;第十二模块,用于在循环队列中保存本次的状态数据,打开网络设备中断。总体而言,通过本专利技术所构思的以上技术方案与现有技术相比,能够取得下列有益效果:1、本专利技术的方法对于每个接收的数据包而言,不需要拷贝数据和申请数据包缓存操作,具有极高的响应时间;2、本专利技术的方法在每次进入中断处理程序之后,关闭了网络设备中断,降低了网络设备对服务器系统的中断频率;3、本本文档来自技高网...

【技术保护点】
一种基于动态预测的网络驱动层数据包接收方法,其特征在于,包括以下步骤:(1)建立空白链表和循环队列,并创建内核线程和内核定时器,其中空白链表用于保存内核线程分配的数据包缓存,循环队列用于保存每次网络设备中断所产生的状态数据,内核线程用于分配数据包缓存和进行错误处理,并将数据包缓存插入空白链表,内核定时器用于定时唤醒内核线程;(2)接收网络设备中断,执行中断处理程序,并在进入中断处理程序后立即停止接收网络设备中断;(3)判断网络设备中断指令的类型是接收指令还是错误指令,如果是接收指令,则转入步骤(4),如果是错误指令,则转入步骤(10);(4)判断接收指令的接收描述符中数据到达位是否为0,如果是则过程结束,转入步骤(12),如果不是则转入步骤(5);(5)判断空白链表中数据包缓存的数量是否低于阈值,如果是则转入步骤(6),如果不是则转入步骤(7);(6)设置数据包缓存分配标志,并唤醒内核线程,以分配数据包缓存:(7)从空白链表中获取一个新数据包缓存,判断是否成功获取,如果是则转入步骤(8),如果不是则转入步骤(9);(8)解除当前接收描述符对应的数据包缓存,并将新数据包缓存挂载到该接收描述符;(9)统计当前接收描述符对应的数据包缓存中有效数据的长度,并丢弃有效数据,不改变当前接收描述符数据包缓存;(10)判断错误指令的类型,如果是致命错误,则转入步骤(11),否则统计错误数据;(11)停止接收上层发送的数据包,设置网络设备错误标志,唤醒内 核线程以进行错误处理;(12)在循环队列中保存本次的状态数据,打开网络设备中断。...

【技术特征摘要】
1.一种基于动态预测的网络驱动层数据包接收方法,其特征在于,包括以下步骤: (1)建立空白链表和循环队列,并创建内核线程和内核定时器,其中空白链表用于保存内核线程分配的数据包缓存,循环队列用于保存每次网络设备中断所产生的状态数据,内核线程用于分配数据包缓存和进行错误处理,并将数据包缓存插入空白链表,内核定时器用于定时唤醒内核线程; (2)接收网络设备中断,执行中断处理程序,并在进入中断处理程序后立即停止接收网络设备中断; (3)判断网络设备中断指令的类型是接收指令还是错误指令,如果是接收指令,则转入步骤(4),如果是错误指令,则转入步骤(10); (4)判断接收指令的接收描述符中数据到达位是否为0,如果是则过程结束,转入步骤(12),如果不是则转入步骤(5); (5)判断空白链表中数据包缓存的数量是否低于阈值,如果是则转入步骤(6),如果不是则转入步骤(7); (6)设置数据包缓存分配标志,并唤醒内核线程,以分配数据包缓存: (7)从空白链表中获取一个新数据包缓存, 判断是否成功获取,如果是则转入步骤(8),如果不是则转入步骤(9); (8)解除当前接收描述符对应的数据包缓存,并将新数据包缓存挂载到该接收描述符; (9)统计当前接收描述符对应的数据包缓存中有效数据的长度,并丢弃有效数据,不改变当前接收描述符数据包缓存; (10)判断错误指令的类型,如果是致命错误,则转入步骤(11),否则统计错误数据; (11)停止接收上层发送的数据包,设置网络设备错误标志,唤醒内核线程以进行错误处理; (12)在循环队列中保存本次的状态数据,打开网络设备中断。2.根据权利要求1所述的网络驱动层数据包接收方法,其特征在于, 空白链表包括一个数据包缓存的指针和一个计数器,指针指向链表的第一个元素,初始时为空; 计数器用于记录链表中元素的数量,初始时为O ; 循环队列是由η个元素的环形数组组成,用于保存状态数据; 每个状态数据包括三个组成部分,分别用于记录一次中断当中接收到的数据包数量的计数器,用于记录开始接收第一个数据包的时间的变量,以及用于记录接收完最后一个数据包的时间的变量,初始时循环队列置为O。3.根据权利要求1所述的网络驱动层数据包接收方法,其特征在于,内核线程和内核定时器在驱动程序加载时被创建,内核线程在完成数据包缓存分配或错误处理后,进入休眠状态,内核定时器时间到期后,唤醒休眠状态的内核线程,以进行数据包缓存分配,并修改定时器时间,以在下一次时间到期后再次唤醒内核线程。4.根据权利要求1所述的网络驱动层数据包接收方法,其特征在于,步骤(6)中分配数据包缓存的步骤包括以下子步骤: (6-1)根据循环队列保存的状态数据,计算需要分配的数据包缓存数量(6-2)根据步骤(6-1)计算的需要分配的数据包缓存数量,分配对应数量的数据...

【专利技术属性】
技术研发人员:陈进才刘玉虎周功业周可张英男余乐陈涛
申请(专利权)人:华中科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1