Linux内核定时器--原版
如何使用crontab命令在Linux中设置定时任务

如何使用crontab命令在Linux中设置定时任务在Linux中设置定时任务是一项非常重要的技能,它可以帮助我们自动化重复性的任务,提高工作效率。
而crontab命令是Linux系统中用来管理定时任务的工具。
本文将介绍如何使用crontab命令来设置定时任务。
一、什么是crontab命令Crontab(Cron Table)是Linux系统中用来管理定时任务的工具,它允许用户在指定的时间自动执行特定的命令或脚本。
Crontab命令是由cron守护进程控制的,该守护进程会在指定的时间间隔内检查用户的crontab文件,并执行相应的任务。
二、创建和编辑crontab文件要创建和编辑crontab文件,可以使用以下命令:```crontab -e```这个命令会打开一个文本编辑器,你可以在其中添加或修改定时任务。
三、crontab文件的格式crontab文件中每一行代表一个定时任务,格式如下:分时日月周命令```其中,分表示分钟,时表示小时,日表示日期,月表示月份,周表示星期。
命令是要执行的命令或脚本。
每个字段可以是一个具体的数值,也可以是一个用逗号分隔的数值列表,或者是一个数值范围。
四、设置定时任务的示例以下是一些使用crontab命令设置定时任务的示例:1. 每天晚上8点执行一个命令:```0 20 * * * command```2. 每隔5分钟执行一个命令:```*/5 * * * * command```3. 每个月的1号凌晨3点执行一个命令:```0 3 1 * * command4. 每周一到周五的上午9点执行一个命令:```0 9 * * 1-5 command```五、常用的时间单位符号在crontab文件中,我们可以使用一些特殊的时间单位符号,如下所示:- *:代表所有值,比如在分钟字段中使用 * 表示每分钟都执行。
- */n:表示每隔n个单位执行一次,比如在小时字段中使用 */2 表示每隔两个小时执行一次。
Linux系统重启脚本使用Shell脚本实现对Linux系统的定时重启和自动恢复

Linux系统重启脚本使用Shell脚本实现对Linux系统的定时重启和自动恢复Linux系统是一种广泛使用的操作系统,它在服务器和嵌入式设备中得到了广泛应用。
在实际运行过程中,为了确保系统的正常运行和稳定性,定时重启和自动恢复是必不可少的功能。
本文将介绍如何使用Shell脚本来实现对Linux系统的定时重启和自动恢复。
实施定时重启功能的第一步是创建一个Shell脚本。
通过使用Linux 的定时任务工具cron,我们可以在指定的时间自动运行这个脚本。
打开终端,输入以下命令创建一个新的脚本文件:```shell$ sudo nano restart.sh```接下来,我们需要编写重启脚本的内容。
在脚本中,我们将使用`shutdown`命令来实现重启功能。
以下是一个示例脚本:```shell#!/bin/bashshutdown -r now```保存并关闭文件。
接下来,我们需要为脚本添加执行权限:```shell$ sudo chmod +x restart.sh```现在,我们可以使用cron来设置定时任务。
通过运行以下命令,我们可以编辑当前用户的cron表:```shell$ crontab -e```在cron表中,每行代表一个定时任务。
按下`i`键进入编辑模式,然后添加以下行来设置每天重启的时间:```30 2 * * * /path/to/restart.sh```这样,每天的凌晨2点30分,系统将自动重启。
修改完成后,按下`Esc`键,然后输入`:wq`保存并退出。
现在,我们已经完成了定时重启功能的设置。
从现在起,系统将在指定时间自动执行重启。
另外,为了确保系统在重启后能够自动恢复到之前的状态,我们还可以编写一个自动恢复脚本。
该脚本将在系统重启后自动运行,并执行一系列操作以将系统恢复到正常状态。
继续使用前面创建的`restart.sh`脚本,我们可以在其中添加自动恢复的操作。
以下是一个示例脚本:```shell#!/bin/bash# 这里是自动恢复的操作```在具体的自动恢复操作中,您可以根据实际需求执行需要的命令和操作,比如恢复数据库、重启服务等。
linux定时器和Jiffies

