多核CPU调度是咋搞的?

embedded/2024/12/21 8:29:52/

其实很多情况下都有 这样的疑问

为什么多核CPU用着用着会“躺平”?
为什么手机有 8 核,跑分时性能却不是核心数的翻倍?

答案的钥匙,就藏在多核CPU的调度机制里。

为了更直观地理解,以一个《王者荣耀》游戏服务器为例:

  • 每个战局就是一个进程(分配独立的内存空间)。
  • 战局里的每个英雄就是一个线程(共享战局内的资源)。

进程调度:擂台系统

单核CPU

    • 像打擂台,一个时间片内只能跑一个战局,其他战局只能在旁边“候场”。
    • 时间片轮转,每个进程轮流占用 CPU 执行。

多核CPU

    • 就像增加了多个擂台,不同的战局可以同时开打。
    • 但注意:某一时刻,一个核心只能运行一个进程
    • 32核的机器看似资源丰富,但如果战局安排不好(比如线程争抢资源),性能可能会被白白浪费。

线程调度:英雄的分工

线程是更细粒度的调度单位,一个进程中的线程可以分配到多个核心并行运行。
伪代码演示:

Process game_match {Thread hero1; // 可能在 CPU 核心1 运行Thread hero2; // 可能在 CPU 核心2 运行Thread hero3; // 可能在 CPU 核心3 运行
}

这意味着同一个战局里的英雄可以在不同核心同时开打。但调度不当时,可能会导致英雄之间“抢蓝buff”或者“技能冷却冲突”。


现实中效率低下的原因:8核不如4核?

为什么多核CPU用起来,效率反而降低了?有几个典型场景:

线程同步开销(英雄CD等待)

多个线程需要同步共享资源,比如锁、全局变量,这些操作可能导致线程“堵塞”,无法发挥多核并行的效果。

资源竞争(抢蓝buff)

如果多个线程争抢同一个资源(比如I/O设备、内存缓存),会引发资源争用,导致性能下降。

缓存失效(切换英雄路线)

如果线程频繁迁移核心,会导致 CPU 缓存(L1/L2/L3)失效,需要重新加载数据到缓存,性能反而会大幅下降。


调度的未来

很多现在的调度系统也正试图解决上面提到的问题:

Windows 的 Thread Director 技术

    • 在混合架构(如 Intel 的 E 核+P 核)上,动态分配线程到高性能核心或高能效核心,实现性能与功耗的平衡。

Android 的 Energy Aware Scheduling(EAS)

    • 根据任务的重要性、功耗需求,智能分配线程到合适的核心上,提高电池续航。

苹果 M 芯片的异构调度

    • 将轻量任务分配到能效核心,重任务分配到性能核心,同时通过硬件加速器减轻CPU负担。

这些技术正在让多核系统的调度更高效、更智能,最大化性能的同时,降低功耗。


调度之道,如同太极

“看似繁杂的切换,暗含天地至理;貌似混乱的调度,实则蕴藏大智。”

多核调度并不是一场“蛮力竞赛”,它的艺术在于找到性能、功耗、复杂性之间的最佳平衡点。

制作不易,如有帮助,记得点赞关注哦~ 我是旷野,探索无尽技术!


http://www.ppmy.cn/embedded/147482.html

相关文章

线性代数基础与应用:基底 (Basis) 与现金流及单期贷款模型(中英双语)

具体请参考:https://web.stanford.edu/~boyd/vmls/ 下面的例子来源于这本书。 线性代数基础与应用:基底 (Basis) 与现金流及单期贷款模型 在线性代数中,基底(Basis)是一个重要的概念,广泛应用于信号处理、…

OpenGL ES 03 加载3张图片并做混合处理

OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号,目的是为了告诉纹理采样器,从哪个纹理单元采集数据2.如果你没有显式地设置采…

Ubuntu22.04安装CH340/CH341驱动

陈拓 2024/12/20-2024/12/20 1. 我的系统 硬件系统架构 arch 操作系统版本 lsb_release -a 2. CH340G,USB-串口转换器 3. Ubuntu22.04安装CH340驱动 3.1 用lsusb查看USB 插上CH340之前 插上CH340之后 输出中包含ID 1a86:7523 QinHeng Electronics CH340 serial…

网络安全工具及其使用方法:保护数字安全的第一道防线

目录 一、防火墙(Firewall) 功能 使用方法 二、密码管理器 功能 使用方法 三、漏洞扫描器 功能 使用方法 四、杀毒软件 功能 使用方法 五、网络流量分析工具 功能 使用方法 六、数据加密工具 功能 使用方法 结语 Welcome to Code Bloc…

​Python 标识符是啥?​

Python 的标识符就是我们写代码时用来给变量、函数、类等取名字的东西。 你写的 my_variable 是个标识符, 定义的 add_numbers 函数名也是个标识符, 甚至你写的 Cat 类名,也是标识符。 一句话总结:标识符就是代码里给“东西”起…

内容与资讯API优质清单

作为开发者,拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源,为你的开发工作提供了强大的支持!无论你是在构建网站、开发应用还是进行数据分析,这个合集都能满足你的需求。你可以通过这些免费API获…

meta-llama/Llama-3.2-1B 微调记录

踩坑: 1.刚开始部署在自己的windows电脑上,semgrep不支持windows ,然后就换了linux服务器 2.服务器没有梯子,huggingface无法访问,模型数据集无法下载 解决方法: 使用huggingface镜像网站下载模型&#xf…

vue 上传组件 vxe-upload 实现拖拽调整顺序

vue 上传组件 vxe-upload 实现拖拽调整顺序&#xff0c;通过设置 drag-sort 参数就可以启用拖拽排序功能 官网&#xff1a;https://vxeui.com/ 图片拖拽排序 <template><div><vxe-upload v-model"imgList" mode"image" multiple drag-sor…