Vil*_*ray 10 linux linux-kernel
据我所知,USER_HZ在Linux 2.6中添加了常量来解决HZ用户空间价值期望所引起的问题:在以前版本的Linux中,更改HZ值可能会导致用户空间应用程序中的值无意中缩放.
我对USER_HZ常量如何解决这个缩放问题感到困惑.例如,假设用户空间应用程序将jiffies转换为秒:
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;
Run Code Online (Sandbox Code Playgroud)
由于用户空间应用程序HZ通过sysconf调用确定值,这不会阻止扩展问题吗?
另一方面,如果用户空间应用程序确实将HZ值硬编码到其源中,那么USER_HZ常量如何防止扩展问题 - 用户空间应用程序将使用其硬编码常量而不是系统USER_HZ,并且不能保证硬编码常数匹配USER_HZ?
此外,用户空间(例如/proc)已经缩放到的所有时钟滴答值是否可用USER_HZ?用户空间程序如何知道jiffies中的值是缩放HZ还是USER_HZ?
USER_HZ实现了折衷方案:虽然用户代码可能具有不同的硬编码值USER_HZ,但Linux内核历史上的HZ值为100 - 因此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.
Run Code Online (Sandbox Code Playgroud)
现在,这就留下了为什么一些内核jiffies暴露给未缩放的用户空间(例如in /proc/timer_list)的问题.Thomas Gleixner解释说:
所有事实上的API,系统调用以及proc /中的各种文件的实例都必须在USER_HZ中,因为用户空间应用程序依赖于USER_HZ值.
proc/timer_list不受此限制,因为它更像是一个不属于严格内核API的调试接口.我们真的希望看到真正的价值,而不是为此目的看到缩放的USER_HZ.我希望能回答你的问题.
因此,作为严格内核API一部分的所有实例都是为了USER_HZ在暴露给用户空间之前扩展内核jiffies ,其他实例是免除的.
来自Linux内核开发(或第2版的在线版本)
在2.6之前的内核中,更改值会
HZ导致用户空间异常.发生这种情况是因为值以每秒滴答为单位导出到用户空间.随着这些接口成为永久性的,应用程序变得依赖于特定的值HZ.因此,更改HZ会将各种导出值按某种常量进行缩放 - 无需知道用户空间.正常运行时间为20小时,实际上是两个小时.为了防止出现此类问题,内核需要扩展所有导出的jiffies值.它通过定义来实现
USER_HZ,这是HZ用户空间期望的值.在x86上,因为HZ历史上是100,所以USER_HZ是100.
USER_HZ导出到用户空间时,每秒刻度始终缩放.