首页»版块 MagicOS MagicOS 建议增加基于线程历史特征的预判式调度,充分利用CPU等 ...

建议增加基于线程历史特征的预判式调度,充分利用CPU等待空隙提升多任务效率

[复制帖子标题和链接]

1160

数码爱好者  LV7  发表于 6 小时前 江苏 来自:荣耀Magic7 Pro
痛点说明

手机系统现在的线程调度属于被动响应模式:
当一个线程运行过程中等待内存、读取缓存发生阻塞停顿以后,调度器才临时从就绪队列随机挑选另外一个线程切换上来运行。

缺点:

1. 发生阻塞之后才临时找线程,存在挑选任务的微小开销;

2. 无法区分线程是单纯CPU计算繁忙,还是经常等待内存、缓存;两类线程处理方式完全一样,CPU部分等待空闲时间没有充分利用;

3. 多任务同时运行时,CPU核心会出现短暂空转,白白浪费算力。

普通ARM手机没有硬件超线程,不能两个线程同时跑在一颗核心内部,只能靠线程切换来利用空闲时间。

构想方案(务实,复用现有硬件能力)

利用CPU自带硬件计数器,统计线程历史运行特征,提前预判,预选替补线程,而不是阻塞之后再临时找任务。

1、给每个线程记录历史行为标签
统计该线程过往运行状态,区分两类情况:

- 高等待类:经常发生缓存缺失、内存等待,跑一会就会停顿等待数据;

- 计算密集类:几乎全程疯狂做运算,很少出现等待;

只做历史统计,不需要实时扫描指令流,运行时开销可控。

注意区分:等待内存缓存(线程还占用核心) 和 等待网络、硬解码(线程直接休眠让出核心),两种场景分开标记。

2、预判预选替补线程
当标记为【高等待类】的线程分配到CPU核心上运行,调度器提前选好一个轻量就绪线程作为替补待命。
一旦监测到原线程发生内存/缓存阻塞,立刻切换预先准备好的替补线程上来执行,把CPU空闲时间利用起来。

3、增加兜底保护逻辑(非常关键,防止越优化越卡)
历史行为不代表当下,同一个线程负载会随时变化。
配对切换之后持续监控实时负载:

- 如果原本“高等待”线程突然变成满负载计算,立刻停止这套预判策略,不再做预选替补;

- 避免频繁来回切换线程,带来卡顿、额外功耗。

4、使用范围做限制,控制风险

- 优先用于同一个APP内部多线程;谨慎跨不同APP做预判切换;

- 主要在大核启用,小核不开启这套策略,避免增加续航负担。

预期收益

1. 多任务场景,充分利用CPU等待内存、缓存产生的空闲周期,提升CPU整体利用率;

2. 减少线程阻塞之后临时挑选任务带来的调度开销,改善部分场景微小卡顿;

3. 整套方案基于现有CPU硬件能力,不需要改动芯片硬件,属于内核调度策略层面优化。
@MagicOS流畅橙子 @性能_阿勇 @MagicOS流畅李同学
建议投票
18 人已参与
支持
反对
您需要登录后才可以评论 登录 | 立即注册
简体中文 - China
快速回复 返回顶部 返回列表