Linux hrtimer分析(2)
http://blog.csdn.net/angle_birds/article/details/17375901
本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时行为的区别。本文暂不考虑高精度模式对Linux系统时钟中断的影响。
在没有配置高精度模式时,hrtimer的超时在系统时钟中断的轮循中检查,所以此时hrtimer的定时精度还是以轮循的间隔为单位,精度与传统的时间轮定时器一样。
在配置高精度模式后,hrtimer的超时由struct clock_event_device的超时中断完成。clock_event_device一般来说描述的都是一个硬件定时器,其定时精度由硬件系统时钟,即晶震的频率来决定,所以精度很高,这也是高精度时钟这个名称的由来。
下面简要介绍一下在配置了高精度模式之后hrtimer的实现细节。
1. 添加hrtimer
在配置高精度模式后,添加hrtimer也是由函数hrtimer_start完成,这与没有配置高精度模式时一样。但是,高精度模式时,如果添加的hrtimer在红黑树的最左边一个节点,即要添加的hrtimer是将会第一个到期的hrtimer时,那么这时会调用子函数hrtimer_enqueue_reprogram重新设置clock_event_device的超时中断。
hrtimer_enqueue_reprogram
hrtimer_reprogram
tick_program_event
tick_dev_program_event
clockevents_program_event
struct clock_event_device * pDev->set_next_event
2. 删除hrtimer
删除hrtimer时的改动与添加hrtimer一样,需要考虑删除的定时器正好是红黑树中最左边节点的情况。因为此时clock_event_device的超时中断设置的超时值正好是要删除的定时器的超时值。
3. hrtimer的到期
未配置高精度模式时,hrtimer的到期由函数hrtimer_run_queues检查。hrtimer_run_queues是在run_local_timers中被调用,而run_local_timers又是在系统时钟中断中被调用。从这里可以看出,与传统的使用时间轮算法的定时器一样,hrtimer在未配置高精度模式时采用了在每一个系统时钟中断中轮循的方式来判断hrtimer是否到期,因此,这里的定时精度为时钟中断轮循的时间间隔。
但是,在函数hrtimer_run_queues的开始处,会执行一项检查:
if (hrtimer_hres_active())
return;
所以在配置高精度模式后,这里的hrtimer_run_queues函数相当于空函数,会直接返回。
配置了高精度模式之后,hrtimer的到期由clock_event设备的中断处理来调用,处理函数为hrtimer_interrupt。注意这里不再采用传统的轮循方式判断定时器是否到期,而是通过设置clock_event_device的延时中断,在第一个到期的定时器超时的时间点触发一个中断来执行超时操作。所以,这里的定时精度由clock_event_device的计时精度决定。
4. 软中断
未配置高精度模式时,如果hrtimer设置了软中断标记位,触发其超时处理的软中断为TIMER_SOFTIRQ。配置高精度模式后,系统为hrtimer分配了一个专用的软中断,软中断编号为HRTIMER_SOFTIRQ。
Linux hrtimer分析(2)的更多相关文章
- Linux hrtimer分析(一)
http://blog.csdn.net/angle_birds/article/details/17375883 本文分析了Linux2.6.29中hrtimer的实现. Linux2.6中实现了一 ...
- linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...
- Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
- linux内核分析作业5:分析system_call中断处理过程
1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
- linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码
计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针 (stack pointer) ...
- linux内核分析作业3:跟踪分析Linux内核的启动过程
内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
随机推荐
- 不等高cell搭建(二)
一.commentView模块搭建 commentView样式分为两种 1.xib搭建界面 1.1 因为评论的样式大体上一样,我们可以用同一个xib来处理 1.2 最热评论 用 ...
- css less
LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LESSCSS可以在多种语 ...
- Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-1
学习目标 一.进一步学习Swift的游戏制作 二.掌握SKNode,SKSpriteNode的运用 三.了解SpriteKit的物理系统 四.掌握动作(SKAction)的运用 在这一章,我们要通过制 ...
- Leetcode: Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
- websotrm注册码
webStorm : UserName:William ===== LICENSE BEGIN ===== 45550-12042010 00001SzFN0n1bPII7FnAxnt0DDOPJA ...
- java.面向对象特征
面向对象特征: 封装,多态,继承 面向对象思想: 封装,继承,多态,接口
- java多线程实现卖票小程序
package shb.java.demo; /** * 多线程测试卖票小程序. * @Package:shb.java.demo * @Description: * @author shaobn * ...
- drds 广播表的创建以及使用
创建表 , 关键词 : BROADCAST CREATE TABLE `financial_product_yjw` ( `ID` int(10) unsigned NOT NULL AUTO_INC ...
- 夺命雷公狗---DEDECMS----26dedecms面包屑导航的实现
我们在很多项目里面都会用到面包屑导航,而dedecms里面也是给我们封装好面包屑导航的了,如下图所示: 在dede里面实现面包屑导航主要用到{dede:field.position/}标签,我们首先来 ...
- 8007003Windows Update遇到未知错误
如果在检查更新时收到 Windows Update 错误 80070003,则需要删除 Windows 用于标识计算机更新的临时文件.若要删除临时文件,请停止 Windows Update 服务,删除 ...