7.1 多核与 SMP 支持


文档摘要

7.1 多核与 SMP 支持 本节摘要:多核是算力的红利,也是确定性的新考点。本节对比对称多处理与非对称分核两条架构路线,量化 SMP 引入的共享队列竞争、缓存亲和、核间同步三类新开销,并给出核间通信的正确姿势与任务分布的工程原则。 「SMP」——对称多处理,是多核操作系统资料里的第一个行话:多个地位平等的核共享一份内存与一个操作系统实例,任务可以被放到任何核上。它听起来像单核的自然推广,实际上第三章的全部分析大厦都建立在「同一时刻只有一个执行流」的前提上,这个前提一旦撤走,竞争、缓存、同步三只新怪兽同时进场。本节的立场是先看清怪兽,再决定要不要请它们进项目——因为另一条路线(分核)在很多实时场景里反而更优。

7.1 多核与 SMP 支持

本节摘要:多核是算力的红利,也是确定性的新考点。本节对比对称多处理与非对称分核两条架构路线,量化 SMP 引入的共享队列竞争、缓存亲和、核间同步三类新开销,并给出核间通信的正确姿势与任务分布的工程原则。

「SMP」——对称多处理,是多核操作系统资料里的第一个行话:多个地位平等的核共享一份内存与一个操作系统实例,任务可以被放到任何核上。它听起来像单核的自然推广,实际上第三章的全部分析大厦都建立在「同一时刻只有一个执行流」的前提上,这个前提一旦撤走,竞争、缓存、同步三只新怪兽同时进场。本节的立场是先看清怪兽,再决定要不要请它们进项目——因为另一条路线(分核)在很多实时场景里反而更优。

两条路线:一个内核还是两个

对称多处理(SMP):一份内核同时管理所有核,就绪表全局共享,调度器在每个核上各自运行、共同仲裁。开发者视角最省心——任务照建,内核自动铺到各核。代价在下文展开,核心问题只有一个:全局数据结构(就绪表、时钟列表)成了多核争抢点,每次访问都要跨核加锁。

非对称分核(AMP):每个核跑独立的内核实例(甚至不同系统:一个核跑 RTOS、另一个跑 Linux),任务固定在各自核上,核间通过约定的通信通道协作。确定性极好——每个核内仍是完整的单核世界,第三章的分析原样可用;代价是要自己划任务、自己搭核间通道,负载均衡靠人工。

选型的判据是任务的「异质性」:各核上的任务集互相独立、速率与关键性差异大(控制核加通信核),分核更优;任务同质且负载波动大(并行处理一批图像块),SMP 的自动均衡才开始值回票价。工业控制与汽车领域的主流选择是分核或「锁定式 SMP」——名义上 SMP,实际把任务用亲和性设置钉死在指定核上,兼得两边的便利与确定性。

图:双核系统的两条组织路线

图:双核系统的两条组织路线

SMP 的三类新开销

共享就绪表的锁竞争:两个核同时派发任务时要串行化,高负载下锁等待成为延迟的一部分,且随核数恶化。缓存亲和被迁移破坏:任务在核零上跑热了缓存,被调度器搬到核一后全部失效,第一轮执行明显变慢——对 WCET 是直接的额外项。核间中断:跨核唤醒任务需要发一个核间中断,这个动作本身有微秒级开销,频繁跨核唤醒的系统的真实利用率远低于表面利用率。三笔开销没有一笔出现在单核世界里,这正是「多核跑单核分析」注定出错的原因。

核间通信的正确姿势

分核路线下,核间同步有三件工具。硬件自旋锁:芯片提供的锁寄存器,适合保护极短的共享数据访问,持锁以百纳秒计。核间邮箱或队列:多数多核 MCU 提供专门的核间通信外设(双向 FIFO 或信号寄存器),语义上就是 4.2 节队列的跨核版——数据所有权在投递瞬间转移,天然无竞态。共享内存加缓存维护:大块数据走共享内存,带缓存的核必须在写入后清理缓存行、读取前作废缓存行,否则对方读到的是陈旧数据——这是多核调试里最著名的「幽灵数据」来源:

