Linux内核API round_jiffies_relative

round_jiffies_relative函数功能描述:函数round_jiffies_relative( )用于将参数j加上当前节拍数jiffies表示的节拍数取整变成HZ(250)的整数倍,即表示的时间是整秒。对于不同的CPU取整的结果是不一样的,对于CPU 0,结果是250的整数倍,对于CPU 1,结果加3是250的整数倍。如果取整的结果不大于当前的节拍数,则返回参数j,如果取整的结果大于当前的节拍数,则返回取整的结果的值。

round_jiffies_relative文件包含

#include<linux/timer.h>

round_jiffies_relative函数定义

在内核源码中的位置:linux-3.19.3/kernel/time/timer.c

函数定义格式:

unsigned long round_jiffies_relative(unsigned long j);

round_jiffies_relative输入参数说明

  • 函数round_jiffies_relative( )的参数j表示的是当前节拍的一个相对值,需要取整的节拍数是(j+jiffies)。

round_jiffies_relative返回参数说明

  • 函数的返回结果是对(j+jiffies)取整之后的结果与jiffies的差值,如果返回结果大于参数j,说明取整成功,返回结果加上当前节拍数jiffies的值表示的是整秒对应的节拍数。
  • 如果函数返回结果加上jiffies值能够整除250,说明取整成功,并且对应CPU 0;如果函数返回结果加上jiffies值不能被250整除,但加3之后能被250整除,说明取整成功,并且对应CPU 1;如果返回结果是参数j的值,并且(j+jiffies)和(j+jiffies+3)都不能整除250,说明取整失败。

round_jiffies_relative实例解析

编写测试文件:round_jiffies_relative.c

头文件引用:

#include <linux/module.h>
#include<linux/timer.h>
MODULE_LICENSE("GPL");

模块加载函数定义:

int __init round_jiffies_relative_init(void)
{
    printk("into round_jiffies_relative");
    unsigned long j=jiffies; //获取当前节拍数

    /*第一个参数0代表相对节拍数,相对于当前的节拍,第二个参数0代表CPU编号*/
    unsigned long __result1=__round_jiffies_relative(0,0);

    /*第一个参数0代表相对节拍数,相对于当前的节拍,第二个参数1代表CPU编号*/
    unsigned long __result2=__round_jiffies_relative(0,1);
    unsigned long result1=round_jiffies_relative(0);
                                  // 参数0代表相对节拍数,相对于当前的节拍
    unsigned long result2=round_jiffies_relative(0);
                                  // 参数0代表相对节拍数,相对于当前的节拍
    printk("the current jiffies is :%ld\n", j);               //显示当前节拍

    /*显示函数调用结果*/
    printk("the __result1 of the __round_jiffies_relative(0,0) is :%ld\n", __result1);
    printk("the __result2 of the __round_jiffies_relative(0,1) is :%ld\n", __result2);
    printk("the result1 of the round_jiffies_relative(0) is :%ld\n", result1);
    printk("the result2 of the round_jiffies_relative(0) is :%ld\n", result2);
    printk("out round_jiffies_relative");
    return 0;
}

模块退出函数定义:

void __exit round_jiffies_relative_exit(void)
{
    printk("Goodbye round_jiffies_relative\n");
}

模块加载、退出函数调用:

module_init(round_jiffies_relative_init);
module_exit(round_jiffies_relative_exit);

实例运行结果及分析:

执行命令insmod round_jiffies_relative.ko插入模块,然后输入命令dmesg -c查看系统输出信息,出现如图A所示结果。

Linux内核API round_jiffies_relative

B和图C是另外两种可能的运行结果。

Linux内核API round_jiffies_relative

Linux内核API round_jiffies_relative

结果分析:

C是取整不成功的情况,四次函数调用结果都相同,和输入的参数j相同,并且与当前节拍相加也不能被250整除;图A和图B可以说明对于CPU 0如果取整成功,返回结果与当前节拍数相加肯定是250的整数倍,对于CPU 1如果取整成功返回结果与当前节拍数相加再加上3肯定是250的整数倍,而对于函数round_jiffies_relative( )的调用结果是不确定的,取整成功情况下,如果返回的结果加上当前节拍数是250的整数倍,说明此结果是对于CPU 0的,如果不是250的整数倍,说明此结果是对于CPU 1的。

取整成功的情况下,对于相同的节拍数CPU 0总比CPU 1多3个节拍,这样不会使两个CPU同时处于某一状态,在两个CPU之间的轮换。至于为什么相差3个时钟节拍,请读者查阅相关资料进行分析。

函数比较:

函数__round_jiffies_relative( )比函数round_jiffies_relative( )多一个参数,因此它能够确定操作是对于哪一个CPU的,使用更灵活,而函数round_jiffies_relative( )只能对于当前正在活动的CPU,不够灵活。

函数__round_jiffies_relative( )、round_jiffies_relative( )和函数__round_jiffies( )、round_jiffies( )输入的参数和返回的结果都代表不同的意义,前两者的输入参数和返回结果都是相对值,相对于当前节拍数,后两者的输入参数和返回结果都是绝对值。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API round_jiffies_relative
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址