基于我在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,并且后来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.但是使用longs表达式类型将是long,而等效示例将是,time\_after(2147483648, 2147483647):

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

最终,在环绕后,“后”jiffies值a将开始赶上前值b,而time\_after(a,b)将报告false.对于N位2的补码,当a比b更晚2 ^(N-1)个滴答时,会发生这种情况.对于N = 8,当a在b之后是128个滴答时发生.对于N = 32,那是2147483648个滴答,或者(有1毫秒的滴答)大约25天.

对于数学上倾向的,我认为通常time\_after(a,b)如果(a-b)的最小残差(模2 ^ N)> 1,则返回真. 0和< 2 ^(N-1).

标签: linux

相关文章推荐

添加新评论,含*的栏目为必填