2019独角兽企业重金招聘Python工程师标准>>>

timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,所以能够被用于select/poll的应用场景。

1.      使用方法

timerfd提供了如下接口供用户使用

timerfd_create

int timerfd_create(int clockid, int flags);

timerfd_create用于创建一个定时器文件。

参数clockid可以是CLOCK_MONOTONIC或者CLOCK_REALTIME。

参数flags可以是0或者O_CLOEXEC/O_NONBLOCK。

函数返回值是一个文件句柄fd。

timerfd_settime

int timerfd_settime(int ufd, int flags, const struct itimerspec * utmr, struct itimerspec * otmr);

此函数用于设置新的超时时间,并开始计时。

参数ufd是timerfd_create返回的文件句柄。

参数flags为1代表设置的是绝对时间;为0代表相对时间。

参数utmr为需要设置的时间。

参数otmr为定时器这次设置之前的超时时间。

函数返回0代表设置成功。

timerfd_gettime

int timerfd_gettime(int ufd, struct itimerspec * otmr);

此函数用于获得定时器距离下次超时还剩下的时间。如果调用时定时器已经到期,并且该定时器处于循环模式(设置超时时间时struct itimerspec::it_interval不为0),那么调用此函数之后定时器重新开始计时。

read

当timerfd为阻塞方式时,read函数将被阻塞,直到定时器超时。

函数返回值大于0,代表定时器超时;否则,代表没有超时(被信号唤醒,等等)。

poll/close

poll,close与标准文件操作相同。

2.      内核实现

timerfd的内核实现代码在kernel/fs/timerfd.c,它的实现基于Linux的hrtimer。

timerfd_create的实现

SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)

l         做一些定时器的初始化工作

l         调用hrtimer_init初始化一个hrtimer

l         调用anon_inode_getfd分配一个dentry,并得到一个文件号fd,同时传入timerfd的文件操作指针struct file_operations timerfd_fops。anno_inode_getfd是文件系统anon_inodefs的一个帮助函数。anon文件系统比较简单,整个文件系统只有一个inode节点,其实现代码可以在fs/anon_inodes.c中找到。

timerfd_settime的实现

timerfd_settime最终会调用hrtimer_start启动定时器,其超时函数被设置为timerfd_tmrproc。

timerfd_tmrproc

timefd_tmrproc是timerfd的定时器超时函数。在timerfd超时时,该函数会设置定时器超时标记位;增加定时器超时次数(在设置定时器循环模式时,可能会出现多次超时没有被处理的情况);唤醒一个等待队列,从而唤醒可能存在的正被阻塞的read、select。

timerfd_fops

static const struct file_operations timerfd_fops = {

.release    = timerfd_release,

.poll        = timerfd_poll,

.read              = timerfd_read,

};

timerfd_read函数是文件操作read的内核实现,读到的是定时器的超时次数。该函数在阻塞模式下会把自身挂到timerfd的等待队列中,等待定时器超时时被唤醒。

timerfd_poll将timerfd的等待队列登记到一个poll_table,从而在定时器超时时能唤醒select系统调用。

timerfd_release

timerfd_release函数释放timerfd_create函数中申请的资源,删除已分配的定时器。

转载于:https://my.oschina.net/invictuslee/blog/271618

Linux的timerfd分析相关推荐

  1. linux timerfd_settime函数,Linux的timerfd分析

    timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,所以能够被用于select/poll的应用场景. 1.使用方法 timerfd提供了如下接口供用户使用 timerfd ...

  2. Linux内存技术分析(下)

    Linux内存技术分析(下) 五. 内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 · page管理 · slab(kmalloc.内存 ...

  3. Linux内存技术分析(上)

    Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...

  4. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  5. Linux cgroup机制分析之cpuset subsystem

    ------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ -------- ...

  6. Linux系统IO分析工具之iotop常用参数介绍

      Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...

  7. 转]Window, Linux动态链接库的分析对比

    转]Window, Linux动态链接库的分析对比 摘 要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高 ...

  8. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  9. 业界重磅新书《UNIX/Linux网络日志分析与流量监控》首发

    <UNIX/Linux网络日志分析与流量监控> 出版社官网: http://www.cmpbook.com/stackroom.php?id=39384 每本图书附赠51CTO学院的价值1 ...

最新文章

  1. 华为鸿蒙4月推送名单,华为鸿蒙升级名单已确认,首批将有44款机型升级,其中有你吗?...
  2. 商汤被曝已获准在香港上市,计划筹资逾10亿美元
  3. 这老哥把GPU当暖气用,省钱了!
  4. ppcelerator徐旸:新一代移动互联网技术
  5. [CommunityServer]事件代理
  6. Docker最佳实践-部署LNMP环境
  7. python对象点方法_python对象方法、类方法、静态方法
  8. JavaScript实现跳跃游戏的动态编程自下而上的方法的算法(附完整源码)
  9. 天云大数据_天云大数据三度蝉联毕马威领先金融科技50强
  10. 字符串池化,减少了三分之一的内存占用
  11. html2image乱码问题,HtmlImageGenerator字体乱码问题解决、html2image放linux上乱码问题解决...
  12. Coursera自动驾驶课程第7讲:Vehicle Lateral Control
  13. java set方法赋值_java方面:private属性,没有set方法,只有get方法,如何给这个属性赋值?...
  14. 前端组件化和模块化最大的区别是什么_7招提升你的前端开发效率
  15. 面试题之请求转发和重定向的区别
  16. 京东商品价格查询易语言代码
  17. 小学生计算机知识技能竞赛,2016年春季小学生六项技能竞赛计算机试卷.doc
  18. 得洲奥斯汀研究生计算机专业排名,德克萨斯大学奥斯汀分校世界排名及专业排名汇总(QS世界大学排名版)...
  19. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)
  20. 會懷孕的木乃伊~恐怖!! 使木乃伊懷孕的人~更加恐怖!

热门文章

  1. Linux系统简介与准备
  2. Spring MVC类型转换的意义
  3. Spring @RequestMapping注解示例
  4. 08-05 性能测试--定时器场景
  5. python什么学历能学_自考学历找工作,钱少点也没关系?
  6. spgwr | R语言与地理加权回归(Ⅰ-2):广义线性地理加权回归
  7. 我可能不适合做前端,你呢?
  8. linux创建管道的函数,Linux下的有名管道(03)---使用函数创建和删除有名管道
  9. 断点运行的参数_利用 AicLaunchAdminProcess 参数污染 bypass UAC
  10. Opencv_黑白素描