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代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
随机推荐
- wpf 面试题目
初级工程师 解释什么是依赖属性,它和以前的属性有什么不同?为什么在WPF会使用它?什么是样式什么是模板绑定(Binding )的基础用法解释这几个类的作用及关系: Visual, UIElement, ...
- G面经prepare: Straight Partition of A Deck of Cards
Define “Straight” as 5 cards with consecutive numbers. Determine if the deck can be fully divided in ...
- ADO.net 扩展属性
扩展属性 处理:有外键关系时将代号化信息处理成原始文字,让用户可看懂的(粗略解释) 利用扩展属性 如:users表中的民族列显示的是民族代号处理成Nation表中的民族名称 需要在users类里面扩展 ...
- weiphp---------图灵机器人存在的bug。
1.很多人下载下来weiphp源码以后,配置好了图灵机器人却不能使用.原因是因为他源码里面存在一个小bug 上图红色框框内是他的源码,问题就出在这里. 修改方法: if($result ['code' ...
- qsort函数用法
qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(co ...
- SpringMvc:视图和视图解析器
请求处理方法执行完成后,最终返回一个ModelAndView对象,对于返回String,View或ModelMap等类型的处理方法,SpringMvc也会在内部将它们装配成一个ModelAndView ...
- C语言 单引号 双引号问题
C语言中的单引号和双引号含义迥异,用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值,因此,采用ASCII字符集的编译器而言,‘a’的含义与0141或97严格一 ...
- js 获取选中的多选框
前台html <span class="spbox"> <input type="checkbox" name="category& ...
- 几款python集成开发环境
以下软件的测试环境为ArchLinux64位系统.对软件的介绍很粗略,详细介绍参考官网. 1-名称:eric 官网:http://eric-ide.python-projects.org/ 特点:该软 ...
- linux中模块的相关操作
/lib/modules/[kernel版本]/modules.dep 这个文件记录了模块的依赖关系 modprobe 和 insmod 这两个命令都可以加载模块,但是modeprobe会自动分析模块 ...