函数round_jiffies_up_relative( )用于将参数j加上当前节拍数jiffies表示的节拍数取整变成HZ(250)的整数倍,即表示的时间是整秒,并且取整的结果一定大于当前的节拍数,相当于向上取整。对于不同的CPU取整的结果是不一样的,对于CPU 0,结果是250的整数倍,对于CPU 1,结果加3是250的整数倍。
round_jiffies_up_relative文件包含
round_jiffies_up_relative函数定义
在内核源码中的位置:linux-3.19.3/kernel/time/timer.c
函数定义格式:
round_jiffies_up_relative输入参数说明
- 函数round_jiffies_up_relative( )的参数表示的是当前节拍的一个相对值,需要取整的节拍数是(j+jiffies)。
round_jiffies_up_relative返回参数说明
- 函数的返回结果是对(j+jiffies)取整之后的结果与jiffies的差值,并且返回结果一定大于参数j,返回结果加上当前节拍数jiffies的值表示的是整秒对应的节拍数。对于CPU 0,返回结果加上当前节拍数是250的整数倍,对于CPU 1,返回结果加上当前节拍数再加3是250的整数倍。
round_jiffies_up_relative实例解析
编写测试文件:round_jiffies_up_relative.c
头文件引用:
模块加载函数定义:
模块退出函数定义:
模块加载、退出函数调用:
实例运行结果及分析:
执行命令insmod round_jiffies_up_relative.ko插入模块,然后输入命令dmesg -c查看内核输出信息,出现如图A
所示结果。
如图B
是另一种可能的运行结果。
结果分析:
图A
和图B
可以说明调用函数round_jiffies_up_relative( )的取整结果是不确定的,如果返回的结果加上当前节拍数是250的整数倍,说明此结果是对于CPU 0的(图A
),如果不是250的整数倍,但返回结果加上当前节拍数再加3是250的整数倍,说明此结果是对于CPU 1的(图B
)。
对于相同的节拍数CPU 0总比CPU 1多3个节拍,这样不会使两个CPU同时处于某一状态,达到两个CPU之间的轮换,而是在两个CPU之间进行轮换。至于为什么相差3个时钟节拍,请读者查阅相关资料进行分析。
函数比较:
函数__round_jiffies_up_relative( )比函数round_jiffies_up_relative( )多一个参数,因此它能够确定操作是对于哪一个CPU的,使用更灵活,而函数round_jiffies_up_relative( )只能对于当前正在活动的CPU,不够灵活。
函数__round_jiffies_up_relative( )和函数round_jiffies_up_relative( )比函数__round_jiffies_relative( )和函数round_jiffies_relative( )更好,因为前两个函数能够保证对于节拍取整肯定是成功的,而后两个函数不能保证,因为它们的取整结果可能是输入的参数值,此时返回的结果是没有意义的。
函数__round_jiffies_up( )、round_jiffies_up( )和函数__round_jiffies_up_relative( )、round_jiffies_up_relative( )相比,输入的参数和返回结果的意义都是不同的,前两者的输入参数和返回结果都是绝对值,而后两者的输入参数和返回结果都是相对值。