gpt4 book ai didi

linux - time_after() linux 宏关于 jiffies 的回绕是否 100% 万无一失?

转载 作者:可可西里 更新时间:2023-11-01 11:47:45 27 4
gpt4 key购买 nike

基于我在 linux/include/linux/jiffies.h 中找到的代码:

41 #define time_after(a,b)         \
42 (typecheck(unsigned long, a) && \
43 typecheck(unsigned long, b) && \
44 ((long)(b) - (long)(a) < 0))

在我看来,没有涉及任何环绕监控。因此,如果 jiffies(a) 环绕并返回到非常接近超时 (b) 的位置,那么结果将是“假”,而实际上它是“真”。

让我们在这个例子中使用一些相当小的数字。比如,time_after(110,150),其中 110 是 jiffies,150 是超时。结果显然是错误的——无论 jiffies 是否环绕:150-110 总是 > 0。

所以,我只是想确认我没有遗漏任何东西,事实确实如此。

最佳答案

需要说明的是,在您的示例中,因为 110 不在 150 之后,time_after(110,150) 应该(并且确实)返回 false。来自评论:

time_after(a,b) returns true if the time a is after time b.

另外,请注意代码确实处理了回绕到 0 的问题。为了让下面的内容更容易理解,我将使用无符号和有符号的一字节值,即 8 位 2 的补码。但是这个论点是普遍的。

假设 b 为 253,5 个滴答后 jiffies 回绕到 2。因此我们期望 time_after(2,253) 返回 true。它确实如此(使用 int8_t 表示带符号的 8 位值):

(int8_t) 253 - (int8_t) 2 == -3 - 2 == -5 < 0

您也可以尝试其他值。这个比较棘手,对于 time_after(128, 127),这也应该是正确的:

(int8_t) 127 - (int8_t) 128 == 127 - (-128) == 255 == -1 (for 8-bit 2's complement) < 0

实际上,表达式 (int8_t) 127 - (int8_t) 128 的类型是一个 int,值实际上是 255。但是使用 long 表达式类型将是 long 并且等效示例是,对于 time_after( 2147483648, 2147483647):

(long) 2147483647 - (long) 2147483648 == 2147483647 - (-2147483648) == 4294967295 == -1 < 0

最终,环绕后,“之后”的 jiffies 值 a 将开始 catch 之前的值 b,并且 time_after(a,b ) 会报错。对于 N 位 2 的补码,当 a 比 b 晚 2^(N-1) ticks 时会发生这种情况。对于 N=8,当 a 在 b 之后 128 个刻度时会发生这种情况。对于 N=32,这是 2147483648 个滴答声,或者(1 毫秒滴答声)大约 25 天。

对于数学倾向的人,我相信一般 time_after(a,b) 返回真当且仅当 (a-b) 的最小残差(模 2^N)是 > 0 且 < 2^( N-1).

关于linux - time_after() linux 宏关于 jiffies 的回绕是否 100% 万无一失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com