linux定时器

linux 时间相关的一些总结

陌路散爱 提交于 2020-01-11 00:14:48
仅作为内核代码中时间管理模块的笔记,3.10内核,很乱,不喜勿喷。 先有time,后有timer。 常用的time结构有哪些?除了大名鼎鼎的jiffies和jiffies64之外,还有常用的一些结构如下: ktime_t 经常用在timer中, union ktime { s64 tv64; #if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR) struct { # ifdef __BIG_ENDIAN s32 sec, nsec; # else s32 nsec, sec; # endif } tv; #endif }; typedef union ktime ktime_t; /* Kill this */ 经常用在fs中的timespec,低一点精度的timeval,以及时区结构timezone。主要用来做时间戳等。 struct timespec { __kernel_time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; struct timeval { __kernel_time_t tv_sec; /* seconds */ __kernel_suseconds_t tv_usec; /* microseconds */ };

Linux 时钟系统漫游

你离开我真会死。 提交于 2020-01-10 23:29:41
缘由: 在开发KVM虚拟机过程中,不可避免的会跟虚拟机时钟打交道 目前存在的问题是:一旦出现多个虚拟机运行在同一个CPU上,造成足够多的负载时,由于调度不及时导致虚拟机时钟中断的频率将会变慢 在x86上的虚拟机貌似没有这个问题,借此机会打算梳理一下整个Linux 时钟系统,也不一定能解决,但是至少可以理一下思路 时钟贯穿整个Linux 执行周期,千丝万缕,我们就从最直观的 时钟中断 切入,循序渐进,看看Linux 时钟的演化过程(本篇不涉及动态时钟,后续有机会可以继续分析)。 时钟中断: 1. 时钟中断到来时,系统首先就是要更新墙上时间:update_wall_time 与时钟中断和墙上时钟紧密相关的一个变量是jiffies。这个变量记录着系统启动后产生了多少次时钟中断,所以每个中断来后自增。 与时钟中断相关的重要配置是CONFIG_HZ,这个是编译时配置文件决定,在我这里CONFIG_HZ=256表示一秒钟jiffies增加256次。 但系统时钟并不用jiffies来更新,在update_wall_time函数内使用clock->read(clock)读取时钟源,并更新系统时钟xtime。这个时钟源往往是之前注册好的主板上恒定的硬件时钟 内核中很多变量都需要用jiffies计算,而不是人所需要的xtime,所以对内核来说jiffies比xtime更有用。 2.

linux下的“定时器”:crontab

*爱你&永不变心* 提交于 2020-01-05 03:59:33
1、概述 crontab是用来设置在固定时间点或时间间隔执行某条指令,类似于时程表。使用-u user是指定user用户的时程表。 2、参数 -e[UserName] :调出编辑器,编辑定时任务,打开后里边有多重文本编辑器,可更具自己偏好选择,若未指定UserName,则是当前shell下的用户 -r[UserName] :删除指定用户当前的时程表,则是当前shell下的用户 -l[UserName] :列出指定用户当前的时程表,则是当前shell下的用户 -v[UserName] :列出指定用户的cron作业状态,则是当前shell下的用户 3、时程表的格式说明 F1 F2 F3 F4 F5 program (分钟 小时 日 月 星期 作业命令) 例如:5 */1 * * * /usr/sbin/ntpdate cms是指在每小时的第5分钟执行/usr/sbin/ntpdate cms这个命令。 说明见下图: 4、样例 #每天早上6点10分 10 6 * * * date #每两个小时 0 */2 * * * date #晚上11点到早上8点之间每两个小时,包括早上8点 0 23-7/2,8 * * * date #每个月的4号和每个礼拜一到礼拜三的早上11点 0 11 4 * 1-3 date #1月1日早上4点 0 4 1 1 * date 编写执行命令时要注意当前的环境变量

linux timerfd系列函数总结

不想你离开。 提交于 2019-12-21 08:46:07
网上关于timerfd的文章很多,在这儿归纳总结一下方便以后使用,顺便贴出一个timerfd配合epoll使用的简单例子 一、timerfd系列函数   timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,因此可以配合select/poll/epoll等使用。 下面对timerfd系列函数先做一个简单的介绍: (1)timerfd_create()函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); /* timerfd_create()函数创建一个定时器对象,同时返回一个与之关联的文件描述符。 clockid:clockid标识指定的时钟计数器,可选值(CLOCK_REALTIME、CLOCK_MONOTONIC。。。) CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变 CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响 flags:参数flags(TFD_NONBLOCK(非阻塞模式)/TFD_CLOEXEC(表示当程序执行exec函数时本fd将被系统自动关闭

Linux操作系统 进程之间的通信

孤人 提交于 2019-12-20 18:13:45
进程之间的通信 预备知识: 1、用户态和内核态,当一个进程在执行用户自己的代码时处于用户运行态(用户态);当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态)。 2、进程之间的通信(Inter Processs Communication- IPC )实现机制有:管道、消息队列、信号值、信号、共享内存、共享映射文件、套接字等。 3、及时通信:信号(类似中断);非及时通信:共享内存、邮箱、管道、套接字、 4、常见的信号:终止信号、定时器信号、用户自定义信号等 5、信号: 用户、系统或者进程 发送给 目标进程 的 信息 ,以通知目标进程某个 状态的改变 或 系统异常 。 6、 PCB(progress control block- 进程控制块),系统通过PCB,描述进程和控制进程。在Linux系统下,PCB是 task_struct结构体(进程描述符) 。   1、 进程状态 :记录进程是处于运行状态还是等待状态   2、 调度信息 :进程由哪个函数调度,具体怎样调度等   3、进程之间的 通讯状况   4、进程之间的 亲属关系 :在父进程和子进程之间有task_struct类型的指针,将父进程和子进程联系起来   5、 时间数据信息 :每个进程执行所占用CPU的时间   6、 进程的标志   7、 进程的标识符 :该进程唯一的标识符用来区别其他进程   8、

用内核定时器来实现的按键驱动代码分析以及测试代码

点点圈 提交于 2019-12-18 08:57:09
驱动代码: #include <linux/errno.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/input.h> #include <linux/init.h> #include <linux/serio.h> #include <linux/delay.h> #include <linux/clk.h> #include <linux/wait.h> #include <linux/sched.h> #include <asm/io.h> #include <asm/irq.h> #include <asm/uaccess.h> #include <mach/regs-clock.h> #include <plat/regs-timer.h> #include <mach/regs-gpio.h> #include <linux/cdev.h> #include <linux/miscdevice.h> #include <linux/gpio.h> #include <asm-generic/poll.h> #include <linux/poll.h> #include <linux/device.h>//udev struct

swoole-毫秒级定时器

拥有回忆 提交于 2019-12-15 04:59:49
1.打开手册 $timer_id:是定时任务执行的id。 swoole_timer_tick:是执行逻辑的函数,比如我想在定时任务中每次将user表的type值为0的修改为1 。 swoole_timer_after:是定时任务触发函数,当定时任务成功执行完毕后约定的时间后的触发函数,例-:当定时任务触发成功后5s输出一个5s:after则为一下结果: 该任务只会在定时任务触发后的约定时间内触发一次。 综合上面所述,我们结合之前封装的ws.php写入定时任务 访问一下我的自定义域名,并在linux上执行ws.php查看结果 来源: CSDN 作者: 快乐的刘多多同学 链接: https://blog.csdn.net/weixin_44320900/article/details/103458205

Linux操作系统 进程之间的通信

你。 提交于 2019-12-08 05:12:31
进程之间的通信 预备知识: 1、用户态和内核态,当一个进程在执行用户自己的代码时处于用户运行态(用户态);当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态)。 2、进程之间的通信(Inter Processs Communication- IPC )实现机制有:管道、消息队列、信号值、信号、共享内存、共享映射文件、套接字等。 3、及时通信:信号(类似中断);非及时通信:共享内存、邮箱、管道、套接字、 4、常见的信号:终止信号、定时器信号、用户自定义信号等 5、信号: 用户、系统或者进程 发送给 目标进程 的 信息 ,以通知目标进程某个 状态的改变 或 系统异常 。 6、 PCB(progress control block- 进程控制块),系统通过PCB,描述进程和控制进程。在Linux系统下,PCB是 task_struct结构体(进程描述符) 。   1、 进程状态 :记录进程是处于运行状态还是等待状态   2、 调度信息 :进程由哪个函数调度,具体怎样调度等   3、进程之间的 通讯状况   4、进程之间的 亲属关系 :在父进程和子进程之间有task_struct类型的指针,将父进程和子进程联系起来   5、 时间数据信息 :每个进程执行所占用CPU的时间   6、 进程的标志   7、 进程的标识符 :该进程唯一的标识符用来区别其他进程   8、

Linux内核定时器

≡放荡痞女 提交于 2019-12-04 12:00:40
1、前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器。在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数。 2、API接口 在Linux内核中使用全局变量jiffies来记录系统从启动以来的系统节拍数,当系统内核启动的时候,会将该jiffies初始化为0,该定义在文件kernel/include/linux/jiffies.h文件中,如下: extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies; #if (BITS_PER_LONG < 64) u64 get_jiffies_64(void); #else static inline u64 get_jiffies_64(void) { return (u64)jiffies; } #endif 在上面的代码中,jiffies_64与jiffies变量类似,jiffies_64用于64的系统,而jiffies用于32位系统,Linux内核使用HZ表示每秒的节拍数,使用jiffies/HZ可以获得系统已经运行的时间,单位为秒。 /* time_is_before_jiffies(a) return true if a is

【时间子系统】四、低精度定时器

谁说胖子不能爱 提交于 2019-12-01 16:14:44
  通过定时器,我们可以控制计算机在将来指定的某个时刻执行特定的动作。传统的定时器,以时钟滴答(jiffy)作为计时单位,因此它的精度较低(例如HZ=1000时,精度为1毫秒),我们也称之为低精度定时器。 1. 初始化定时器   我们在概述中介绍过,内核中通过init_timer对定时器进行初始化,定时器中最关键的三个信息是:到期时间、到期处理函数、到期处理函数的参数。init_timer宏及定时器结构struct timer_list(取名struct timer可能更合适)的定义如下: linux/include/linux/timer.h: #define init_timer(timer) __init_timer((timer), 0) #define __init_timer(_timer, _flags) init_timer_key((_timer), (_flags), NULL, NULL) struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct list_head entry; /*用于将当前定时器挂到CPU的tvec_base链表中*/ unsigned long expires; /