1参考资料

Ø 《Linux系统编程》第“10.9

定时器”章节

2 概要

要在linux中使用定时器,有如下三种方法:

定时器方式

一个进程允许

使用的数量

通知方式

简单的闹钟 - alarm

1个

Ø 信号:

SIGALRM

间歇定时器 - setitimer

1个

Ø 信号:

SIGALRM、SIGVTALRM、SIGPROF

高级定时器 - timer_create

无限制

Ø 信号:

可以自己选择用什么信号

Ø 启动线程

就不会产生信号,可以避免慢系统调用被信号中断的问题

3 alarm

alarm()是最简单的定时器接口,对该函数的调用会在真实时间(real

time)seconds秒之后将SIGALRM信号发给调用进程。它不能自动重启(即定时器到后要再次定时,需要再调用一次alarm)。

4 setitimer

间歇定时器setitimer系统调用,他可以提供比alarm()更多的控制。它能够自动重启。

linux 为每一个进程提供了 3 个 setitimer 间隔计时器:

Ø ITIMER_REAL:减少实际时间,到期的时候发出 SIGALRM 信号。

Ø ITIMER_VIRTUAL:减少有效时间 (进程执行的时间),产生 SIGVTALRM

信号。

Ø ITIMER_PROF:减少进程的有效时间和系统时间

(为进程调度用的时间)。这个经常和上面一个使用用来计算系统内核时间和用户时间。产生 SIGPROF 信号。

所谓 REAL 时间,即我们人类自然感受的时间,英文计算机文档中也经常使用 wall-clock

这个术语。说白了就是我们通常所说的时间,比如现在是下午 5 点 10 分,那么一分钟的 REAL 时间之后就是下午 5 点 11

分。

VIRTUAL 时间是进程执行的时间,Linux 是一个多用户多任务系统,在过去的 1 分钟内,指定进程实际在 CPU

上的执行时间往往并没有 1 分钟,因为其他进程会被 Linux

调度执行,在那些时间内,虽然自然时间在流逝,但指定进程并没有真正的运行。VIRTUAL 时间就是指定进程真正的有效执行时间。比如 5

点 10 分开始的 1 分钟内,进程 P1 被 Linux 调度并占用 CPU 的执行时间为 30 秒,那么 VIRTUAL

时间对于进程 P1 来讲就是 30 秒。此时自然时间已经到了 5 点 11 分,但从进程 P1 的眼中看来,时间只过了 30

秒。

PROF 时间比较独特,对进程 P1 来说从 5 点 10 分开始的 1 分钟内,虽然自己的执行时间为 30 秒,但实际上还有 10

秒钟内核是在执行 P1 发起的系统调用,那么这 10 秒钟也被加入到 PROF

时间。这种时间定义主要用于全面衡量进程的性能,因为在统计程序性能的时候,10 秒的系统调用时间也应该算到 P1 的头上。这也许就是

PROF 这个名字的来历吧。

5 POSIX Timer

间隔定时器 setitimer 有一些重要的缺点,POSIX Timer 对 setitimer 进行了增强,克服了

setitimer 的诸多问题:

Ø 首先,一个进程同一时刻只能有一个 timer。假如应用需要同时维护多个 Interval

不同的计时器,必须自己写代码来维护。这非常不方便。使用 POSIX Timer,一个进程可以创建任意多个 Timer。

Ø setitmer 计时器时间到达时,只能使用信号方式通知使用 timer 的进程,而

POSIX timer 可以有多种通知方式,比如信号,或者启动线程。

Ø 使用 setitimer 时,通知信号的类别不能改变:SIGALARM,SIGPROF

等,而这些都是传统信号,而不是实时信号,因此有 timer overrun 的问题;而 POSIX Timer

则可以使用实时信号。

备注:通过kill –l可以查看系统支持的所有信号列表。编号为1 ~

31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~

63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

Ø setimer 的精度是 ms,POSIX Timer

是针对有实时要求的应用所设计的,接口支持 ns 级别的时钟精度。

表 2. POSIX Timer 函数

函数名

功能描述

timer_create

创建一个新的 Timer;并且指定定时器到时通知机制

timer_delete

删除一个 Timer

timer_gettime

Get the time remaining on a

POSIX.1b interval timer

timer_settime

