返回顶部
首页 > 资讯 > 操作系统 >Linux内核定时器与延迟工作怎么实现
  • 789
分享到

Linux内核定时器与延迟工作怎么实现

2023-06-16 14:06:42 789人浏览 薄情痞子
摘要

本篇内容介绍了“linux内核定时器与延迟工作怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内核定时器软件上的定时器最终要依靠硬件时

本篇内容介绍了“linux内核定时器与延迟工作怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

内核定时器

软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行。实际上,时钟中断处理程序会触发TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。

设备驱动程序如要获得时间信息以及需要定时服务,都可以使用内核定时器。

jiffies

要说内核定时器,首先就得说说内核中关于时间的一个重要的概念:jiffies变量,作为内核时钟的基础,jiffies每隔一个固定的时间就会增加1,称为增加一个节拍,这个固定间隔由定时器中断来实现,每秒中产生多少个定时器中断,由在<linux/param.h>中定义的HZ宏来确定,如此,可以通过jiffies获取一段时间,比如jiffies/HZ表示自系统启动的秒数。下两秒就是(jiffies/HZ+2),内核中用jiffies来计时,秒转换成的jiffies:seconds*HZ,所以以jiffiy为单位,以当前时刻为基准计时2秒:(jiffies/HZ+2)*HZ=jiffies+2*HZ如果要获取当前时间,可以使用do_gettimeofday(),该函数填充一个struct timeval结构,有着接近微妙的分辨率。

//kernel/time/timekeeping.c  void do_gettimeofday(struct timeval *tv)

驱动程序为了让硬件有足够的时间完成一些任务,常常需要将特定的代码延后一段时间来执行,根据延时的长短,内核开发中使用长延时和短延时两个概念。长延时的定义为:延时时间>多个jiffies,实现长延时可以用查询jiffies的方法:

time_before(jiffies, new_jiffies); time_after(new_jiffiesmjiffies);

**短延时的定义为:延迟事件接近或短于一个jiffy,实现短延时可以调用

udelay(); mdelay();

这两个函数都是忙等待函数,大量消耗CPU时间,前者使用软件循环来延迟指定数目的微妙数,后者使用前者的嵌套来实现毫秒级的延时。

定时器

驱动可以注册一个内核定时器,来指定一个函数在未来某个时间来执行。定时器从注册到内核开始计时,达到指定的时间后会执行注册的函数。即超时值是一个jiffies值,当jiffies值大于timer->expires时,timer->function就会被执行。api如下

//定一个定时器  struct timer_list my_timer;//初始化定时器  void init_timer(struct timer_list *timer); mytimer.function = my_function; mytimer.expires = jiffies +HZ;//增加定时器  void add_timer(struct timer_list *timer);//删除定时器  int del_tiemr(struct timer_list *timer);

实例

static struct timer_list tm; struct timeval oldtv;void callback(unsigned long arg){     struct timeval tv;     char *strp = (char*)arg;     do_gettimeofday(&tv);     printk("%s: %ld, %ld\n", __func__,         tv.tv_sec - oldtv.tv_sec,         tv.tv_usec- oldtv.tv_usec);     oldtv = tv;     tm.expires = jiffies+1*HZ;     add_timer(&tm); } static int __init demo_init(void){     init_timer(&tm);     do_gettimeofday(&oldtv);     tm.function= callback;     tm.data    = (unsigned long)"hello world";     tm.expires = jiffies+1*HZ;     add_timer(&tm);     return 0; }

延迟工作

除了使用内核定时器完成定时延迟工作,Linux内核还提供了一套封装好的"快捷方式"-delayed_work,和内核定时器类似,其本质也是利用工作队列和定时器实现,

//include/linux/workqueue.h  struct work_struct {                     atomic_long_t data;          struct list_head entry;          work_func_t func;  #ifdef CONFIG_LOCKDEP          struct lockdep_map lockdep_map;  #endif  };  struct delayed_work {              114         struct work_struct work;          struct timer_list timer;              struct workqueue_struct *wq;          int cpu;  };

--103-->需要延迟执行的函数, typedef void (work_func_t)(struct work_struct work);

至此,我们可以使用一个delayed_work对象以及相应的调度API实现对指定任务的延时执行

//注册一个延迟执行  591 static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay)//注销一个延迟执行 2975 bool cancel_delayed_work(struct delayed_work *dwork)

和内核定时器一样,延迟执行只会在超时的时候执行一次,如果要实现循环延迟,只需要在注册的函数中再次注册一个延迟执行函数。

schedule_delayed_work(&work,msecs_to_jiffies(poll_interval));