1.linux HZLinux核心几个重要跟时间有关的名词或变数,以下将介绍HZ、tick与jiffies。
HZLinux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。
举例来说,HZ为1000,代表每秒有1000次timer interrupts。
HZ可在编译核心时设定,如下所示(以核心版本2.6.20-15为例):adrian@adrian-desktop:~$ cd /usr/src/linuxadrian@adrian-desktop:/usr/src/linux$ make menuconfigProcessor type and features ---> Timer frequency (250 HZ) --->其中HZ可设定100、250、300或1000。
小实验观察/proc/interrupt的timer中断次数,并于一秒后再次观察其值。
理论上,两者应该相差250左右。
adrian@adrian-desktop:~$ cat /proc/interrupts | grep timer && sleep 1 && cat /proc/interrupts | grep timer0: 9309306 IO-APIC-edge timer0: 9309562 IO-APIC-edge timer上面四个栏位分别为中断号码、CPU中断次数、PIC与装置名称。
要检查系统上HZ的值是什么,就执行命令cat kernel/.config | grep '^CONFIG_HZ='2.TickTick是HZ的倒数,意即timer interrupt每发生一次中断的时间。
如HZ为250时,tick为4毫秒(millisecond)。
3.JiffiesJiffies为Linux核心变数(unsigned long),它被用来记录系统自开机以来,已经过了多少tick。
linux核心函数

linux核心函数Linux 内核是操作系统的核心部分,它提供了操作系统的核心功能,包括进程管理、内存管理、文件系统等。
Linux 内核的源代码中包含了大量的函数,用于实现各种操作系统的功能。
以下是一些Linux 内核中常见的核心函数,它们扮演着关键的角色:1.进程管理函数:–fork():创建一个新的进程。
–exec():在当前进程中执行一个新的程序。
–wait():等待子进程结束。
–exit():终止当前进程。
2.调度和任务管理函数:–schedule():进行进程调度。
–yield():主动让出CPU,将当前进程移动到就绪队列的末尾。
–wake_up_process():唤醒一个等待中的进程。
3.内存管理函数:–kmalloc():在内核中分配内存。
–kfree():释放内核中的内存。
–vmalloc():在虚拟地址空间中分配内存。
4.文件系统函数:–open():打开一个文件。
–read():从文件中读取数据。
–write():向文件中写入数据。
–close():关闭文件。
5.设备驱动函数:–register_chrdev():注册字符设备。
–unregister_chrdev():注销字符设备。
–request_irq():注册中断处理函数。
6.网络函数:–socket():创建套接字。
–bind():将套接字与地址绑定。
–listen():侦听传入连接请求。
–accept():接受传入的连接请求。
7.定时器和时钟函数:–timer_create():创建一个定时器。
–timer_settime():设置定时器的时间。
–gettimeofday():获取当前时间。
8.同步和互斥函数:–spin_lock():获取自旋锁。
–spin_unlock():释放自旋锁。
–mutex_lock():获取互斥锁。
–mutex_unlock():释放互斥锁。
这些函数仅仅是Linux 内核中众多函数的一小部分,Linux 内核的源代码非常庞大而复杂,包含了各种各样的功能和模块。
Linux定时执行程序Cronb

