一、定时器简介
1、定时器的作用
定时器是Linux内核提供的一种机制,可用于应用程序的任务调度和风波管理。在Linux内核中linux查看操作系统,许多网路、文件系统等子系统都使用定时器来实现其功能。
2、定时器的分类
定时器可分为软定时器和硬定时器。软定时器基于内核定时器服务机制,使用内核时钟进行定时操作。而硬定时器是指直接使用外部设备生成的定时讯号来实现的,如定时中断器。
3、定时器的工作原理
内核中定时器的实现通常基于定时器数组的形式,即内核维护一个全局定时器数组redhat linux下载,每位定时器都有一个时间值,按时间值排序。内核会不断遍历该数组,找出最先触发的定时器并执行相应的反弹函数linux内核定时器,完成一次定时操作。
二、定时器的使用
1、软定时器的使用
在Linux内核中,软定时器由structtimer_list结构体来表示,其定义见下边的代码。
struct timer_list { struct list_head entry; // 定时器链表节点 unsigned long expires; // 定时器超时时间 void (*function)(unsigned long); // 定时器回调函数 unsigned long data; // 回调函数参数 struct tvec_t_base tmp; // 定时器所属的时间片 };
可以使用函数init_timer()来初始化定时器,并使用add_timer()来添加到内核定时器数组中,start_timer()启动定时器,del_timer()删掉定时器,如下:
struct timer_list my_timer; static void my_timer_callback(unsigned long data) { /*do something*/ } void setup_timer(void) { init_timer(&my_timer); my_timer.expires = jiffies + HZ; my_timer.function = my_timer_callback; my_timer.data = 10; add_timer(&my_timer); } void delete_timer(void) { del_timer(&my_timer); }
2、硬定时器的使用
硬定时器一般由硬件设备提供定时讯号,通常使用irq时间来实现。程序须要通过ioctl指定定时器的触发方法和频度,并使用io操作来操作硬件。
三、定时器的实现原理
1、定时器的数据结构
在Linux内核中,每位定时器都表示为一个structtimer_list结构体变量。据悉,内核还维护了一个全局定时器数组timer_list_head,它包含了处于等待时间的所有定时器。每次定时器超时时,内核会遍历数组并执行“雷同”(相同)超时时间的定时器的反弹函数。
2、定时器的实现方法
定时器有两种实现方法,软件定时器和硬件定时器。软件定时器一般使用定时器系统进程linux内核定时器,硬件定时器一般使用系统内核中断。
四、定时器的优化
1、红黑树
在Linux2.6中,定时器数据结构由单数组(2.4内核)修改为黑红树。这些方式通过在O(log(n))时间内检测所有截至仍未完成的定时器,将时间复杂度从O(n)增加到O(logn)。这样,在内核中维护的定时器数目越多时,速率的提升就越显著。
2、tickless内核
在tickless内核模式下,内核只在定时器正式到期时才唤起处理器。与使用定期节拍比较,与tickless内核模式相比,系统自身消耗的CPU时间更少。通过节约定期节拍带来的成本,在tickless内核模式下,更多的CPU处理能力可以用于执行其他任务。
二者结合使用可以提升定时器性能。