zoukankan      html  css  js  c++  java
  • [linux内核][linux]linux内核时间管理基础

    一,linux时间管理基础
    http://blog.csdn.net/droidphone/article/details/7975694
    http://blog.csdn.net/smilingjames/article/details/6205540
    linux所有时间基础都是以低层硬件为基础的,低层硬件有GPT和cpu local timer,比如GPT的时钟源为13M HZlinux低层时间的架构分为clock source,clock event device,clock source上层分为Xtimer和Hrtimer,Xtimer主要是指墙上时间(开机的时候从RTC寄存器读取墙上时间),Hrtimer主要是高精度的计时器,精度可以到ns级别,Clock event Device向上层提供jiffies以及时间轮的概念,比如进程切换的最小精度是10ms。

    struct clocksource,定义了一个clock device的基本属性及行为, 这些clock device一般都有计数,定时, 产生中断能力, 比如GPT
    struct clock_event_device  Clock event的主要作用是分发clock事件及设置下一次触发条件. 在没有clock event之前,时钟中断都是周期性地产生, 也就是熟知的jiffies和HZ

    二:jiffies和HZ的概念
    在ARM系统上HZ的大小一般为100,表示1s内有100个节拍,jiffies表示的是系统自从启动以来的节拍总数,jiffies一般为unsigned long类型,所以可能会溢出。比如:unsigned long jiffies; unsigned long timeout=jiffies+HZ/2;表示的是未来的0.5s
    jiffies回绕的问题:

    [cpp] view plaincopy
     
    1. 01.unsigned long jiffies;  
    2. 02.unsigned long timeout = jiffies + HZ/2;  
    3. 03.//......  
    4. 04.if (timeout > jiffies) {  
    5. 05.        //没有超时,很好  
    6. 06.}  
    7. 07.else {  
    8. 08.        //超时了,发生错误  
    9. 09.}  

    其中jiffies是个不断在增大的unsigned long,timeout可以看作比jiffies“大不了多少”的unsigned long。当jiffies变得比2^32-1还要大的时候会发生溢出,“回绕”(wrap around)到0附近。
    此时,判断语句为真,虽然实际上超时了,但是判断为没有超时。
    Linux内核提供了一组宏解决这个问题。其中宏time_after(a, b)是考虑可能的溢出情况后判断时间a是否在时间b之后(即“b < a”)。

    [cpp] view plaincopy
     
      1. 01.#define time_after(a, b) ((long)(b) - (long)(a) < 0)  
  • 相关阅读:
    常见的HTTP状态码(HTTP Status Code)说明
    eclipse tomcat maven热部署
    log4j.properties 详解与配置步骤
    js玩命加载……
    git学习
    vim学习笔记
    Android中在不同activity中进行自定义广播的解析
    Android中本地广播的实现
    Android中自定义广播的实现
    Android中获得网络状况的实现
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4232153.html
Copyright © 2011-2022 走看看