近期要在客户的服务器上实行计划执行程序;就是要定好每天的什么时候;执行什么程序..具体的要求如下:1、每周一至六晚上八点自动执行数据备份操作2、每月1号晚上零晨自动执行数据据备份操作3、每周一至六晚上八点半自动执行一程序;进行数据库数据录入工作起初没啥概念;后来在有经验的同事指导下;开始有所了解每个用户都有各自不同的计划任务列表;用各自的帐户登录后运行crontab -l就可查看到各任务的计划任务情况;使用下列命令可以修改自己的计划任务crontab -e下面为一计划任务的样例每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点0 11 4 mon-wed date上面这句的意思是“每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点显示时间”;你把date改成你想执行的命令;再把执行的时间改了;就可以形成一个定时执行命令了空格之间的参数意义如下分钟小时天月星期要执行的命令详细的请参考下面我从网上抄来的=================================Crontab是一个很方便的在unix/linux系统上定时循环执行某个任务的程序使用cron服务;用 service crond status 查看 cron服务状态;如果没有启动则 service crond start启动它;cron服务是一个定时执行的服务;可以通过crontab 命令添加或者编辑需要定时执行的任务:crontab -u crontab -l列出当前的crontab任务2. crontab -d删除当前的crontab任务3. crontab -e 上面是 crontab -r编辑一个crontab任务;ctrl_D结束4. crontab filename以filename做为crontab的任务列表文件并载入crontab file的格式:crontab 文件中的行由 6 个字段组成;不同字段间用空格或 tab 键分隔..前5 个字段指定命令要运行的时间分钟 0-59小时 0-23日期 1-31月份 1-12星期几0-6;其中 0 代表星期日第 6 个字段是一个要在适当时间执行的字符串例子:MIN HOUR DAY MONTH DAYOFWEEK COMMAND每天早上6点10分10 6 date每两个小时0 /2 date solaris 似乎不支持此种写法晚上11点到早上8点之间每两个小时;早上8点0 23-7/2;8 date每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点0 11 4 mon-wed date1月份日早上4点0 4 1 jan date补充:在使用crontab的时候;要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中的环境变量未必一致;一个比较保险的做法是在运行的脚本程序中自行设置环境变量export1先建一个文件如下; 每天早上5点36分重新启动36 5 reboot2上传到/opt目录3运行命令crontab /opt/crontab -l让配置文件生效:如果让配置文件生效;还得重新启动cron;切记;既然每个用户下的cron配置文件修改后..也要重新启动cron服务器..在Fedora 和Redhat中;我们应该用;rootlocalhost ~ /etc/crond restart如果让crond 在开机时运行;应该改变其运行级别;rootlocalhost ~ chkconfig --levels 35 crond onservice crond status 查看 cron服务状态;如果没有启动则 service crond start启动它; cron服务是一个定时执行的服务;可以通过crontab 命令添加或者编辑需要定时执行的任务Crontab文件的每一行由六个域minutes、hours、day of month、month、day of week、 command组成;域之间用空格或Tab分开;其中:minutes:分钟域;值的范围是0到59hours:小时域;值的范围是0到23day of month:日期;值的范围是1到31month:月份;值的范围是1到12day of week:星期;值的范围是0到6;星期日值为0command:所要运行的命令如果一个域是;表明命令可以在该域所有可能的取值范围内执行..如果一个域是由连字符隔开的两个数字;表明命令可以在两个数字之间的范围内执行包括两个数字本身..如果一个域是由逗号隔开的一系列值组成的;表明命令可以在这些值组成的范围内执行..如果日期域和星期域都有值;则这两个域都有效..编写一个文件;用以启动自动备份进程..cd /opttouch在中添加一下内容:0 4 rebootcrontab /opt/用crontab -e编辑定时操作;例如加入下行命令:用crontab -l命令来查看注意:需要启动服务添加在中重启crond任务/etc/cron restart ubuntu下第一种在Fedora或Redhat 等以RPM包管理的系统中;rootlocalhost ~ /etc/crond startrootlocalhost ~ /etc/crond stoprootlocalhost ~ /etc/crond restart/etc/crond restart命令简介crontab-操作每个用户的守护程序和该执行的时间表..部分参数说明crontab file -u user-用指定的文件替代目前的crontab.. crontab--u user-用标准输入替代目前的crontab.crontab-1user-列出用户目前的crontab.crontab-euser-编辑用户目前的crontab.crontab-duser-删除用户目前的crontab.crontab-c dir- 指定crontab的目录..crontab文件的格式:M H D m d cmd.M: 分钟0-59..H:小时0-23..D:天1-31..m: 月1-12..d: 一星期内的天0~6;0为星期天..cmd要运行的程序;程序被送入sh执行;这个shell只有USER;HOME;SHELL这三个环境变量..下面是一个例子文件:。
linux中每天定时执行的写法

