一种基于Linux内核定时器的时间管理方法与流程

文档序号:12176642阅读:146来源:国知局
本发明属于网络设备
技术领域
:,具体为一种网络设备的基于Linux内核定时器的时间管理方法。
背景技术
::现在的网络设备为了实现个性化的各种业务需求,会定时执行某些任务,或者让某些功能在特定的时间段内对某些用户生效。这样就需要一套时间管理的机制,为这些服务提供支持。本技术就是针对这种业务提出的一种在内核中实现的时间管理机制,它基于内核的定时器实现,因此,实时性较好。现有的时间管理方案有两种:一种是跟防火墙相关的规则,通过防火墙自身的时间匹配机制实现。另一种是在应用层实现一个定时器,采用轮训的方式执行跟时间相关的任务,尤其是跟防火墙相关的规则,缺点有如下两点:1、其业务必须跟防火墙是强相关的,如设置防火墙规则时加上对时间的匹配。2、防火墙规则是链式匹配,即,一个网络数据包经过设备,总是从第一条进行匹配,当设置的防火墙规则较多时,在最坏的情况下,可能需要匹配所有的规则,这样效率将大大降低,基于时间的业务逻辑处理效率能力明显不足,操作也会更加繁琐,而同样对于应用层的定时,其是采用轮训的方式进行时间判断的,对CPU的利用率就低一些。并且,如果是内核任务的话,应用层的定时器处理起来就会更繁琐。如,中国专利文献公开号为103959712A公开的一种大型防火墙集群中的定时管理,包括三个或更多个防火墙处理节点,这些防火墙处理节点基于进行报告的节点在先前存在的集群中的成员资格,来报告主节点状态。控制器使用所报告的状态来指派分布式防火墙集群中的主节点。所报告的主节点状态包括:如果节点是先前存在的集群的成员,则为所报告的有资格成为主节点,如果节点不是先前存在的集群的成员,则所报告的主节点状态包括报告没有资格成为主节点,如果节点是先前存在的集群中的主节点,则为所报告的主节点状态,以及对于已经超时的节点所报告的有资格成为主节点。又如,专利申请号为201220317374.2的一种网络应用层流量管理系统通过应用层的定时。上述两种专利技术方案均存在前文所述的缺点。技术实现要素:本发明的目的是提供一种稳定性高、处理更加简洁且基于时间的业务逻辑处理效率更高的基于Linux内核定时器的时间管理方法。本发明的上述技术目的是通过以下技术方案得以实现的:一种基于Linux内核定时器的时间管理方法:步骤1,当网络设备启动时,初始化若干条时间链表;同时,开启一个Linux内核的定时器;步骤2,然后设置时钟中断使定时器执行函数每间隔一段时间执行一次,根据需要依次遍历所述时间链表,决定是否开启或关闭相应任务。上述技术方案中,为基于Linux内核的网络设备提供了一种设计时间管理的方法,它为众多依赖于时间的业务逻辑提供了基础设施建设,基于此时间组的实现办法,会很大限度的提高基于时间的业务逻辑处理效率,为基于时间任务的功能提供一种新的选择的同时,提高了时间匹配的效率,系统的稳定性更高,数据流通信也更加顺利。作为对本发明的优选,步骤1中初始化的时间链表为3个。作为对本发明的优选,步骤1中初始化的时间链表分别为d_list、h_list、m_list,d_list表示为天变化链表,h_list表示为小时变化链表,m_list表示为分钟变化链表。作为对本发明的优选,定时器执行函数的两次执行之间的间隔时间为5-20秒。作为对本发明的进一步优选,定时器执行函数的两次执行之间的间隔时间为10秒。作为对本发明的优选,定时器执行函数设置一个变量oldtime,记录上一次更新时的时间。作为对本发明的优选,当定时器执行函数运行时,将当前时间nowtime与oldtime进行比较,如果处于同一分钟内,则不必遍历时间链表。作为对本发明的优选,当定时器执行函数发现当前时间nowtime跟oldtime不同时,对分钟变化链表进行遍历,判断是否有因为分钟变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应任务。作为对本发明的优选,分钟变化判断完成后,接着对小时变化链表进行遍历,判断是否有因为小时变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应任务。作为对本发明的优选,小时变化判断完成后,接着对天变化链表进行遍历,判断是否有因为天变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应任务。本发明技术方案具有稳定性高、处理简洁、基于时间的业务逻辑处理效率更高等诸多优点。附图说明图1是本发明优选实施例的流程示意图。具体实施方式以下优选实施例仅仅是对本发明的解释,其并不是对本发明的限制,本领域技术人员在阅读完本说明书后可以根据需要对本实施例做出没有创造性贡献的修改,但只要在本发明的权利要求范围内都受到专利法的保护。优选实施例:如图1所示,本实施例基于Linux内核定时器的时间管理方法,具体按如下步骤进行:步骤1,当网络设备启动时,初始化若干条时间链表;在步骤1执行的同时,开启一个Linux内核的定时器;步骤2,然后设置时钟中断使定时器执行函数每间隔一段时间执行一次,根据需要依次遍历所述时间链表,决定是否开启或关闭相应任务。在上述技术方案中,步骤1中初始化的时间链表优选为3个,步骤1中初始化的时间链表分别为d_list、h_list、m_list,d_list表示为天变化链表(也即日期变化链表),h_list表示为小时变化链表,m_list表示为分钟变化链表。定时器执行函数的两次执行之间的间隔时间为5-20秒,更优选为10秒。定时器执行函数设置一个变量oldtime,记录上一次更新时的时间。当定时器执行函数运行时,将当前时间nowtime与oldtime进行比较,如果处于同一分钟内,则不必遍历时间链表。当定时器执行函数发现当前时间nowtime跟oldtime不同时,对分钟变化链表进行遍历,判断是否有因为分钟变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应任务。分钟变化判断完成后,接着对小时变化链表进行遍历,判断是否有因为小时变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应任务。小时变化判断完成后,接着对天变化链表进行遍历,判断是否有因为天变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应任务。下述为对上述初步方案更为细致的阐述。本发明时间管理方案的基本思路是:网络设备启动时,会在内核中初始化3条链表,d_list、h_list、m_list,分别表示三种时间单位的变化链表(天变化、时变化、分变化)。同时,开启一个内核定时器,设置时钟中断使定时器执行函数每10秒钟执行一次,根据需要依次遍历这三条链表,来决定是否开启或关闭某些任务,也即某些应用或者功能等。功能描述:本发明的主要功能是提供了一种新的时间管理的办法,为基于时间任务的功能提供一种新的选择的同时,提高了时间匹配的效率。结构描述:本发明主要针对网络设备的时间相关的任务,有两块技术内容:1、内核定时器执行函数对三个时间变化链表的维护。2、时间的变化,对相关任务的开启和关闭。实现细节:1.时间中断触发自定义内核定时器的工作:为了避免定时器执行函数触发频率过高,将定时器执行函数的时间间隔设置为10秒,同时设置一个变量oldtime,记录上一次更新时的时间,当定时器执行函数运行时,会将当前时间nowtime与oldtime进行比较,如果处于同一分钟内(从1970-1-1零点到当前经历的分钟数)的话,则不必遍历时间链表;如果nowtime跟oldtime不同,则说明分钟发生了变化,此时才会开始对时间链表进行遍历。这里需要说明的是,将定时器执行间隔设置为10秒,而对时间的比较只精确到分钟,那么为什么不将定时器执行时间的间隔设置为60秒呢?好处在于,大多数网络设备,包括现在的手机、Pad等,都可以由用户设定当前时间,因此,将定时器的时间间隔设置为10秒,就是考虑到当前时间可能会被用户手动改变,这样定时器最慢10秒后就会得到响应,提高了及时性,当然对这个系统的运行也是非常有利的;当定时器执行函数发现当前时间nowtime跟oldtime不同时,第一步:会先对m_list(分钟变化链表)进行遍历,判断是否有因为分钟变化,使当前时间匹配某些任务设定的生效/失效时间,如果有,那么启动/关闭相应的任务,第二步:判断小时是否发生了变化,比如:oldtime表示的时间是6:59分,而nowtime表示7:00,分钟是发生了变化,与此同时,小时也发生了变化,因此,如果小时发生了变化,那么需要遍历h_list(小时变化链表),判断是否因为小时变化,而需要启动或关闭任务,第三步:同理,小时变化也可能引起天(日期)的变化,如oldtime表示2015-3-31日23:59分,那么由于nowtime的分钟变化,使得当前时间变化成了2015-4-1日。因此,需要判断有没有日期变化而引起的任务开启或关闭。2.时间的变化,对相关任务的开启和关闭:下面用示例描述如何在时间变化时,对相关任务开启和关闭,假设某一个任务的生效日期是2016-2-10的8:30到2016-3-10的9:30,其余时间该任务都应该处于关闭状态。由第1点的描述可知,该任务只有在2016-2-10的8点和2016-3-10的9点这两个边界时间点才会挂在到m_list(分钟变化链表)上,中间的时间都会从m_list上去除而挂载到d_list(小时变化链表)链表上,这两个时间段外,不会挂载到任一链表上,同时会关闭任务,这样,每次时间变化时,对分钟变化链表的遍历是比较快速的。因为大多数任务都不会长时间挂载到该链表上,也就是说,分钟变化链表在正常情况下,会长时间处于空链表状态。因此,这样的时间管理会大幅度减少时间匹配的花销。另外,为了更好地配合该时间管理方法,对Linux内核的流控方式作出改进,改进的流控方式为首先在Linux内核中的sk_buff中有mark字段,同时加入index字段,mark字段用来进行带宽对象的流控,index是无符号整数,把其分成两部分,高16位用来进行服务流控,低16位用来进行单IP流控;再建立数据包列队。然后,数据包再通过流控方法进行控制是否出队:数据包按照服务流控方法进行控制,如果数据包可以出队,则依次进行带宽对象流控方法、单IP流控方法进行控制,如果数据包再上述的三个流控方法任意一个不能出队,则重新排队。最后,出队的数据包经过发包调度方法选择后进行发包。上述的建立数据包列队的方法为:建立了一个含300元素的无符号整形数组,每个无符号整形数组是32位,每一位对应9600队列中的一个(其中第0个队列为不进行流控的队列),该位为1,表示该位对应的队列被使用,通过该无符号整形数组的计算实现快速选择队列。上述的单IP流控方法为IP地址共32位,现把其看成两部分,前16位和后16位,前16位通过一个大小为65535的指针数组A来表示,数组下标即表示具体IP的前16位值,后16位也是通过一个65535的数组来表示,但是其是动态分配的,后16位的数组中,数组中每个结构中包含flag和index字段,flag表示该IP是否要流控,index是一个索引值,为无符号整数,当一个IP数据包进入时,先取得该IP的前16位,以该值作为前16位数组的下标,如果数组内容为空,则表示没有建立过该前16位对应的后16位的数组,需要创建;如果数组内容不空,则可以根据该指针内容来访问对应的后16位数组,再根据对应值的flag和index进行流控。上述的单IP流控方法快速选择队列的具体步骤如下(计算index的方法):(1)、先看无符号整数值是否为全1,通过和0xffffffff与得知;(2)、如果无符号整数值为全1,则取数组中下一个整数继续步骤(1);(3)、如果无符号整数值不是全1,计算低16位是否为全1;(4)、如果无符号整数值为全1,则把该整数值右移16位,否则不变;(5)、计算无符号整数值的低8位是否为全1;(6)、如果无符号整数值为全1,则把该整数值右移4位,否则不变;(7)、计算无符号整数值的低2位是否为全1;(8)、如果无符号整数值为全1,则把该整数值右移2位,否则不变;(9)、计算无符号整数值的低1位是否为1,不是则第二位为1,则找到了具体的位置,并能够计算出对应的数组下标;(10)、当IP不流控时,把相应的位置0。例如,当一个连接的第一个数据包到来时,模块去查找对应的IP的flag,如flag=1,表示该IP需要进行流控,否则返回0并退出;然后检查index值是否小于0,小于0表示标签还没有分配,根据单IP流控快速选择队列算法,计算index的值;如果index值大于0,表示分配过了,则直接用该值。同时,在内核的链接跟踪结构中添加index字段,当数据包取得index时,把该值同时赋给链接跟踪的index。上述的发包调度方法的具体步骤如下:(1)、每个队列有指向前一个和后一个队列的指针,队列形成一个双向链表,每个队列是发送链表中的一个节点,同时,只有有数据包等待发送的队列,才会加入发送链表,当队列中没有数据包时,队列从发送链表中删除;(2)、发送链表建立一个链表头和一个当前发包链表节点指针,把当前发包链表节点指针指向的队列进行数据包出队,再根据流控方法检查该数据包是否能够发送,如果可以,发送该数据包,否则把该数据包重新入队,且是放到队列的头,同时把当前发包链表节点指针下移;(3)、发送链表是在数据包入队的时候建立的,当有数据包进入时,调用入队函数,该函数检测该数据包对应的队列是否在双向队列链表中,如果不在,把对应队列加入双向队列链表,同时把双向队列链表的当前发包链表节点指针指向该队列;否则,直接把双向队列链表的当前发包链表节点指针指向该队列,当出队发包时,会优先发送刚入队的队列的数据包。具体每个队列中数据包流控的计算算法如下:带宽的计算是在一秒内通过的数据长度,在内核里面,没有秒的概念,而是jiffies,在linux内核中,一秒一般被分成250份(要看内核中宏的定义),所以一个jiffies就是1/250秒,带宽如果是a,那么一个jiffies的流量就是a/250,每个队列中有保存上次数据包到来的jiffies_last,每个jiffies的流量jiffies_byte(字节),现在允许通过的字节数bytes,现在最大允许通过的字节数burst。该队列中,每来一个数据包,都会计算现在的jiffies和jiffies_last的差值,该差值乘以jiffies_byte,再加上现在允许通过的字节数bytes,算出现在可以通过的字节数bytes,如果bytes大于burst,则bytes等于burst。最后,通过比较数据包长度和bytes的关系,大于bytes,则不同出队;小于bytes则出队,发送该数据包,同时,bytes值减去该数据包长度。链接跟踪是现在防火墙的一种技术,通过这段话可以实现高性能,因为index只需计算一次,以后通过链接的index直接赋值即可,具体部署如下:第一阶段:模块的安装:本流控模块以内核模块的方式提供,用户可以通过insmod命令进行按照。第二阶段:标签的设置:Iptables扩展了一个target,该target通过调用流控模块的函数,来获取单ip流控和服务流控的标签,即index。具体方式是在iptables的filter表的FORWARD链的链接跟踪规则后面加入扩展的target,这样就实现了链接的第一个数据包会去获取标签,其他走链接跟踪,同时在连接跟踪模块加入代码,使数据包的index标签赋值给链接的标签index。这两段的意思实质是否就是将流控方法模块化设置为独立模块。本发明所采取的技术方案,其稳定性高、处理更加简洁且基于时间的业务逻辑处理效率更高,为众多依赖于时间的业务逻辑提供了基础设施建设,基于此时间组的实现办法,会很大限度的提高基于时间的业务逻辑处理效率,为基于时间任务的功能提供一种新的选择的同时,提高了时间匹配的效率,系统的稳定性更高,数据流通信也更加顺利,还能提高设备的运算速率,设备物理性能也可提升。本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属
技术领域
:的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1