POSIX定时器Timer
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 级别的时钟精度。
函数名 | 功能描述 |
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 的种类,可以为下表中的任意一种:
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 用来设置定时器到时时的通知方式。该数据结构如下:
结构sigevent
struct sigevent {int sigev_notify; /* Notification method */int sigev_signo; /* Notification signal */union sigval sigev_value; /* Data passed with notification */void (*sigev_notify_function) (union sigval);/* Function used for thread notification (SIGEV_THREAD) */void *sigev_notify_attributes;/* Attributes for notification thread (SIGEV_THREAD) */pid_t sigev_notify_thread_id;/* ID of thread to signal (SIGEV_THREAD_ID) */};
其中sigev_notify 表示通知方式,有如下几种:
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 的时候使用到,应用程序很少会需要用到这种模式。
————————————————
版权声明:本文为CSDN博主「许振坪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/benkaoya/java/article/details/17342711
POSIX定时器Timer相关推荐
- Go (Golang) 语言-Golang 定时器Timer和Ticker、time.AfterFunc、time.NewTicker()实例
文章目录 Golang 定时器Timer和Ticker time.Timer time.NewTimer()实例 time.AfterFunc time.Ticker time.NewTicker() ...
- 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
文章目录 一.Timer 定时器基本使用 二.Timer 定时器常用用法 三.Timer 源码分析 四.Timer 部分源码注释 五.源码及资源下载 参考文档 : Timer 定时器 API 文档 T ...
- Java定时器Timer
Java定时器Timer 在JDK库中,Timer类主要负责计划任务的功能,也就是在指定的时开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类,执行计划 ...
- python定时器 是线程吗_python线程定时器Timer(32)
相对前面几篇python线程内容而言,本片内容相对比较简单,定时器 – 顾名思义,必然用于定时任务. 一.线程定时器Timer原理 原理比较简单,指定时间间隔后启动线程!适用场景:完成定时任务,例如: ...
- python定时器timer_python通过线程实现定时器timer的方法
本文实例讲述了python通过线程实现定时器timer的方法.分享给大家供大家参考.具体分析如下: 这个python类实现了一个定时器效果,调用非常简单,可以让系统定时执行指定的函数 下面介绍以thr ...
- 第5章 定时器Timer
第5章 定时器Timer 标签: Java多线程编程 <Java多线程编程核心技术> 个人笔记 第5章 定时器Timer 定时器Timer的使用 方法scheduleTimerTask t ...
- python中实现定时器Timer
实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...
- Python 线程定时器 Timer - Python零基础入门教程
目录 一.Python 线程定时器 Timer 原理 二.Python 线程定时器 Timer 使用 三.Python 线程定时器 Timer 总结 四.猜你喜欢 零基础 Python 学习路线推荐 ...
- 定时器Timer的实现
定时器Timer的实现 定时器在实际项目中会用的比较平凡.因此,本文首先介绍定时器Timer的windows版本,跨平台的定时器将在下一篇文章中介绍.它们的源代码均用C++编写.源代码详见:https ...
最新文章
- 基础知识——操作列表(三)
- [NowCoder] 牛牛数星星
- [luogu5142]区间方差
- 玩转mini2440开发板之【64位Ubuntu系统无法运行arm-linux-gcc】
- 华为高性能服务器刀箱,云平台服务器刀箱
- hdu 2014鞍山赛区 5073 Galaxy
- mysql如何选择多个表_从两个表mysql中选择多行
- 网络盘的计算机密码是什么情况,电脑e盘拒绝访问是什么原因?e盘加密方法
- 《CCNA学习指南:Cisco网络设备互连(ICND2)(第4版)》——本章小结
- Wpf初学 ---03设计一个优美的注册登录界面(连接数据库)
- Zipf law 定律
- Aspose.word Java实现html转word,word转html
- 商务礼仪的6大准则(转)
- Kali Linux 详细安装步骤
- 电子元器件贸易采购管理常见难题及解决方案
- 在ADSP21489下外挂S29AL016J并行FLASH调试记录
- C#开发WINCE系统的PDA程序,GetSystemMetrics获取屏幕长宽以达到自适应分辨率
- 大规模复杂变电站巡检机器人分层路径规划
- 酒店酒吧幕墙亮化工程施工方案
- 凡客五轮融资史 ,3年融资总额达2亿美元
热门文章
- 电商 竞品分析_母婴电商类app竞品分析报告
- Docker修改容器系统时间命令组
- Secure CRT修改文件夹的颜色
- Ansible安装MySQL5.7.24
- python 发包爬取中国移动充值页面---可判断手机号是否异常
- Maven发布web项目到tomcat
- 解析大型.NET ERP系统 高质量.NET代码设计模式
- java struts2下载zip_Struts2多文件下载
- 基于windows server 2008 web服务器的性能,Windows Server 2008之应用程序服务器解析
- apache mediawiki 安装_MediaWiki初探:安装及使用入门