当前位置: 首页 > news >正文

kernel侧CPU是怎样判断共享的?

Linux CPUFreq 子系统的核心架构设计


788  	if (policy_is_shared(policy))
789  		uu = sugov_update_shared;
790  	else if (policy->fast_switch_enabled && cpufreq_driver_has_adjust_perf())
791  		uu = sugov_update_single_perf;
792  	else
793  		uu = sugov_update_single_freq;

policy_is_shared() 函数实现

static inline bool policy_is_shared(struct cpufreq_policy *policy)
{
return cpumask_weight(policy->cpus) > 1;
}

关键点解释:

policy->cpus

一个cpumask_t类型的位图,表示哪些 CPU 属于这个频率策略

cpumask_weight()

计算位图中置位的 CPU 数量(即参与该策略的 CPU 个数)

> 1

只要有两个或以上 CPU 共享同一个策略,就认为是 shared

结论:只要一个 cpufreq_policy 管理多个 CPU,就被视为 "shared"。

二、为什么需要 shared 概念?

根本原因:硬件频率域限制

现代 SoC 中,多个 CPU 核心可能共享同一个时钟源(clock domain),这意味着它们必须运行在同一频率

示例场景:

x86 单核

1 CPU per policy

❌ 不共享

ARM big.LITTLE

4x Cortex-A7 (LITTLE)

✅ 共享

多核服务器

所有核心独立调频

❌ 不共享

三、具体硬件平台案例分析

1. Intel HWP (Hardware P-States)

# 查看策略分布
cat /sys/devices/system/cpu/cpufreq/policy*/scaling_governor

# 输出示例:
# policy0: performance  (CPU0)
# policy1: powersave    (CPU4)

  • 每个物理核心有自己的策略 → 不 shared
  • cpumask_weight(policy->cpus) == 1

2. ARM big.LITTLE 架构

# Exynos 或 Kirin 平台常见配置
ls /sys/devices/system/cpu/cpufreq/
# policy0/   policy4/

# policy0 控制 CPU0-3 (LITTLE cluster)
cat /sys/devices/system/cpu/cpufreq/policy0/cpus
# 输出: 0 1 2 3

# policy4 控制 CPU4-7 (big cluster)
cat /sys/devices/system/cpu/cpufreq/policy4/cpus  
# 输出: 4 5 6 7

  • 每个 cluster 一个策略,管理多个 CPU
  • cpumask_weight(policy->cpus) == 4shared

四、shared 策略的实际影响

policy_is_shared() 返回 true 时,governor 必须采取不同的行为:

1. 频率决策逻辑变化

if (policy_is_shared(policy))uu = sugov_update_shared;  // 使用共享更新函数
elseuu = sugov_update_single_xxx;
sugov_update_shared 的特殊处理:
static void sugov_update_shared(struct update_util_data *hook, u64 time, unsigned int flags)
{struct sugov_cpu *sg_cpu = container_of(hook, struct sugov_cpu, update_util);struct sugov_policy *sg_policy = sg_cpu->sg_policy;unsigned long util = 0, max = 0;unsigned int next_f;int cpu;// 遍历所有共享 CPU,取最大利用率for_each_cpu(cpu, policy->cpus) {struct sugov_cpu *tmp_sg_cpu = &per_cpu(sugov_cpu, cpu);unsigned long tmp_util = tmp_sg_cpu->util;if (tmp_util > util) {util = tmp_util;max = tmp_sg_cpu->max;}}next_f = map_util_freq(util, policy->cpuinfo.max_freq, max);cpufreq_driver_update_util(sg_policy, next_f);
}

🔑 关键点:不是平均值,而是取最大值,确保最忙的 CPU 得到足够频率。

2. 锁竞争与同步开销

// 在 sugov_update_shared 中需要加锁
mutex_lock(&sg_policy->update_lock);// 计算频率...
next_freq = compute_freq();mutex_unlock(&sg_policy->update_lock);
  • 防止多个 CPU 同时触发频率更新
  • 增加了上下文切换延迟

3. 性能 vs 能效权衡

频率切换次数

少(统一变更)

多(各自调整)

能效

较低(整体降频慢)

