USER_HZ如何解决jiffy扩展问题?

时间:2013-07-01 18:06:18

标签: linux linux-kernel

据我了解,在Linux 2.6中添加了USER_HZ常量来解决用户空间中HZ值的期望所引起的问题:在以前版本的Linux中,更改{{ 1}}值可能会导致无意中缩放用户空间应用程序中的值。

我对HZ常量如何解决这个缩放问题感到困惑。例如,假设用户空间应用程序将jiffies转换为秒:

USER_HZ

由于用户空间应用程序通过long MY_HZ = sysconf(_SC_CLK_TCK); /* num_jiffies acquired from /proc but * simplified to 1000 here for clarity */ long num_jiffies = 1000; long num_seconds = num_jiffies / MY_HZ; 调用确定HZ值,这是否会阻止扩展问题?

另一方面,如果用户空间应用程序确实在其源中具有sysconf硬编码,那么HZ常量如何防止出现扩展问题 - 用户空间应用程序将使用其硬编码常量而不是系统的USER_HZ,并且无法保证硬编码常量匹配{ {1}}?

此外,用户空间(例如USER_HZ)可用的所有时钟刻度值是否已缩放为USER_HZ?用户空间程序如何知道 jiffies 中的值是否缩放为/procUSER_HZ

2 个答案:

答案 0 :(得分:9)

USER_HZ是作为折衷方案实现的:虽然用户代码的硬编码值可能与USER_HZ不同,但Linux内核历史上的HZ 100 < / strong> - 因此现有用户代码中的所有硬编码HZ值几乎都设置为 100

以下是发生的事情的本质:

The Linux kernel used to have HZ set at a constant 100 for all
architectures. As additional architecture support was added, the HZ
value became variable: e.g. Linux on one machine could have a HZ
value of 1000 while Linux on another machine could have a HZ value
of 100.

This possibility of a variable HZ value caused existing user code,
which had hardcoded an expectation of HZ set to 100, to break due to
the exposure in userspace of kernel jiffies which may have be based
on a HZ value that was not equal to 100.

To prevent the chaos that would occur from years of existing user
code hardcoding a constant HZ value of 100, a compromise was made:
any exposure of kernel jiffies to userspace should be scaled via a
new USER_HZ value -- thus preventing existing user code from
breaking on machines with a different HZ value, while still allowing
the kernel on those machines to have a HZ value different from the
historic 100 value.

现在,这就留下了为什么一些内核jiffies暴露给未缩放的用户空间(例如在/proc/timer_list中)的问题。 Thomas Gleixner explains

  

事实上的所有API,系统调用以及proc /中的各种文件的所有实例都必须在USER_HZ中,因为用户空间应用程序依赖于   USER_HZ值。

     

proc / timer_list免除了,因为它更多的是调试   接口不是严格的内核API的一部分。我们真的   想要查看真实值而不是缩放的USER_HZ   目的。我希望能回答你的问题。

因此,所有属于严格内核API的实例都是为了在暴露给用户空间之前通过USER_HZ扩展内核jiffies,其他实例都是免除的。

另见

  

The Tick Rate: HZ section of Linux Kernel Development Second Edition by Robert Love

答案 1 :(得分:6)

来自Linux Kernel Development(或online version of the 2nd Edition

  

在2.6之前的内核中,更改HZ的值会导致   用户空间异常。发生这种情况是因为值被导出   用户空间,以每秒刻度为单位。随着这些接口成为   永久性,应用程序增长依赖于HZ的特定值。   因此,更改HZ会缩放各种导出值   一些不变 - 没有用户空间知道。正常运行时间为20小时   当它实际上是两个。

     

为防止出现此类问题,内核需要扩展所有导出的内容   jiffies值。它是通过定义USER_HZ来实现的,HZHZ   用户空间期望的价值。在x86上,因为USER_HZ是历史性的   100,USER_HZ为100。

导出到用户空间时,每秒秒数总是缩放到{{1}}。