“Linux内核定时器与延迟工作怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Linux内核定时器与延迟工作怎么实现

本文链接: https://lsjlt.com/news/283988.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux内核定时器与延迟工作怎么实现
    本篇内容介绍了“Linux内核定时器与延迟工作怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内核定时器软件上的定时器最终要依靠硬件时...
    99+
    2023-06-16
  • python之怎么实现延迟操作
    python实现延迟操作python 想实现延迟的操作是需要应用time ,然后在使用time的sleep 方法比如我想写一个延迟1秒打印一次的操作import time for i in range(0, 10): time.sl...
    99+
    2023-05-16
    Python
  • Android中怎么实现延迟操作
    这篇文章给大家介绍Android中怎么实现延迟操作,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 三种延迟操作的实现方法一、线程new Thread(new Runnable(){&n...
    99+
    2023-05-30
    android
  • Linux中怎么实现内核升级操作
    Linux中怎么实现内核升级操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.下载内核cd /usr/srcwget linux/kernel/v2.6...
    99+
    2023-06-16
  • 定时任务实现的关键DelayQueue延迟队列是什么
    定时任务实现的关键DelayQueue延迟队列是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天学习是并发包提供的延迟队列(DelayQueue)。延迟队列说明延迟队...
    99+
    2023-06-19
  • Linux中怎么实现延缓操作
    Linux中怎么实现延缓操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在内核中计时的头函数是#includeHz符号指出每秒钟产生的时钟滴答数,也就是1秒钟产生的时间中断。...
    99+
    2023-06-17
  • Linux内核态抢占怎么实现
    本篇内容介绍了“ Linux内核态抢占怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 非抢占式和可抢占式内核的区别为了简化问题,...
    99+
    2023-06-16
  • Linux中怎么实现内核链表
    Linux中怎么实现内核链表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码如下:struct list_node{stuct list_node *pre;stuct li...
    99+
    2023-06-09
  • js怎么实现让某个动作延迟几秒执行
    这篇“js怎么实现让某个动作延迟几秒执行”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“js怎么实现让某个动作延迟几秒执行”文...
    99+
    2023-07-02
  • C语言驱动开发内核枚举IoTimer定时器怎么实现
    本篇内容主要讲解“C语言驱动开发内核枚举IoTimer定时器怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言驱动开发内核枚举IoTimer定时器怎么实现”吧!正文IoTimer内核定...
    99+
    2023-07-04
  • Linux内核中怎么实现Percpu变量
    这篇文章给大家介绍Linux内核中怎么实现Percpu变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。所谓thread  local变量,就是对于同一个变量,每个线程都有自己的一份,对该变量的访问是线程隔离...
    99+
    2023-06-15
  • Linux内核设计与实现的方法是什么
    今天小编给大家分享一下Linux内核设计与实现的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 Unix...
    99+
    2023-06-16
  • Linux内核中双向链表怎么实现
    这篇文章主要介绍了Linux内核中双向链表怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux内核中双向链表怎么实现文章都会有所收获,下面我们一起来看看吧。首先让我们看一下在 include/lin...
    99+
    2023-06-28
  • FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现
    这篇文章主要介绍“FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现”文章能帮助大家解决问题。...
    99+
    2023-06-29
  • JS的闭包与定时器这么实现
    这篇文章主要讲解了“JS的闭包与定时器这么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的闭包与定时器这么实现”吧!   什么是闭包有什么作用 ...
    99+
    2024-04-02
  • linux定时器实现的原理是什么
    Linux定时器的实现原理如下:1. 内核中的定时器是通过“定时器”数据结构来表示的。该数据结构包含了定时器的到期时间、回调函数、回...
    99+
    2023-10-09
    linux
  • 怎么自定义vbs脚本实现开机后延时启动指定程序
    这篇文章主要介绍“怎么自定义vbs脚本实现开机后延时启动指定程序”,在日常操作中,相信很多人在怎么自定义vbs脚本实现开机后延时启动指定程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么自定义vbs脚本实...
    99+
    2023-06-08
  • Linux中怎么实现时间转化操作
    这篇文章将为大家详细讲解有关Linux中怎么实现时间转化操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Linux时间转化方法:(1)date -d"2008年 12月 17日 ...
    99+
    2023-06-16
  • Android常用定时器怎么实现
    Android常用的定时器实现有以下几种方式:1. 使用Handler和Runnable实现定时器:```java// 创建Hand...
    99+
    2023-08-18
    Android
  • Go定时器内部的实现原理是什么
    这篇文章主要讲解了“Go定时器内部的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go定时器内部的实现原理是什么”吧!前言本节,我们重点关注系...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作