基于压力的 CPU 频率调节策略

压力策略评估就绪队列的当前压力,以便指导系统 P-state 转换。

线程压力通过以下公式计算:

\[P_{sys} = \frac{\sum_{t \in R} (P_{min} - prio_t + 1)} {\sum_{t \in T} (P_{min} - prio_t + 1)} \times 100\]

其中

  • \(R\) 是可运行(已排队)线程的集合

  • \(T\) 是纳入压力计算的所有线程的集合

  • \(w_t = P_{min} - \text{prio}_t + 1\) 是线程 \(t\) 的权重

  • \(P_{min}\) 是纳入考虑的最小优先级(数值上最大)

这会生成一个介于 0 和 100 之间的归一化系统压力,然后用于选择由 SoC 或 overlay 文件定义的合适 P-state。

计算出归一化系统压力后,会将其视为系统“负载”,然后策略将遍历 SoC 可用的 P-state,并选择第一个满足归一化压力大于或等于所定义阈值的 P-state。

如果没有 P-state 匹配(即归一化压力低于所有阈值),策略将选择 soc_pstates 数组中的最后一个 P-state(性能最低的状态)。

用户可以通过调整 CONFIG_CPU_FREQ_POLICY_PRESSURE_LOWEST_PRIO 选项来调节此策略的响应速度;该选项应设置为系统中最低优先级线程的优先级(数值上最大)。压力策略将忽略优先级低于该选项的线程,并且根据上述公式,会改变高优先级线程运行所带来的感知影响。

有关压力策略的示例,请参阅 Pressure based CPU frequency scaling 示例。

该策略尝试主动评估已排队任务,并在其执行时间之前调整时钟频率,但该策略不保证性能,也不保证线程能够满足截止时间并避免饥饿。

请注意,CONFIG_CPU_FREQ_POLICY_PRESSURE_LOWEST_PRIO 包含 CONFIG_TRACING,会给上下文切换带来开销。