内核中的时间概念

HZ:
Linux 核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts

jiffies:
全局变量jiffies用于记录系统启动以来产生的节拍的总数。
启动时,jiffies初始化为0,此后每次时钟中断处理程序都会增加该变量的值。
linux提供了4个宏来比较节拍计数

#include <linux/jiffies.h>
#define time_after(a, b)       // b >  a
#define time_before(a, b)      // b <  a
#define time_after_eq(a, b)    // b >= a
#define time_before_eq(a, b)   // b <= a

时间获取

驱动程序中一般不需要知道墙钟时间(也就是年月日的时间)。但驱动可能需要处理绝对时间。
为此,内核提供了两个结构体,都定义在

   struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; 

(2)采用秒和纳秒值保存时间。

struct timespec { time_t  tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; 

(3)用do_gettimeofday()用于获得timeval

#include <linux/time.h>
void do_gettimeofday(struct timeval *tv); 

(4) current_kernel_time() 用于获得timespec

#include <linux/time.h>
struct timespec current_kernel_time(void);

延迟操作

1.长延迟
(1)忙等待
如果对延迟的精确度要求不高,最简单的方法是实现一个监视jiffies计时器的循环。

unsigned long delay = jiffies + 5*HZ;
while(time_before(jiffies, delay))cpu_relax();

(2)超时

#include <linux/sched.h>
signed long schedule_timeout(signed long timeout); 

timeout是用jiffies表示的延迟时间,正常值返回0.
schedule_timeout在使用前需要设置当前进程状态。

set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(2*HZ); /* 睡2秒 */  

进程经过2秒后会被唤醒。
第一行调用set_current_state已设置当前进程状态,调度器只有在超时到期且其状态为TASK_RUNNING时才会运行这个进程。如果不希望被用户空间打断,可以将进程状态设置为TASK_UNINTERRUPTIBLE。

(3)让出处理器

while(time_before(jiffies, j1)) schedule(); 

在等待期间可以让出处理器,减少CPU的负担。

2.短延迟
对于那些最多几十个毫秒的延迟,不需要依赖时间滴答

#include <Linux/delay.h>
void ndelay(unsigned long nsecs); /*延迟纳秒 */
void udelay(unsigned long usecs); /*延迟微秒 */
void mdelay(unsigned long msecs); /*延迟毫秒 */ 

这三个延迟函数均是忙等待函数,在延迟过程中无法运行其他任务。 它们的实现使用了软件循环。

实现毫秒级(或者更长)延迟还有一种方法,这种方法不涉及忙等待

#include <Linux/delay.h>
void msleep(unsigned int millisecs); /*休眠毫秒 */ void ssleep(unsigned int seconds); /*休眠秒 */
unsigned long msleep_interruptible(unsigned int millisecs);/*休眠毫秒,中断可以唤醒*/ 

linux内核时间管理(一) : 时间概念和延迟操作相关推荐

  1. Linux 驱动开发 三十五:Linux 内核时钟管理

    参考: linux时间管理,时钟中断,系统节拍_u010936265的博客-CSDN博客_系统节拍时钟中断 Linux内核时钟系统和定时器实现_anonymalias的专栏-CSDN博客_linux内 ...

  2. 【Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )

    文章目录 一.RCU 机制适用场景 二.RCU 机制特点 三.使用 RCU 机制保护链表 一.RCU 机制适用场景 在上一篇博客 [Linux 内核 内存管理]RCU 机制 ① ( RCU 机制简介 ...

  3. 踩准时钟节拍、玩转时间转换,鸿蒙轻内核时间管理有妙招

    摘要:本文带领大家一起剖析了鸿蒙轻内核的时间管理模块的源代码.时间管理模块为任务调度提供必要的时钟节拍,会向应用程序提供所有和时间有关的服务,如时间转换.统计.延迟功能. 本文分享自华为云社区< ...

  4. 【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )

    文章目录 一.retry 标号代码分析 二.retry 标号完整代码 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分析 | __allo ...

  5. Linux内核页表管理-那些鲜为人知的秘密

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 通用操作系统,通常都会开启mmu来支持虚拟 ...

  6. Linux内核-进程管理

    Linux内核-进程管理 引言 本文主要介绍Linux内核进程管理相关知识,包括进程描述符.进程创建.销毁.状态.线程的实现以及Linux进程相关命令等. 进程描述符 内核把进程的列表存放在叫做任务队 ...

  7. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  8. 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

    文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...

  9. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

    文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...

最新文章

  1. BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )
  2. Linux内存中的 buffer 和 cache
  3. 数据仓库与数据集市建模
  4. C语言 | C语言中的输出函数:printf()
  5. 解决: 网站访问报错 AccessDenied (阿里云 OSS + CDN )
  6. [转载] Python numpy函数:all()和any()比较矩阵
  7. 计算机二级晓云是企业人力,全国计算机二级MsOffice真题试卷wore
  8. SpringMVC工作总结001_SpringMVC拦截器(资源和权限管理)
  9. Gitlab-API各状态码解释
  10. delphi 发送网络消息_分布式系统与消息的投递
  11. MTK MT6763 FAQ资料集锦
  12. 霓虹灯(light)
  13. 腾讯与360你们支持谁?
  14. 使用原汁原味的Java 语言
  15. 将一个C类网络(192.168.1.0/24)划分为4个子网,每个子网至少可容纳30台主机,如何划分?
  16. linux中wps默认安装目录,在Linux中安装和使用wps
  17. navicat下的数据库迁移
  18. Cisco路由器IOS升级方法总结
  19. 老薛主机大淘客打不开解决办法
  20. 如果快速有效的读懂别人的代码?

热门文章

  1. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)
  2. rust嵌入式key/value数据库
  3. 社会经济效益参考模板
  4. SQL Server服务器名称
  5. 【目标跟踪】------deepsort
  6. 刷题回顾(持续更新)
  7. vue2数据双向绑定的原理
  8. 海思Hi3515开发板方案使用介绍
  9. 「 神器 」绝不简单的截图神器
  10. xf86-video-intel源码分析6 —— intel_device.c和intel_driver.h(1)