开始或者停止某个定时器。

timer_getoverrun

获取丢失的定时通知个数。

使用 Posix Timer 的基本流程很简单,首先创建一个 Timer。创建的时候可以指定该 Timer 的一些特性,比如

clock ID。clock ID 即 Timer 的种类,可以为下表中的任意一种:

表 3. POSIX Timer clock ID

Clock ID

描述

CLOCK_REALTIME

Settable system-wide

real-time clock;

CLOCK_MONOTONIC

Nonsettable monotonic

clock

CLOCK_PROCESS_CPUTIME_ID

Per-process CPU-time

clock

CLOCK_THREAD_CPUTIME_ID

Per-thread CPU-time clock

Ø CLOCK_REALTIME 时间是系统保存的时间,即可以由 date

命令显示的时间,该时间可以重新设置。比如当前时间为上午 10 点 10 分,Timer 打算在 10 分钟后到时。假如 5

分钟后,我用 date 命令修改当前时间为 10 点 10 分,那么 Timer 还会再等十分钟到期,因此实际上 Timer 等待了

15 分钟。假如您希望无论任何人如何修改系统时间,Timer 都严格按照 10

分钟的周期进行触发,那么就可以使用CLOCK_MONOTONIC。

Ø CLOCK_PROCESS_CPUTIME_ID 的含义与 setitimer 的

ITIMER_VIRTUAL 类似。计时器只记录当前进程所实际花费的时间;比如还是上面的例子,假设系统非常繁忙,当前进程只能获得

50%的 CPU 时间,为了让进程真正地运行 10 分钟,应该到 10 点 30 分才允许 Timer 到期。

Ø CLOCK_THREAD_CPUTIME_ID

以线程为计时实体,当前进程中的某个线程真正地运行了一定时间才触发 Timer。

设置到期通知方式

timer_create 的第二个参数 struct sigevent 用来设置定时器到时时的通知方式。该数据结构如下:

清单 10,结构sigevent

structsigevent {

intsigev_notify;

intsigev_signo;

unionsigval sigev_value;

void(*sigev_notify_function) (unionsigval);

void*sigev_notify_attributes;

pid_t sigev_notify_thread_id;

};

其中sigev_notify表示通知方式,有如下几种:

表 3. POSIX Timer 到期通知方式

通知方式

描述

SIGEV_NONE

定时器到期时不产生通知。。。

SIGEV_SIGNAL

定时器到期时将给进程投递一个信号,sigev_signo 可以用来指定使用什么信号。

SIGEV_THREAD

定时器到期时将启动新的线程进行需要的处理

SIGEV_THREAD_ID(仅针对 Linux)

定时器到期时将向指定线程发送信号。

Ø 如果采用 SIGEV_NONE 方式,使用者必须调用timer_gettime

函数主动读取定时器已经走过的时间。类似轮询。

Ø 如果采用 SIGEV_SIGNAL 方式,使用者可以选择使用什么信号,用

sigev_signo 表示信号值,比如 SIG_ALARM。

Ø 如果使用 SIGEV_THREAD 方式,则需要设置

sigev_notify_function,当 Timer 到期时,将使用该函数作为入口启动一个线程来处理信号;sigev_value

保存了传入 sigev_notify_function 的参数。sigev_notify_attributes

如果非空,则应该是一个指向 pthread_attr_t 的指针,用来设置线程的属性(比如 stack 大小,detach

状态等)。

Ø SIGEV_THREAD_ID 通常和 SIGEV_SIGNAL 联合使用,这样当 Timer

到期时,系统会向由 sigev_notify_thread_id

指定的线程发送信号,否则可能进程中的任意线程都可能收到该信号。这个选项是 Linux 对 POSIX 标准的扩展,目前主要是

GLibc 在实现 SIGEV_THREAD 的时候使用到,应用程序很少会需要用到这种模式。

