首页 / LINUX / Linux内核中的时序/时钟
Linux内核中的时序/时钟
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux内核中的时序/时钟,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3174字,纯文字阅读大概需要5分钟。
内容图文
![Linux内核中的时序/时钟](/upload/InfoBanner/zyjiaocheng/955/ff3606f73f944d138dd6c54d5eab3403.jpg)
我正在编写一个设备驱动程序,并希望对几段代码进行基准测试,以便了解我可能遇到的一些瓶颈问题.因此,我想计算几段代码.
在用户空间中,我习惯使用带有CLOCK_MONOTONIC的clock_gettime().查看内核源代码(请注意我运行的是内核4.4,但最终会进行升级),看来我有几个选择:
> getnstimeofday()
> getrawmonotonic()
> get_monotonic_coarse()
> getboottime()
为方便起见,我编写了一个函数(见下文)来获取当前时间.我目前正在使用getrawmonotonic(),因为我认为这是我想要的.我的函数将当前时间作为ktime_t返回,因此我可以使用ktime_sub()来获取两次之间的经过时间.
static ktime_t get_time_now(void) {
struct timespec time_now;
getrawmonotonic(&time_now);
return timespec_to_ktime(time_now);
}
鉴于可用的高分辨率时钟功能(jiffies对我来说不起作用),我给定的应用程序的最佳功能是什么?更一般地说,我对任何/所有关于这些函数和基础时钟的文档感兴趣.首先,我很好奇时钟是否受到任何时序调整及其时代的影响.
解决方法:
您是否正在将您在内核中进行的测量直接与您在用户空间中进行的测量进行比较?我想知道您选择使用CLOCK_MONOTONIC_RAW作为内核中的时基,因为您选择在用户空间中使用CLOCK_MONOTONIC.如果你在内核中寻找一个返回CLOCK_MONOTONIC(而不是CLOCK_MONOTONIC_RAW)时间的类似和非粗略函数,请查看ktime_get_ts().
有可能你也可以使用原始内核滴答来测量你想要测量的东西(而不是jiffies,代表多个内核滴答),但我不知道如何做到这一点.
一般情况下,如果您正在尝试查找有关Linux计时的文档,可以查看Documentation / timers / timekeeping.txt.通常当我试图找出内核计时时,我也很遗憾地花了很多时间及时阅读内核源代码/(time / timekeeping.c是你现在正在考虑使用的大部分功能的地方…它不是超级评论,但你可以用一点时间把它包裹起来.如果你在学习后感到无私,请记住更新文档是一个有助于内核的好方法:)
最后,您的问题是时钟调整如何影响时钟以及使用的时期:
CLOCK_REALTIME总是从1970年1月1日午夜(俗称Unix Epoch)开始,如果没有RTC存在或者它还没有被用户空间中的应用程序设置(或者我想如果你想成为内核模块)奇怪的).通常,设置它的用户空间应用程序是ntp守护程序,ntpd或chrony或类似的.它的值代表自1970年以来经过的秒数.
CLOCK_MONTONIC表示自设备启动以来经过的秒数,如果设备在CLOCK_MONOTONIC值为x时暂停,当它恢复时,它将恢复,同时CLOCK_MONOTONIC设置为x.它在古代内核上不受支持.
CLOCK_BOOTTIME类似于CLOCK_MONOTONIC,但是在暂停/恢复时有时间添加到它 – 所以如果你暂停在CLOCK_BOOTTIME值x,持续5秒,你将返回CLOCK_BOOTTIME值为x 5.它在旧版本中不受支持内核(它的支持是在CLOCK_MONOTONIC之后发生的).
完全充实的NTP守护进程(不是SNTP守护进程 – 这是一个更轻量级,创建精度更低的协议)使用settimeofday()进行大调整(“步骤”或“跳转”)设置系统时钟或CLOCK_REALTIME – 这些立即影响CLOCK_REALTIME的总值,并使用adjtime()进行较小的调整(“回转”或“倾斜”) – 这些会影响CLOCK_REALTIME每CPU时钟周期向前移动的速率.我认为对于某些体系结构,您实际上可以通过某种方式或其他方式调整CPU时钟周期,并且如果可能,内核以这种方式实现adjtime(),但不要引用我的话.从内核的大部分角度和用户空间的角度来看,它实际上并不重要.
CLOCK_MONOTONIC,CLOCK_BOOTTIME以及所有其他朋友以与CLOCK_REALTIME相同的速率进行转换,这在大多数情况下实际上相当方便.它们不受CLOCK_REALTIME中的步骤的影响,只有slews才会受到影响.
CLOCK_MONOTONIC_RAW,CLOCK_BOOTTIME_RAW和朋友不会以与CLOCK_REALTIME,CLOCK_MONOTONIC和CLOCK_BOOTIME相同的速率进行转换.我想这有时很有用.
Linux为用户空间提供了一些特定于进程/线程的时钟(CLOCK_PROCESS_CPUTIME_ID,CLOCK_THREAD_CPUTIME_ID),我对此一无所知.我不知道它们是否可以在内核中轻松访问.
内容总结
以上是互联网集市为您收集整理的Linux内核中的时序/时钟全部内容,希望文章能够帮你解决Linux内核中的时序/时钟所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。