浅析Linux中的时间编程和实现原理(三) Linux内核的工作
|
其他两种 Timer(CLOCK_PROCESS_CPUTIME_ID 和 CLOCK_THREAD_CPUTIME_ID) 的实现有点儿复杂。因为用户可以创建任意多的 POSIX Timer。CLOCK_REALTIME 和 CLOCK_MONOTONIC 基于数量不限的动态 Timer,因此可以创建任意数目的定时器。 但 CLOCK_PROCESS_CPUTIMER_ID 和 CLOCK_THREAD_CPUTIME_ID,并不依赖动态 Timer,必须在进程描述符中想办法。 2.6.12 在进程描述符中引入了两个 cpu_timers 数组 (所谓 CPU TIME,即进程/线程真正在 CPU 上执行的时间,包括内核态时间和用户态的时间): 一个在进程描述符 task_stuct 中。另一个放在进程描述符的 signal 数据结构中。用 task 表示进程描述符,两个 cpu timers 数组如下: task->cpu_timers[3]:用来维护 per-thread 的 CPU Timer task->signal->cpu_timers[3]:用来维护 per-process 的 CPU Timer. 该数组的每个元素都维护一个 Timer 列表。如下图所示: 图 5. 进程控制块中的 CPU-TIMER
可以看到 Linux 采用排序列表来存放 CLOCK_PROCESS_CPUTIMER_ID 和 CLOCK_THREAD_CPUTIME_ID 的 Timer,即上图中红色的列表(cpu_timer[CPUCLOCK_SCHED])。每当定时中断发生时,会检查这两个链表,如果发现有到期的定时器就触发它们。通过这两个数组,内核支持用户创建任意多 CLOCK_PROCESS_CPUTIMER_ID/CLOCK_THREAD_CPUTIME_ID 类型的 POSIX 定时器。 小结 随着时光推移,精度为 jiffy 的时钟已经不能满足所有的要求了。越来越强的呼声是高精度时钟,通过提高 HZ 毕竟是有限的,一些系统上已经采用了 1000 的 HZ 配置,再继续增高将导致时钟中断的开销过大,从而降低整个系统的处理能力。经过了多年的不断尝试和开发,Linux 内核终于在 2.6.16 版本中加入了 HRTIMER。我们在下一部分将继续介绍内核的高精度时间系统。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


