Linux内核API __round_jiffies_relative

__round_jiffies_relative函数功能描述:函数__round_jiff ies_relative( )用于将参数j加上当前节拍数jiff ies表示的节拍数取整变成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_jiff ies_relative(unsigned long j, int cpu)

__round_jiffies_relative输入参数说明

  • 函数__round_jiff ies_relative( )的第一个参数表示的是当前节拍的一个相对值,要取整的节拍数是(j+jiff ies)。

  • 第二个参数是对应的CUP对象,可以取0、1两个值(注:根据机器的CPU个数确定,本机两个CPU,如果4个CPU,可取0、1、2、3四个值,以此类推)。

__round_jiffies_relative返回参数说明

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

__round_jiffies_relative实例解析

编写测试文件:__round_jiff ies_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_init");
    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);
    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("out __round_jiffies_relative_init");
    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_jiff ies_relative.ko插入模块,然后输入命令dmesg -c查看系统输出信息,出现如图A所示结果。

Linux内核API __round_jiffies_relative

B是一种取整不成功的情况。

Linux内核API __round_jiffies_relative

结果分析:

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

取整成功的情况下,对于相同的节拍数CPU 0总比CPU 1多3个节拍,这样不会使两个CPU同时处于某一状态,在两个CPU之间的轮换。

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

评论 抢沙发

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