一 内核中的时间观念

内核在硬件的帮助下计算和管理时间。硬件为内核提供一个系统定时器用以计算流逝的时间。系

统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理。

墙上时间和系统运行时间根据时钟间隔来计算。

利用时间中断周期执行的工作:

更新系统运行时间;

更新实际时间;

在smp系统上,均衡调度程序中各处理器上运行队列;

检查当前进程是否用尽了时间片,重新进行调度;

运行超时的动态定时器;

更新资源消耗和处理器时间的统计值;

二 节拍率

系统定时器的频率;通过静态预处理定义的——HZ;系统启动按照HZ值对硬件进行设置。体系结构不同,HZ值也不同;HZ可变的。

    //内核时间频率

    #define HZ 1000

提高节拍率中断产生更加频繁带来的好处:

提高时间驱动事件的解析度;

提高时间驱动事件的准确度;

内核定时器以更高的频度和准确度;

依赖顶上执行的系统调用poll()和select()能更高的精度运行;

系统时间测量更精细;

提高进程抢占的准确度;

提高节拍率带来的副作用:

中断频率增高系统负担增加;

中断处理程序占用处理器时间增多;

频繁打断处理器高速缓存;

节拍率HZ值需要在其中进行平衡。

三 jiffies

  jiffies:全局变量,用来记录自系统启动以来产生的节拍总数。启动时内核将该变量初始化为0;

此后每次时钟中断处理程序增加该变量的值。每一秒钟中断次数HZ,jiffies一秒内增加HZ。系统运行时间 = jiffie/HZ.

jiffies用途:计算流逝时间和时间管理

jiffies内部表示:

extern u64 jiffies_64;

extern unsigned long volatile jiffies;     //位长更系统有关32/64

  32位:497天后溢出

  64位:……

//0.5秒后超时

unsigned long timeout = jiffies + HZ/2;
…… //注意jiffies值溢出回绕用宏time_before 而非 直timeout > jiffies
if(time_before(jiffies,timeout)){ //没有超时
}else{ //超时
}

四 硬时钟和定时器

  两种设备进行计时:系统定时器和实时时钟。

实时时钟(RTC):用来持久存放系统时间的设备,即便系统关闭后,靠主板上的微型电池提供电力保持系统的计时。

    系统启动内核通过读取RTC来初始化墙上时间,改时间存放在xtime变量中。

系统定时器:内核定时机制,注册中断处理程序,周期性触发中断,响应中断处理程序,进行处理执行以下工作:

  l  获得xtime_lock锁,访问jiffies和更新墙上时间xtime;

  l  更新实时时钟;

  l  更新资源统计值:当前进程耗时,系统时间等;

  l  执行已到期的动态定时器;

  l  执行scheduler_tick()

//中断处理程序
irqreturn_t timer_interrupt(int irq, void *dev)
{
//ticks have passed
long nticks; xtime_update(nticks); while (nticks--)
update_process_times(user_mode(get_irq_regs())); return IRQ_HANDLED;
} void xtime_update(unsigned long ticks)
{
//seq锁
write_seqlock(&xtime_lock); do_timer(ticks); write_sequnlock(&xtime_lock);
} void do_timer(unsigned long ticks)
{
jiffies_64 += ticks; //更新墙上时间 ——实际时间
update_wall_time(); calc_global_load(ticks);
} void update_process_times(int user_tick)
{
struct task_struct *p = current; //计算当前进程执行时间
account_process_tick(p, user_tick); //触发软中断TIMER_SOFTIRQ 超时的timer
run_local_timers(); //计算进程时间片
scheduler_tick(); }

五 定时器

定时器:管理内核时间的基础,推后或执行时间执行某些代码。

定时器数据结构:

struct timer_list {
struct list_head entry; //定时值基于jiffies
unsigned long expires; //定时器内部值
struct tvec_base *base; //定时器处理函数
void (*function)(unsigned long); //定时器处理函数参数
unsigned long data; ……
};

定时器使用:

    struct timer_list my_timer;

       //初始化定时器
init_timer(&my_timer); …… //激活定时器
add_timer(&my_timer); //删除定时器
del_timer(my_timer); ……

六 延迟执行

使用定时器和下半部机制推迟执行任务。还有其他延迟执行的机制:

忙等待:

利用节拍,精确率不高

unsigned long delay = jiffies + 2*HZ ; //2秒 节拍整数倍才行;

while(time_before(jiffies,delay))

;

短延迟:延迟时间精确到毫秒,微妙;短暂等待某个动作完成时,比时钟节拍更短;依靠数次循环达到延迟效果。

void udelay(unsigned long usecs)

void mdelay(unsigned long msecs)

schedule_timeout()延迟:使执行的任务睡眠指定时间,达到延迟

