4412 Linux定时器
一、Linux定时器基础知识
1.1 定时器的使用范围
延后执行某个操作,定时查询某个状态;前提是对时间要求不高的地方
1.2 内核时间概念
- Hz:(系统时钟通过CONFIG_HZ来设置,范围是100-1000;HZ决定使用中断发生的频率)

- 1/200 = 5ms,说明4412中是5ms产生一次时钟中断。如果就没有定义的话,默认是100
- 内核的全局变量jiffies:(记录内核自启动来的节拍数,内核之启动以来,产生的中断数)时钟中断,每产生一个中断,jiffies就加1。
- jiffies/HZ:jiffies除以Hz得到内核自启动以来的秒数
2.1 内核定时器的例程
结构体timer_list,函数setup_timer,add_timer,del_timer,mod_timer
struct timer_list {
/*
* All fields that change during normal runtime grouped to the
* same cacheline
*/
struct list_head entry;
unsigned long expires;
struct tvec_base *base;
void (*function)(unsigned long);
unsigned long data;
int slack;
#ifdef CONFIG_TIMER_STATS
int start_pid;
void *start_site;
char start_comm[];
#endif
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
timer_list
timer_list参数
- struct list_head entry双向链表
- unsigned long expires:超时时间,记录什么时候产生时钟中断
- struct tvec_base *base:管理时钟的结构体
- void *(function)(unsigned long):时钟中断产生之后的动作
- unsigned long data:传递的参数
#define setup_timer(timer, fn, data) \
do { \
static struct lock_class_key __key; \
setup_timer_key((timer), #timer, &__key, (fn), (data));\
} while () void add_timer(struct timer_list *timer);
int del_timer(struct timer_list * timer);
int mod_timer(struct timer_list *timer, unsigned long expires);
2.2 双向链表
platform_driver_register→driver_register
→bus_add_driver
→struct bus_type *bus
→struct subsys_private *p
→struct kset subsys→struct list_head list;
2.3 mod_timer相当于
mod_timer = del_timer(time);timer->expires = expires;add_timer(timer);
3 内核定时器实现的分析
从内核定时器初始化到定时器例程
3.1 add_timer如何添加定时器
add_timer→mod_timer
→__mod_timer(内核函数有下划线,表示“局部函数”)
→internal_add_timer
3.2 struct tvec_base *base结构体分析--管理内核时钟的结构体
struct tvec_base {
spinlock_t lock; //自旋锁
struct timer_list *running_timer; //内核中正在处理的定时器
unsigned long timer_jiffies; //内核目前正在处理的定时器时间
unsigned long next_timer;
struct tvec_root tv1;
{
struct list_head vec[TVR_SIZE];//256长度数组
TVR_SIZE→#define TVR_SIZE (1 << TVR_BITS)
TVR_BITS=;
宏定义CONFIG_BASE_SMALL=
TVR_SIZE =
}
struct tvec tv2; //64长度数组
struct tvec tv3;
struct tvec tv4;
struct tvec tv5;
}
per_cpu 与CPU核多少有关
DEFINE_PER_CPU看到这样的变量,就表明这个变量是和CPU核相关的。
有一些宏定义是在内核目录的config文件配置的
3.3 internal_add_timer
分析idx参数
如果idx<256,则将time_list添加到TV1
如果idx<256*64,则将time_list添加到TV2
如果idx<256*64*64,则将time_list添加到TV3
如果idx<256*64*64*64,则将time_list添加到TV4
如果idx > 0xffffffffUL,则将time_list添加到TV5
3.4 list_add_tail
双向链表操作函数都在include/linux/list.h文件中
4412 Linux定时器的更多相关文章
- linux定时器用法
linux定时器 原文出自http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法 ...
- linux定时器crontab
linux定时器crontab用法: 1.基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示 ...
- Linux 定时器应用【转】
Linux 定时器应用 实验目的 阅读 Linux 相关源代码,学习 Linux 系统中的时钟和定时器原理,即,ITIMER_REAL实时计数,ITIMER_VIRTUAL 统计进程在用户模式执行的时 ...
- linux定时器(crontab)实例
linux实验示例----实现每2分钟将“/etc”下面的文件打包存储到“/usr/lobal”目录下 ·Step1:编辑当前用户的crontab并保存终端输入:>crontab -u root ...
- Linux定时器相关源码分析
Linux的定时器使用时间轮算法.数据结构不难理解,核心数据结构与散列表及其相似,甚至可以说,就是散列表.事实上,理解其散列表的本质,有助于对相关操作的理解. 数据结构 这里先列出一些宏,稍后解释: ...
- Smart210学习记录-----linux定时器
1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 stru ...
- linux 定时器编程实例(完善中).....
最近在写linux 下的定时器编程实验,测试发现 usleep函数在 x86 架构下的定时还是比较准确的,在arm9下 就不太准了. 今天用linux 下的setitimer()函数进行了定时 器的测 ...
- linux定时器HZ和Jiffies
1.linux HZ Linux核心几个重要跟时间有关的名词或变数,以下将介绍HZ.tick与jiffies. HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),H ...
- linux定时器
我们常常有设置系统在某一时间执行相应动作的需求,比如设置电脑什么时候自动锁屏,什么时候自动关机,设置应用程序什么时候自动运行,什么时候自动退出.这些与时间相关的功能,都需要依靠操作系统中的定时器来实现 ...
随机推荐
- Vagrant 手册之 box - box 的信息格式
原文地址 创建 Vagrant 的 box 时,可以提供在运行 vagrant box list -i 时展示的与用户相关的其他信息.例如,可以打包 box,以包含有关该 box 的作者和网站信息: ...
- Win7 VS2019安装后创建C++工程失败解决
VS2019正式上手,第1个问题创建不了工程,看起来非常类似之前VS2017更新 解决办法 https://github.com/Microsoft/msbuild/issues/4286 和上次的问 ...
- vuejs基础-事件修饰符
事件修饰符: .stop 阻止冒泡 .prevent 阻止默认事件 .capture 添加事件侦听器时使用事件捕获模式 .self 只当事件在该元素本身(比如不是子元素)触发时触发回调 .once 事 ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- HNOI2019fish
\({\rm fish}\) 20分: 六个for,点积判锐角钝角. #include <vector> #include <queue> #include <cmath ...
- JS原型链详解
最近面试被问到了就决定好好深入理解原型链 对象 要清楚原型链,首先要弄清楚对象: 普通对象 最普通的对象:有__proto__属性(指向其原型链),没有prototype属性. 原型对象(person ...
- P4036 [JSOI2008]火星人(splay+hash+二分)
P4036 [JSOI2008]火星人 Splay维护hash,查询二分 $a[x].vl=a[lc].vl*ha[a[rc].sz+1]+a[x].w*ha[a[rc].sz]+a[rc].vl$ ...
- tornado后台小框架
import tornado.ioloop import tornado.web """使用get方法提交过来数据就是用get方法,使用post执行post方法这个框架的 ...
- ScriptManager(脚本控制器)
资料中如实是说: 1, ScriptManager(脚本控制器)是asp.net ajax存在的基础. 2, 一个页面只允许有一个ScriptManager,并且放在其他ajax ...
- 测试微信小程序页面的生命周期
前言:本人是一个初学者,也是第一次写博客,敲键盘的时候还不知道发布后是什么效果,希望内容给其他初学的同学一点帮助,同时加深自己的理解.这篇随笔讲的是Page页面的生命周期,在开发中是基础中的基础,很容 ...