linux中每天定时执行的写法在Linux系统中,我们经常需要定时执行一些任务,比如备份数据、清理日志、更新软件等等。
为了方便管理和自动化执行这些任务,我们可以使用Linux系统自带的定时任务工具——crontab。
Crontab是一个用于设置定时任务的命令,它可以让我们在指定的时间点或时间间隔内自动执行某个命令或脚本。
下面我们来介绍一下在Linux中每天定时执行的写法。
首先,我们需要打开终端,并以root用户身份登录。
然后输入以下命令来编辑crontab文件:```crontab -e```这个命令会打开一个文本编辑器,里面已经包含了一些注释和示例。
我们需要在文件的最后添加我们自己的定时任务。
假设我们要每天凌晨3点执行一个脚本文件,我们可以在crontab文件中添加以下内容:```0 3 * * * /path/to/script.sh```其中,0表示分钟,3表示小时,星号表示任意的日期和月份。
这样,脚本文件script.sh就会在每天凌晨3点执行。
如果我们希望任务执行的结果保存到一个日志文件中,可以使用重定向符号">",将输出重定向到指定的文件。
例如:```0 3 * * * /path/to/script.sh > /path/to/logfile.log```这样,脚本执行的输出就会保存到logfile.log文件中。
另外,如果我们希望任务执行的结果通过邮件发送给指定的邮箱,可以使用mail命令。
例如:```0 3 * * * /path/to/script.sh | mail -s "任务执行结果"****************```这样,脚本执行的输出就会通过邮件发送给****************。
除了每天定时执行,我们还可以设置其他的时间间隔。
例如,如果我们希望每隔一小时执行一次脚本,可以使用以下写法:```0 * * * * /path/to/script.sh```其中,星号表示任意的分钟,这样脚本就会在每个小时的整点执行。
linux定时器实现原理

linux定时器实现原理Linux定时器是Linux操作系统中的一种机制,用于在指定的时间间隔内执行特定的任务或程序。
它是实现自动化任务和定时执行的重要工具之一。
本文将介绍Linux定时器的实现原理和使用方法。
一、Linux定时器的实现原理Linux定时器的实现原理主要基于操作系统的时钟中断机制。
当系统启动时,操作系统会初始化一个硬件时钟,并且设置一个固定的时间间隔,通常为几毫秒。
当时钟达到设定的时间间隔时,操作系统会触发一个时钟中断,即产生一个中断信号,通知操作系统进行相应的处理。
在Linux内核中,定时器是通过一个称为“定时器列表”的数据结构来实现的。
定时器列表是一个双向链表,用于存储所有的定时器对象。
每个定时器对象包含了定时器的属性和回调函数等信息。
当一个定时器被创建时,它会被加入到定时器列表中,并根据定时器的触发时间,在列表中找到合适的位置插入。
在每次时钟中断发生时,操作系统会遍历定时器列表,检查是否有定时器已经到达触发时间。
如果有定时器到达触发时间,操作系统将调用相应的回调函数执行任务或程序。
二、Linux定时器的使用方法在Linux中,可以使用多种方式来创建和使用定时器。
以下是使用Linux定时器的常见方法:1. 使用系统调用函数:Linux提供了系统调用函数(如timer_create、timer_settime等)来创建和设置定时器。
通过这些系统调用函数,可以设置定时器的触发时间、定时器的属性以及定时器到达触发时间时要执行的任务或程序。
2. 使用命令行工具:Linux还提供了一些命令行工具(如cron、at 等),可以通过命令行来创建和管理定时器。
通过这些命令行工具,可以设置定时器的触发时间、定时器的属性以及定时器到达触发时间时要执行的任务或程序。
3. 使用编程语言:除了系统调用函数和命令行工具,还可以使用编程语言来创建和使用定时器。
在C语言中,可以使用POSIX定时器库(如timer_create、timer_settime等函数)来实现定时器的功能。
linux timer用法