signed long __sched schedule_timeout(signed long timeout)
{
struct timer_list timer;
unsigned long expire; switch (timeout)
{
   case MAX_SCHEDULE_TIMEOUT: //无限期睡眠
schedule();
goto out;
  default:
if (timeout < 0) {
current->state = TASK_RUNNING;
goto out;
}
}
//超时时间
expire = timeout + jiffies; //初始化一个timer定时器 参数current task
setup_timer_on_stack(&timer, process_timeout, (unsigned long)current); __mod_timer(&timer, expire, false, TIMER_NOT_PINNED); schedule(); del_singleshot_timer_sync(&timer); /* Remove the timer from the object tracker */
destroy_timer_on_stack(&timer);
timeout = expire - jiffies; out:
return timeout < 0 ? 0 : timeout;
} static void process_timeout(unsigned long __data)
{
//唤醒被睡眠的任务
wake_up_process((struct task_struct *)__data);
}

(笔记)Linux内核学习(八)之定时器和时间管理的更多相关文章

  1. Linux内核设计与实现 总结笔记(第十一章)定时器和时间管理

    时间管理在内核中占用非常重要的地位,内核中有大量的函数都需要基于时间驱动的,内核对相对时间和绝对时间都非常需要. 一.内核中的时间概念 内核必须在硬件的帮助下才能计算和管理时间,系统定时器以某种频率自 ...

  2. (笔记)Linux内核学习(九)之内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  3. (笔记)Linux内核学习(四)之系统调用

    一 用户空间和内核空间 Linux内核将这4G字节虚拟地址空间的空间分为两部分: l  将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”. l  ...

  4. (笔记)Linux内核学习(一)之内核介绍

    内核与操作系统: 内核是操作系统的核心部分,包含了系统运行的核心过程,决定系统的性能,操作系统启动内核被装入到RAM中: 操作系统与底层硬件设备交互和为运行应用程序提供执行环境. Linux内核与微内 ...

  5. (笔记)Linux内核学习(二)之进程

    一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对 ...

  6. (笔记)Linux内核学习(十)之虚拟文件系统概念

    虚拟文件系统 虚拟文件系统:内核子系统VFS,VFS是内核中文件系统的抽象层,为用户空间提供文件系统相关接口: 通过虚拟文件系统,程序可以利用标准Linux文件系统调用在不同的文件系统中进行交互和操作 ...

  7. (笔记)Linux内核学习(三)之进程调度

    进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...

  8. (笔记)Linux内核学习(十一)之I/O层和I/O调度机制

    一 块I/O基本概念 字符设备:按照字符流的方式被有序访问的设备.如串口.键盘等. 块设备:系统中不能随机(不需要按顺序)访问固定大小的数据片(chunk 块)的设备. 如:硬盘.软盘.CD-ROM驱 ...

  9. (笔记)Linux内核学习(六)之并发和同步概念

    一 临界区和竞争条件 临界区:访问和操作共享数据的代码段. 竞争条件:多个执行线程处于同一个临界区中. 处于竞争条件:造成访问的数据或者资源不一致状态: 对资源i的访问:ProcessA和B访问后得到 ...

随机推荐

  1. HTML锁定Table中某一列

    1. 2. 3. function ChangeTable() { var type = document.getElementById("ddl_ReportType").val ...

  2. WPF快速入门系列(3)——深入解析WPF事件机制

    一.引言 WPF除了创建了一个新的依赖属性系统之外,还用更高级的路由事件功能替换了普通的.NET事件. 路由事件是具有更强传播能力的事件——它可以在元素树上向上冒泡和向下隧道传播,并且沿着传播路径被事 ...

  3. Asp.Net Web API 2第六课——Web API路由和动作选择

    Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web AP ...

  4. Entity Framework 乐观并发控制

    一.背景 我们知道,为了防止并发而出现脏读脏写的情况,可以使用Lock语句关键字,这属于悲观并发控制的一种技术,,但在分布式站点下,锁的作用几乎不存在,因为虽然锁住了A服务器的实例对象,但B服务器上的 ...

  5. [BTS] MSDTC

    A message sent to adapter "WCF-SQL" on send port "SP.TMS.InsertDataToDB.WCFSQL" ...

  6. 如何绕过chrome的弹窗拦截机制

    如何绕过chrome的弹窗拦截机制 在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的.举个例子: var btn = $('#btn'); btn.click(fun ...

  7. C语言实现二叉树-01版

    故事是这样开始的,项目经理有一天终于还是拍拍我肩膀说: 无论你的链表写得多么的好,无论是多么的灵活,我也得费老半天才查找到想要的数据: 这让我的工作非常苦恼,听说有一种叫做二叉树的数据结构,你看能不能 ...

  8. paip.环境配置整合 ibatis mybatis proxool

    paip.环境配置整合 ibatis mybatis proxool  索引: ///////////1.调用 ///////////////2. ibatis 主设置文件  com/mijie/ho ...

  9. Cocoa编程开发者手册

    Cocoa编程开发者手册(Objective-C权威著作超一流翻译阵容) [美] 奇斯纳尔(Chisnall,D.)  著 霍炬等 译 ISBN 978-7-121-12239-2 2013年7月出版 ...

  10. iOS开发-迭代器模式

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...