加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

浅析Linux中的时间编程和实现原理(三) Linux内核的工作

发布时间:2016-10-31 01:41:10 所属栏目:Linux 来源:网络整理
导读:引子 时间系统的工作需要软硬件以及操作系统的互相协作,在上一部分,我们已经看到大多数时间函数都依赖内核系统调用,GlibC 仅仅做了一次请求的转发。因此必须

其他两种 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中的时间编程和实现原理(三) Linux内核的工作

可以看到 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。我们在下一部分将继续介绍内核的高精度时间系统。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读