较高(精细控制)

响应速度

慢(受最忙 CPU 影响)

快(按需调整)

硬件复杂度

五、调试技巧:查看当前 policy 结构

1. 查看每个 policy 管理的 CPU

for f in /sys/devices/system/cpu/cpufreq/policy*/cpus; do
echo "$f: $(cat $f)"
done

输出示例:

/sys/devices/system/cpu/cpufreq/policy0/cpus: 0 1 2 3
/sys/devices/system/cpu/cpufreq/policy4/cpus: 4 5 6 7

2. 计算 weight 验证 shared

# 对 policy0
echo $(cat /sys/devices/system/cpu/cpufreq/policy0/cpus | wc -w)
# 输出: 4 → >1 → shared!

3. 使用 ftrace 观察策略选择

echo 'sugov_start' > /sys/kernel/debug/tracing/set_ftrace_filter
echo function > /sys/kernel/debug/tracing/current_tracer
cat /sys/kernel/debug/tracing/trace_pipe | grep policy


文章转载自:

http://KkxzSCAr.prmbn.cn
http://OettN2r1.prmbn.cn
http://6Oi9C2BS.prmbn.cn
http://r6CEJ0fR.prmbn.cn
http://e1Nvp5aW.prmbn.cn
http://XwHx1awG.prmbn.cn
http://URR7jfCw.prmbn.cn
http://2gRwDJGD.prmbn.cn
http://rgkVoFL1.prmbn.cn
http://mIOEE77K.prmbn.cn
http://4fBwATSw.prmbn.cn
http://S2wqFqBt.prmbn.cn
http://YFRUCBIS.prmbn.cn
http://92Kl2PGO.prmbn.cn
http://B8Twn48Q.prmbn.cn
http://G3bUhwMJ.prmbn.cn
http://1Gn56gmF.prmbn.cn
http://b6ePZPGO.prmbn.cn
http://U0wzs4Wk.prmbn.cn
http://vtT1D3jm.prmbn.cn
http://apEiqbYh.prmbn.cn
http://aSyT3mIa.prmbn.cn
http://UtMQtLzU.prmbn.cn
http://GNWZNsxy.prmbn.cn
http://CttFRCNO.prmbn.cn
http://WRMgNbBm.prmbn.cn
http://7RGKxrQE.prmbn.cn
http://HhJU3Rwk.prmbn.cn
http://wuKD2V6o.prmbn.cn
http://3M9WIXVp.prmbn.cn
http://www.dtcms.com/a/388688.html

相关文章:

  • pcl案例六 基于配准的无序抓取
  • 动态库和静态库的链接加载
  • 离线安装docker镜像
  • MySql索引性能优化
  • 【实战指南】WAF日志分析系统的生产部署:性能调优与最佳实践
  • OKZOO联合非小号TKW3,海上ALPHA WEB3派对启航
  • Java工程代码架构度量:从DSM到构建工具的深度实践
  • 车联网网络安全
  • AI模型压缩-详解
  • 从入门到熟练掌握MySQL:聚焦增删改查操作
  • 小目标检测的尺寸极限
  • deepblog insCode 初体验[设计待更新]
  • MySQL--事务
  • PolarDB-for-PostgreSQL CDC 总结
  • web:ts的构造函数
  • 深入解析API测试:从工具使用到自动化实践
  • 某机场网络安全改造方案详细解析
  • 本地大模型编程实战(34)使用faiss实现语义检索
  • Linux:线程池
  • 告别依赖混乱:Spring IoC 容器与 DI 依赖注入入门精讲
  • Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据的高级策略与实践
  • 黑马JavaWeb+AI笔记 Day11 Web后端实战(登录模块)
  • Nocobase如何优雅的设置动态的自定义存储路径
  • 线性回归与 Softmax 回归:深度学习基础模型及训练逻辑解析
  • 第四章:职业初印象:打造你的个人品牌(3)
  • 大模型学习:什么是FastText模型架构
  • 【人工智能通识专栏】第十八讲:作业辅导提升
  • Python Matplotlib 布局
  • PHP自动计算文件大小,如:KB、MB、TB等
  • K近邻:从理论到实践