It'*_*ete 4 c linux linux-kernel
我正在编写一个设备驱动程序,并希望对一些代码进行基准测试,以了解可能遇到的瓶颈。结果,我想计时一些代码段。
在用户空间,我已经习惯了使用clock_gettime()与CLOCK_MONOTONIC。查看内核源代码(请注意,我正在运行内核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);
}
Run Code Online (Sandbox Code Playgroud)
给定可用的高分辨率时钟功能(jiffies对我不起作用),对于给定的应用程序,最佳功能是什么?一般来说,我对有关这些功能和基础时钟的任何/所有文档都感兴趣。首先,我很好奇时钟是否受到任何时序调整的影响以及它们的时期。
您是否将内核中进行的测量与用户空间中进行的测量直接进行比较?我想知道您是否选择CLOCK_MONOTONIC_RAW在内核中用作时基,因为您选择CLOCK_MONOTONIC在用户空间中使用。如果您正在内核中寻找一个返回时间CLOCK_MONOTONIC(而不是返回CLOCK_MONOTONIC_RAW时间)的类似且粗略的函数,请查看ktime_get_ts()。
您也可能使用原始内核滴答来测量您要测量的内容(而不是代表多个内核滴答的jiffies),但我不知道该怎么做。
通常,如果您要查找有关Linux计时的文档,可以查看一下Documentation/timers/timekeeping.txt。通常,当我试图弄清楚内核的计时方式时,我也很不幸地花了很多时间来阅读内核源代码time/(这time/timekeeping.c是您正在考虑使用的大多数功能现在都在使用的地方……它不是超级好用,但您可能需要一点时间才能将头缠住它)。而且,如果您在学习后感到无私,请记住,更新文档是对内核做出贡献的好方法:)
最后,您的问题是关于时钟如何受到时序调整的影响以及使用了哪些时间段:
CLOCK_REALTIME如果不存在RTC或用户空间中的应用程序尚未设置RTC,则它总是从1970年1月1日午夜开始(俗称Unix Epoch)(或者如果您想变得怪异的话,我猜是一个内核模块) )。通常这台本用户空间应用是NTP守护进程,ntpd或chrony或相似。它的值表示自1970年以来经过的秒数。
CLOCK_MONTONIC表示自设备启动以来经过的秒数,如果设备以的CLOCK_MONOTONIC值挂起x,则在恢复时将恢复为,CLOCK_MONOTONIC设置x为。古代内核不支持此功能。
CLOCK_BOOTTIME就像CLOCK_MONOTONIC,但是在暂停/恢复之间增加了时间-因此,如果您以的CLOCK_BOOTTIME值暂停x5秒钟,则返回的CLOCK_BOOTTIME值为x+5。旧内核不支持此功能(其支持来自CLOCK_MONOTONIC)。
完全充实NTP守护程序(不SNTP守护进程-这是一个更轻巧和精度较差,创建协议)设置系统时钟,或CLOCK_REALTIME使用settimeofday()了大的调整(“步”或“跳跃”) -这立即影响总价值的值CLOCK_REALTIME,并adjtime()用于较小的调整(“偏斜”或“偏斜”),这些都会影响CLOCK_REALTIME每个CPU时钟周期向前移动的速率。我认为对于某些体系结构,您实际上可以通过某种方式来调整CPU时钟周期,并且内核adjtime()在可能的情况下以这种方式实现,但请不要在此引用我的观点。从内核的大部分角度和用户空间的角度来看,这实际上都没有关系。
CLOCK_MONOTONIC,CLOCK_BOOTTIME和所有其他朋友以与相同的速率摆动CLOCK_REALTIME,这在大多数情况下实际上非常方便。它们不受CLOCK_REALTIME步入的影响,仅受转换的影响。
CLOCK_MONOTONIC_RAW,CLOCK_BOOTTIME_RAW和朋友不以同样的速度为他杀CLOCK_REALTIME,CLOCK_MONOTONIC和CLOCK_BOOTIME。我想有时候这很有用。
Linux提供了一些进程/线程特定的时钟到用户空间(CLOCK_PROCESS_CPUTIME_ID,CLOCK_THREAD_CPUTIME_ID),我一无所知。我不知道它们是否可以在内核中轻松访问。
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |