首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux定时器时间轮算法

时间轮实现 Linux定时器分为低精度定时器和高精度定时器两种类型,内核对其均有实现。本文讨论的是我们在应用程序开发中比较常见的低精度定时器。...作为常用的基础组件,定时器常用的几种实现方法包括:基于排序链表实现、基于小根堆实现、基于红黑树实现、基于时间轮实现。本文讲解的是时间复杂度最优,也是linux内核采用的基于时间轮的实现方式。...下文从单个时间轮出发讲解,逐步扩展至linux实现定时器所采用的多级时间轮算法。...在 Linux 系统中,我们可以设置slot为1个jiffy(1/HZ)的定时器,假设最大的到期时间范围要达到 2^32个 jiffies,如果采用上面这样的单时间轮,我们就需要2^32个 bucket...Linux时间轮定时器算法的关键在于添加定时器操作和时间轮进位迁移链表操作。先来说添加定时器。添加定时器的关键又在于知道每个时间轮每一个刻度所能表示的到期时间的范围。

3.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux0.11的时间管理和定时器原理

    linux初始化的时候,初始化了定时相关的代码。...jmp ret_from_sys_call 我们看到中断的时候执行了do_timer函数,该函数就是处理定时器和进程调度的。在此之前我们先看看怎么新增一个定时器。...return; // 关中断,防止多个进程”同时“操作 cli(); // 直接到期,直接执行回调 if (jiffies <= 0) (fn)(); else { // 遍历定时器数组...原理: 每个节点都是以前面一个节点的到时时间为坐标,节点里的jiffies即超时时间 是前一个节点到期后的多少个jiffies后该节点到期。...void do_timer(long cpl) { ... // 当前在用户态,增加用户态的执行时间,否则增加该进程的系统执行时间 if (cpl) current->utime++; else

    92020

    timer定时器用法_定时器怎么调时间

    private final static AtomicInteger nextSerialNumber = new AtomicInteger(0); TimerThread的run方法中while循环获取...—(线性顺序执行多个task,是从queue中获取task然后执行,如果时间早于当前时间会马上执行任务) package cn.qlq.thread.fourteen; import java.util.Date...并且在period后重复执行任务,执行时间是从上次任务结束时间开始计算。凡是带period的都会在时间间隔后重复执行。...在有延时和没有延时的情况下,周期性的任务的下次任务开始时间都是相对于上次任务的开始时间进行延迟(这个在并发编程书中说的是有延迟的情况下相对于结束时间,但是自己测的是相对于开始时间) schedule和...scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上

    2.4K20

    linux获取进程执行时间方法示例

    linux获取进程执行时间有两种方法可以获取,第一种是用time命令,time 进程。...第二种是通过在程序中进行记录,首先利用sysconf函数获取时钟滴答数,再用times获取tms结构,详细看下面的示例代码 1、前言 测试一个程序的执行时间,时间包括用户CPU时间、系统CPU时间、时钟时间...之前获取之前时间都是在程序的main函数用time函数实现,这个只能粗略的计算程序的执行时间,不能准确的获取其他时间。在看《APUE》时,书中有关程序时间测试程序,非常正规,提供这三个时间。...2、获取方法 有两种方法可以获取,第一种是用time命令,time 进程。第二种是通过在程序中进行记录,首先利用sysconf函数获取时钟滴答数,再用times获取tms结构。...time of children */   }; 复制代码 代码如下: #include  clock_t times(struct tms *buf); 注意:此处计算的时间是时钟滴答数

    2.9K00

    Linux定时器实现

    一般定时器实现的方式有以下几种: 基于排序链表方式: 通过排序链表来保存定时器,由于链表是排序好的,所以获取最小(最早到期)的定时器的时间复杂度为 O(1)。...基于最小堆方式: 通过最小堆来保存定时器,在最小堆中获取最小定时器的时间复杂度为 O(1),但插入一个定时器的时间复杂度为 O(log n)。如下图: ?...基于平衡二叉树方式: 使用平衡二叉树(如红黑树)保存定时器,在平衡二叉树中获取最小定时器的时间复杂度为 O(log n)(也可以通过缓存最小值的方法来达到 O(1)),而插入一个定时器的时间复杂度为 O...时间轮: 但对于Linux这种对定时器依赖性比较高(网络子模块的TCP协议使用了大量的定时器)的操作系统来说,以上的数据结构都是不能满足要求的。所以Linux使用了效率更高的定时器算法:时间轮。...Linux时间轮的实现 那么接下来我们看看Linux内核是怎么实现时间轮算法的。

    3K20

    Linux定时器例子

    如果对你有帮助,麻烦点个在看或点个赞,感谢~ 文章首发 公众号—— Pou光明 程序中难免会使用到定时器,今天给大家介绍Linux中一种定时器的实现。...Linux下还有很多其他定时的实现,如精确定时等,感兴趣的同志可以再做深入了解。 编程到现在,其实很多工作都是在调用api,还没能完全脱离面向“谷歌”编程的实质,面对这种情形,如何破局呢?...timerfd_settime() 启动或关闭定时器。 new_value参数指定计时器的初始到期时间和间隔。...struct timespec it_value; /* Initial expiration */ }; 二、用例及封装函数 1、 根据时间间隔创建定时器...6、更多第一手英文资料的获取 man timerfd_create 很多我就是翻译了一下。 三、总结时间 如何理解马克思主义哲学中的对立统一 。。。

    3.7K20

    获取系统时间

    struct tm *localtime(const time_t *timer); 取得当地时间,localtime获取的结果由结构tm返回 返回的字符串可以依下列的格式而定: %a 星期几的缩写。...%c 本地端日期时间较佳表示字符串。 %d 用数字表示本月的第几天 (范围为 00 至 31)。日期 %H 用 24 小时制数字表示小时数 (范围为 00 至 23)。...%p 以 ''AM'' 或 ''PM'' 表示本地端时间。 %S 秒数。 %U 数字表示为本年度的第几周,第一个星期由第一个周日开始。 %W 数字表示为本年度的第几周,第一个星期由第一个周一开始。...%x 不含时间的日期表示法。 %X 不含日期的时间表示法。 Eg: 15:26:30 %y 二位数字表示年份 (范围由 00 至 99)。 %Y 完整的年份数字表示,即四位数。...Eg:中国标准时间 %% % 字符。

    2.2K10

    javascript获取当前系统时间代码_获取当前系统时间

    JavaScript 获取当前时间time 开发常用时间笔记 JS获取当前时间 Js获取当前日期时间及其它操作 ** 谨记要懂得经常在控制台输出结果 ** var myDate = new Date...myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-...6,0代表星期天) myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数) myDate.getHours(); //获取当前小时数(0-23) myDate.getMinutes...(); //获取当前分钟数(0-59) myDate.getSeconds(); //获取当前秒数(0-59) myDate.getMilliseconds(); //获取当前毫秒数(0-999) myDate.toLocaleDateString...(); //获取当前日期 var mytime=myDate.toLocaleTimeString(); //获取当前时间 myDate.toLocaleString( ); //获取日期与时间 日期时间脚本库方法列表

    18.5K30
    领券