linuxtimer用法Linux操作系统提供了丰富的定时器功能,通过使用Linux定时器,可以轻松地实现定时任务、周期性执行的操作等。
本文将介绍Linux定时器的用法,包括定时器的类型、创建、使用和销毁等。
一、定时器类型Linux定时器可以分为以下几种类型:1.软定时器:软定时器是一种基于时间的定时器,可以通过系统调用实现定时任务。
软定时器的时间单位可以是秒、毫秒、微秒等,可以根据实际需求选择合适的单位。
2.硬定时器:硬定时器是一种基于内核定时器的定时器,可以通过内核提供的定时器接口实现周期性执行的操作。
硬定时器的精度较高,可以根据实际需求选择合适的精度。
二、创建定时器创建定时器可以通过系统调用来实现,具体方法如下:1.软定时器创建:可以使用`timer_create()`函数创建一个软定时器,该函数需要指定定时器的名称、指向定时器回调函数的指针、定时器的超时时间等信息。
创建成功后,会返回一个定时器的标识符,可以使用该标识符来控制定时器的执行。
2.硬定时器创建:可以使用`timer_create()`函数创建一个硬定时器,该函数需要指定定时器的名称、指向定时器回调函数的指针、定时器的起始时间等信息。
创建成功后,内核会根据指定的精度周期性地执行回调函数。
三、使用定时器创建了定时器后,需要使用该标识符来控制定时器的执行。
可以使用`timer_set_state()`函数来设置定时器的状态为运行或停止。
可以使用`timer_start()`函数来启动定时器,使定时器进入运行状态;可以使用`timer_try_stop()`函数来尝试停止当前运行的定时器。
需要注意的是,硬定时器不能被取消或延迟执行,只能被重新设置起始时间。
四、销毁定时器定时器执行完毕或不再需要时,需要销毁该定时器。
可以使用`timer_delete()`函数来销毁软定时器,使用`timer_delete(timerfd)`函数来销毁硬定时器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高HZ的优点
• 内核定时器能够以更高的频度和更高的准 确度运行。 • 依赖定时值执行的系统调用,比如poll() 和select(),能够以更高的精度运行。
• 对诸如资源消耗和系统运行时间等的测量 会有更精细的解析度。 • 提高进程抢占的准确度。
高HZ的缺点
• 时钟中断执行的越频繁,系统的负担越高
• 不允许访问用户空间 • Current无意义,因而也不可用 • 不能进行睡眠护着调度,不能调用schedule 或者某种wait_event,也不能调用任何可能 引起睡眠的函数,信号量也不可用,因为 信号量可能引起休眠。
如何判断中断上下文?
• 内核代码通过调用函数in_interrupt()可以判 断当前是否处于中断上下文,只要返回非0 就பைடு நூலகம்示处于中断上下文。 • 内核可以通过调用in_atomic()判断当前是否 允许调度,不允许调度的情况包括:处于 中断上下文以及拥有自旋锁的上下文。
提高节拍率等同于提供啊中断解析度。 例如:HZ=100的时钟执行粒度为10ms,, 即系统中周期事件最快为每10ms运行一次, 而不可能有更高的精度,但是当HZ = 1000 时,解析度就为1ms—精细了10倍。虽然内 核可以提供频度为1ms的时钟,但是并没有 证据显示对系统中所有的程序而言,频率 为1000HZ比100HZ的时钟更合适。
• void update_process_times(int user_tick) • { • struct task_struct *p = current; • int cpu = smp_processor_id();
• • • • • • • • • • } /* 更新当前进程占用CPU的时间 */ account_process_tick(p, user_tick); /* 同时触发软中断,处理所有到期的定时器 */ run_local_timers(); rcu_check_callbacks(cpu, user_tick); printk_tick(); /* 减少当前进程的时间片数 */ scheduler_tick(); run_posix_cpu_timers(p);
• • • • • • • • • • •
/*参见文件: kernel/time.c*/ clock_t jiffies_to_clock_t(long x) { #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0 # if HZ < USER_HZ return x * (USER_HZ / HZ); # else return x / (HZ / USER_HZ); # endif #else return div_u64((u64)x * TICK_NSEC, NSEC_PER_SEC / USER_HZ); #endif } EXPORT_SYMBOL(jiffies_to_clock_t);
内核提供四个宏来帮助比较节拍计数,能正确 处理节拍计数的回绕问题
• 位于<linux/jiffies.h>文件中提供的time_after, time_before等宏 • #define time_after(a,b) \ (typecheck(unsigned long, a) && \ typecheck(unsigned long, b) && \ ((long)(b) - (long)(a) < 0)) • #define time_before(a,b) time_after(b,a) • #define time_after_eq(a,b) \ (typecheck(unsigned long, a) && \ typecheck(unsigned long, b) && \ ((long)(a) - (long)(b) >= 0)) • #define time_before_eq(a,b) time_after_eq(b,a)
注意点:
• 在X86体系结构中,系统HZ默认值为100 • 内核在<asm/param.h>文件中定义了这个值 • 在编写内核代码时,HZ值不是一个固定不 变的值,大多数体系结构的HZ值是可调的
2.1.1 理想的HZ值
自Linux问世以来,i386体系结构中时 钟中断频率就设定为100HZ,但是在2.5开发 版本内核中,中断频率被提高到1000HZ。 提高节拍率意味着时钟中断产生得更 加频繁,所以中断处理程序也会更频繁的 执行,带来以下几点好处: • 更高的时钟中断解析度可提高时间驱动事 件的解析度。 • 提高了时间驱动事件的准确度。
2.3 用户空间的HZ
内核中使用的HZ和用户空间定义的HZ 值可能不一致,为了避免这种错误,内核 中也定义了USER_HZ,即用户空间的HZ值。 • 一般来说,USER_HZ和HZ都是相差整数倍, 内核中通过函数jiffies_to_clock_t来将内核中 的jiffies转为用户空间的jiffies。
为什么四个宏能解决回绕问题呢?
• 这跟计算机数据存储形式有关,数据在计 算机中以二进制的补码存储,具体可以编 码测试一下。 • 但是timeout不能大于2^32-1,超过这个值, 这四个宏就出现问题,但是几乎没有那个 程序会一次性delay25天。
把上面得代码改成下面得代码就可以解决回绕问题:
• unsigned long timeout = jiffies + HZ/2; • while (time_after(jiffies, timeout)) • {
/**还没有超时,继续执行任务/
• }
/*超时了,发生错误*/
关于时间的换算
• <jiffies.h> • unsigned int jiffies_to_msecs(const unsigned long j); • unsigned int jiffies_to_usecs(const unsigned long j); • unsigned long msecs_to_jiffies(const unsigned int m) • unsigned long usecs_to_jiffies(const unsigned int u);
• 时钟中断频率越高,处理器必须花时间来 执行中断处理程序,占用CPU时间过多。
• 减少了处理器对其他工作的时间,更频繁 的打乱处理器高速缓存并增加耗电。
2.2 jiffies
• 全局变量jiffies用来记录自系统启动以来产 生得节拍的总数。例如:系统启动了N秒, 那么jiffies就为N x HZ。 • Jiffies的类型为无符号长整型(unsigned long),用其它任何类型存放都不正确。
• 调用体系结构无关的时钟例程: tick_periodic()
• /*tick_periodic函数位于:kernel/time/tick_common.c*/ • static void tick_periodic(int cpu) • { • if (tick_do_timer_cpu == cpu) { • write_seqlock(&xtime_lock); • • • • • /* Keep track of the next tick event */ tick_next_period = ktime_add(tick_next_period, tick_period); do_timer(1); write_sequnlock(&xtime_lock); }
2.4 时钟中断处理程序
时钟中断处理程序可以划分为两个部 分:体系结构部分和体系结构无关部分。 作为系统定时器的中断处理程序而注 册到内核中,以便产生中断时,它能够相 应的运行。虽然处理程序依赖特定的体系 结构,但是大多数处理程序最低限度也要 执行如下工作:
• 获得xtime_lock锁,以便访问jiffies_64和墙 上时间xtime进行保护 • 需要时应答或重新设置系统时钟 • 周期性地使用墙上时间更新实时时钟
• update_process_times(user_mode(get_irq_regs())); • profile_tick(CPU_PROFILING); • }
其中重要的函数进行了注释
• void do_timer(unsigned long ticks) • { • /* jiffies_64 增加指定ticks */ • jiffies_64 += ticks; • /* 更新实际时间 */ • update_wall_time(); • /* 更新系统的平均负载值 */ • calc_global_load(); • }
Linux 内核机制-定时器
参考资料: 《Linux内核设计与实现》(美)Robert Love著, 陈莉君 康华 译 原文第三版 , 机械工业出版社。
《深入Linux内核架构》 (德)Wolfgang Mauerer 著 , 郭旭 译 ,人民邮电出版社。
《深入理解Linux内核》 DANIEL P.BOVET & MARCO CESATI 著,陈莉君 张琼声 张宏伟 译 ,中国电力出版社。
• 由于定时器异步执行,因而定时器处理函 数必须进行互斥保护。
2.在了解定时器之前先了解三个概念
• 节拍率:HZ • Jiffies • 时钟中断处理程序
2.1 节拍率:HZ
• 节拍率(HZ)是时钟中断的频率,表示一 秒钟中断的次数。 例如:HZ=100,表示一秒内触发100次时钟 中断程序。 节拍率是通过静态预处理定义的,在系统 启动时按照HZ值对硬件进行设置。 不同的体系结构,HZ值也不同。
对于32位无符号长整型,最大取值为 2^32-1。所以在溢出之前,定时器节拍计数最 大为4294967295。如果节拍计数达到了最大值 后还要继续增加的话,它的值就会回绕到0。 比如下面的代码: unsigned long timeout = jiffies + HZ/2; //设置超时时间为0.5秒 while (timeout < jiffies) { /*还没有超时,继续执行任务*/ } /*超时了,发生错误*/