/* 核间投递大块数据:写后清缓存,接收前作废缓存 */ memcpy(s_sharedBuf, localData, len); CACHE_CleanRange(s_sharedBuf, len); /* 把改动推到真实内存 */ Mailbox_Notify(CORE_OTHER, MSG_READY); /* 再敲门,顺序不可颠倒 */

注意敲门的顺序:先保证数据就绪(缓存清理完成),再发通知。顺序颠倒后,对方可能抢在数据落地前开始读取——又一个「实验室好好的,量产偶发」的经典来源。

任务分布的工程原则

无论选哪条路线,分布原则一致:按关键性与速率分核,同核内再按第三章的方法分析。硬实时任务集中到一个核,与低速杂务物理隔离;通信量大的任务对尽量同核或用高带宽通道连接;共享资源的任务尽量同核,把跨核同步压到最少——跨核锁的每一纳秒都比核内锁贵。完成分布后,每个核独立跑一遍利用率判据与响应时间迭代,核间通道的传输延迟计入两端任务的预算。这套流程做完,多核系统重新变回「若干个可证明的单核加几条可测的通道」,确定性失而复得。

本节要点回顾

  • SMP 与分核的分野:自动均衡对确定性的交易,实时场景倾向分核或锁定;
  • SMP 三笔新账:共享队列锁竞争、缓存亲和损失、核间中断开销;
  • 锁定式 SMP 是工程主流:关键任务钉核,杂务自由调度;
  • 核间数据所有权在投递瞬间转移的通道最安全,共享内存须维护缓存;
  • 敲门顺序铁律:先清缓存后通知,颠倒即幽灵数据;
  • 分布原则:按关键性分核、同核内独立分析、跨核通道延迟计入预算。

常见问题

问:核间通信选邮箱还是共享内存? 小消息(状态、通知)走邮箱外设,硬件保障原子性与通知;大块数据走共享内存加手动缓存维护。两者常配合使用:共享内存放数据,邮箱只送「数据就绪」的信号——与 4.2 节池加队列的组合同构。

问:SMP 下怎么把任务钉在核上? 内核的任务创建接口带亲和性参数(或事后设置属性)。钉核的依据是本节的分布原则:按关键性与缓存足迹分核,钉完重跑每个核的调度分析。

问:双核芯片的实时核一定要跑 RTOS 吗? 未必,低复杂度的实时核用裸机状态机更省更稳——判断标准回到第一章:任务模型是否需要 RTOS 的抽象。多核给了你异构搭配的自由,不必两核对称。

问:核间延迟怎么测? 一核翻转引脚、另一核收到通知后翻转第二路,示波器量两路间隔即端到端核间延迟;拆细则分别测通知传递与缓存维护耗时。这个数字要写进核间通道的设计文档。

问:调试多核系统要先备什么? 双核时间线对齐的观测能力——两个核的跟踪数据要有共同时基,否则时间线拼不起来。多数专业跟踪工具支持多核会话,写代码前先确认这条链路通,出了问题再搭就晚了。

分核设计的一页纸模板

把本节方法固化成一页纸:核的分工表(核、角色、任务清单、利用率);核间通道表(通道、方向、消息、速率、延迟预算、缓存策略);共享资源表(资源、位置、访问规则);验证判据(各核独立分析通过加通道延迟实测闭合)。评审时这四张表一次过完,多核设计的结构性问题基本无处藏身。通道表里的「延迟预算」一列,记得把缓存维护的耗时单独列出——它经常是预算里最大的一笔,藏起来就会在联调时连本带利还回来。模板的意义与第九章一脉相承:多核不可怕,可怕的是没有书面分工的核间关系。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U