- 论坛徽章:
- 0
|
在CFS的sched_fair.c中有这么一个函数
根据注释和网上的讲解,它计算的应该是delta_exec * weight / lw->weight,可能只是近似计算
但是我数学不好,怎么都看不懂这个简单的函数,不知道哪位能帮忙解释一下
我把该函数和里面用到的定义一并贴出来了,假设是32位机器
# define WMULT_CONST (~0UL)
#define WMULT_SHIFT 32
#define SRR(x, y) (((x) + (1UL << ((y) - 1))) >> (y))
/*
* delta *= weight / lw
*/
static unsigned long
calc_delta_mine(unsigned long delta_exec, unsigned long weight,
struct load_weight *lw)
{
u64 tmp;
if (!lw->inv_weight) {
if (BITS_PER_LONG > 32 && unlikely(lw->weight >= WMULT_CONST))
lw->inv_weight = 1;
else
lw->inv_weight = 1 + (WMULT_CONST-lw->weight/2)
/ (lw->weight+1);
}
tmp = (u64)delta_exec * weight;
/*
* Check whether we'd overflow the 64-bit multiplication:
*/
if (unlikely(tmp > WMULT_CONST))
tmp = SRR(SRR(tmp, WMULT_SHIFT/2) * lw->inv_weight,
WMULT_SHIFT/2);
else
tmp = SRR(tmp * lw->inv_weight, WMULT_SHIFT);
return (unsigned long)min(tmp, (u64)(unsigned long)LONG_MAX);
} |
|
|