linux系统维护诸多定时器,linux定时器总结相关推荐

  1. linux 定时器_定时器: Nodejs 中的 timers

    在看 Node http 模块文档的时候, 才留意到 server.timeout 这个属性, 本想简单介绍一下, 但是在梳理过后发现关于 timeout 有庞大的内容支撑: server.timou ...

  2. linux上点时间延时,Linux上时间和定时器

    Linux下时间和定时器 http://blog.chinaunix.net/u1/35065/showart_1870601.html重点读了第三种方法.文章写得很好,加了一点点注释可参考http: ...

  3. Linux环境SOCKET编程5:定时器接口timerfd

    1.概述 timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景.timerfd是lin ...

  4. linux 动态定时器,Linux 3.10完整支持的DynTicks(动态定时器)特性简介

    Linux 3.10发布,其完整支持的DynTicks(动态定时器),被标版为内核级别的核心特性.本文就来看一下DynTicks为何东东?又有啥稀奇之处? 我们知道,Linux内核里有一个HZ值,其表 ...

  5. tp5.1添加定时器任务linux,TP5 用cron实现linux定时任务

    TP5 用cron实现linux定时任务 1) tp5的控制器内容: namespace app\test\controller; use think\Controller; use think\fa ...

  6. Linux 系统维护命令小结

    Linux 系统维护命令小结 工具 功能描述 uptime 系统平均负载率 dmesg 硬件/系统信息 top 进程进行状态 iostat CPU和磁盘平均使用率 vmstat 系统运行状态 sar ...

  7. Linux中sysstat服务,Linux系统维护常用工具sysstat

    Linux系统维护常用工具sysstat 发布时间:2005-12-29 10:37:08来源:红联作者:ming 这个包在各大发行版中都有,如果您试一下有sar这个命令就证明已经有了.如果没有的,可 ...

  8. Linux系统日检常见问题,linux系统维护常见错误记录

    linux系统维护常见错误记录 发布时间:2008-09-17 21:32:34   作者:佚名   我要评论 一:卸载的时候出现的错误: umount /dev/nb1 device is busy ...

  9. linux+c+时间间隔+ns,浅析 Linux 中的时间编程和实现原理,第 1 部分: Linux 应用层的时间编程...

    http://www.ibm.com/developerworks/cn/linux/1307_liuming_linuxtime1/index.html#ibm-pcon 本文试图完整地描述 Lin ...

  10. linux嵌入式系统算法,嵌入式Linux操作系统调度算法研究

    嵌入式Linux操作系统调度算法研究 嵌入式操作系统在互联网时代的今天得到广泛应用.Linux系统本身并不是严格的实时操作系统.为了提高它对实时任务的处理能力,国内外对Linux进行了不断的实时性能的 ...

最新文章

  1. 请不要做浮躁的人——转给即将上路或者正在路上的程序员朋友
  2. redis api-set
  3. python输入多个数据存入列表_python怎么把input的值储存到一个列表
  4. bilibili有电脑版吗_哪个手机便签软件有电脑版?有跨平台的桌面便签软件吗 - 学显...
  5. cad坐标提取插件_如何快速地将CAD里的坐标提取到Excel中?最简单的方法你知道吗?...
  6. 困兽之斗!使用JavaScript执行客户端的exe文件(excute the .exe file on client-side machine by JavaScript)...
  7. 构建samba文件共享服务器
  8. JAVA基础——Java 中必须了解的常用类
  9. 5.软件架构设计:大型网站技术架构与业务架构融合之道 --- 网络
  10. c语言编写简单实用的小程序,C语言编写一个小程序
  11. 将超星图书转成PDF文档
  12. html校园生活模板,学校生活日记模板集锦9篇
  13. 项目1-员工(绩效)信息管理系统
  14. devExpress chart c# 折线图绘制
  15. php查找sql,sql如何去重查询
  16. input 数字类型
  17. 【玩转数据系列十五】机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
  18. linux编写自动运行一串命令的脚本
  19. IOS开发百度地图API
  20. NBMA和BMA的交换方式

热门文章

  1. Lync 地址簿同步知识
  2. CentOS 查看日志命令
  3. python 图像倾斜校正_图像矫正原理说明
  4. html视频全套教程,用Dreamweaver讲解html全套视频教程分享
  5. OS | 【四 文件管理】强化阶段大题解构 —— FAT文件系统、UFS文件系统访问文件过程
  6. linux SD卡驱动
  7. 学计算机设计制图需啥基础,学习工程制图和CAD经验和方法 心得及体会
  8. 零基础手把手用solidworks教你画联轴器
  9. 怎样python爬虫更换ip地址爬取网站
  10. ShadowGun Billboard Blinking God Rays