Linux内核win_minmax代码解读

该博客主要解析Linux内核中win_minmax的实现原理。内容包括win_minmax的基本结构体定义、重置过程、如何更新最大值以及刷新时间的逻辑。文章通过流程图辅助说明,并探讨了为何只在更新最大值时比较一次3rd best与样本值的原因,以及在2nd和3rd best未设置时的时间等待策略。总结指出,win_minmax能够保持指定窗口时间内最优值,并在1st best超时后由后续best值替代。
摘要由CSDN通过智能技术生成

目标

  • 维护一段win时间内的三个best最大值或者最小值,以最大值为例
  • 值大小上,1st best > 2nd best > 3rd best
  • 采集时间,1st best < 2nd best < 3rd best
    注:win时间,表示一个窗口时间,或者说一段时间

代码分析

以最大值为例进行分析

基本结构体

一个样本,包含一个时间值和一个大小,其中时间值没有单位,由调用者决定,只要保证和win时间的单位一致即可,所以可以是秒,可以是10s

/* A single data point for our parameterized min-max tracker */
struct minmax_sample {
	u32	t;	/* time measurement was taken */
	u32	v;	/* value measured */
};

状态跟踪结构体,三个样本

/* State for the parameterized min-max tracker */
struct minmax {
	struct minmax_sample s[3];
};

重置

static inline u32 minmax_reset(struct minmax *m, u32 t, u32 meas)
{
	struct minmax_sample val = { .t = t, .v = meas };

	m->s[2] = m->s[1] = m->s[0] = val;
	return m->s[0].v;
}

将三个best值全部设置为传入的时间值和样本值。

更新最大值

/* Check if new measurement updates the 1st, 2nd or 3rd choice max. */
u32 minmax_running_max(struct minmax *m, u32 win, u32 t, u32 meas)
{
	struct minmax_sample val = { .t = t, .v = meas };

	if (unlikely(val.v >= m->s[0].v) ||	  /* found new max? */
	    unlikely(val.t - m->s[2].t > win))	  /* nothing left in window? */
		return minmax_reset(m, t, meas);  /* forget earlier samples */

	if (unlikely(val.v >= m->s[1].v))
		m->s[2] = m->s[1] = val;
	else if (unlikely(val.v >= m->s[2].v))
		m->s[2] = val;

	return minmax_subwin_update(m, win, &val);
}

用流程图表示:

Created with Raphaël 2.2.0 开始 样本值大于等于1st best? 重置状态跟踪
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值