2. 星载计算机资源分类与耗尽机理

星载计算机与地面通用计算机最大的差别,不在于算力高低,而在于它运行在一个资源封闭、不可现场扩容、不可随意重启的环境中。地面服务器内存吃紧可以加内存条、可以滚动重启;星载计算机一旦发射入轨,CPU 主频、内存容量、存储空间、总线带宽、供电功率乃至每个控制周期的时间预算,全部被固化在硬件与任务书中。因此,理解"资源耗尽"必须先建立一张清晰的资源分类地图,再理解每一类资源被"慢慢吃掉"的典型模式。

一、六类关键资源的边界

星载计算机的资源可以归纳为六类,它们并非彼此独立,而是通过任务调度相互耦合:

  • CPU 时间:以任务周期和截止时间衡量。例如姿控任务周期 10 ms、制导任务周期 100 ms,若某任务单次执行从 2 ms 涨到 9 ms,即使总占用率未满,也可能挤占同优先级任务。
  • 内存:分为静态分配的代码段/数据段与动态分配的堆区。星载软件通常禁用或严格限制 malloc,但遥测缓存、图像帧缓冲仍会动态申请。
  • 存储:包括 NOR/NAND Flash 的程序区、参数区、日志区。日志区写满后若不回收,新日志将无处落盘。
  • 总线带宽:1553B、CAN、SpaceWire 等总线的时隙或帧率是固定的,多个分系统争用同一总线时,带宽就是硬约束。
  • 功耗:整星功率预算有限,CPU 满载、加热器开启、载荷工作会叠加,超过母线供给能力将触发欠压复位。
  • 时间窗口:测控弧段、数传窗口、对日定向窗口都是有限时间片,错过即需等待下一圈,属于"不可存储"的资源。

这六类资源中,CPU、内存、存储、总线属于可计量、可监控的资源;功耗与时间窗口则更接近任务级约束,往往在系统级联调时才暴露。

二、四类典型耗尽模式

资源被耗尽的过程通常不是瞬间的,而是有明确的"病理模式"。工程上最常见的有四种:

泄漏(Leak):最典型的是内存泄漏与句柄泄漏。例如某遥测打包任务每次执行都申请一块 256 字节缓冲区,正常路径释放,但异常分支(如校验失败)直接 return 而未释放。按 1 Hz 调用、每天 86400 次计算,日泄漏约 21 MB,若堆区仅 8 MB,则数小时内即耗尽。泄漏的隐蔽性在于单次量小、短期无感。

碎片(Fragmentation):即使总空闲内存足够,若被切成大量不连续小块,仍无法满足一次较大申请。例如堆区剩余 4 MB,但最大连续块仅 64 KB,此时申请 128 KB 帧缓冲必然失败。碎片常由"申请-释放-再申请不同尺寸"的混合模式造成,星载软件中图像与遥测共存时尤其明显。

死锁(Deadlock):两个或多个任务互相持有对方所需的资源并等待。典型场景是任务 A 持有总线控制权等待内存信号量,任务 B 持有内存信号量等待总线。星载软件中若在中断服务程序里调用可能阻塞的信号量操作,死锁概率会显著上升。

优先级反转(Priority Inversion):低优先级任务持有高优先级任务所需的互斥量,而中优先级任务抢占 CPU,导致高优先级任务被间接延迟。1997 年火星探路者号就因优先级反转反复复位。星载实时系统中,若互斥量未启用优先级继承协议,该问题几乎必然出现。

星载计算机资源分类与耗尽模式映射 六类关键资源 CPU 时间 周期 / 截止时间 内存 堆 / 栈 / 静态区 存储 程序 / 参数 / 日志 总线带宽 1553B / CAN / SpW 功耗 母线功率预算 时间窗口 测控 / 数传弧段 四类耗尽模式 泄漏 Leak 异常分支未释放 单次小、累积快 碎片 Fragmentation 总量够、连续块不足 混合尺寸申请 死锁 Deadlock 互相持有、循环等待 中断中阻塞调用 优先级反转 低持高需、中被抢占 缺优先级继承 系统级后果 任务超时 / 周期抖动 控制律输出延迟 申请失败 / 数据丢失 遥测帧不完整 看门狗复位 进入安全模式 欠压复位 / 掉电 载荷被迫关机 错过测控 / 数传窗口 需等待下一圈

三、从"资源"到"模式"的对应关系

把资源与模式交叉起来看,能更准确地定位问题。内存最容易被泄漏和碎片侵蚀;CPU 时间最容易被优先级反转和死锁浪费;存储的典型问题是日志区写满后无回收;总线带宽的典型问题是高优先级突发传输挤占周期消息;功耗与时间窗口则更多表现为"任务叠加超预算"而非单一软件缺陷。

以某低轨遥感卫星的数传任务为例:数传开启后,图像压缩任务占用 CPU 从 30% 升至 75%,同时通过 SpaceWire 向固态存储器写入,总线负载从 20% 升至 85%。此时若遥测任务仍按 1 Hz 抢占总线,就会出现遥测帧延迟。这里的根因不是"内存不够",而是总线带宽与 CPU 时间被数传任务同时挤压。因此排故时必须先分清是哪一类资源先到边界。

四、一个可操作的资源预算示例

下面给出一份星载计算机资源预算表的示例结构,用于在软件设计阶段就把"边界"写清楚。表中数值为教学示例,实际项目需按任务书与硬件手册填写。

资源类型总预算正常占用告警阈值耗尽判据
CPU 时间100%(单核)≤ 60%75%任一任务超截止时间
堆内存8 MB≤ 4 MB6 MB最大连续块 < 128 KB
日志存储512 MB≤ 300 MB400 MB剩余空间 < 50 MB
1553B 总线1 Mbps 时隙≤ 50%70%周期消息延迟 > 2 周期
母线功耗120 W≤ 80 W100 W母线电压 < 26 V
测控窗口每圈 8 min——窗口内未完成遥测下传
设计提示:告警阈值应低于耗尽判据,留出至少一个控制周期的处置时间。例如堆内存告警设在 6 MB,是为了在真正无法申请 128 KB 连续块之前,触发日志转储或缓存释放。

五、为什么必须区分"耗尽"与"过载"

工程中常把两者混为一谈。过载是瞬时需求超过能力,例如某控制周期内突然涌入大量中断,CPU 短时 100%,但下一周期即恢复;耗尽则是资源被持续占用且无法回收,例如内存泄漏导致可用堆单调下降。过载可以通过削峰、降频、丢弃非关键任务缓解;耗尽必须找到泄漏点或碎片源,否则任何调度优化都只是延缓崩溃。

区分方法也很直接:观察资源曲线的时间形态。过载呈尖峰状,耗尽呈单调下降或阶梯下降。星载软件应把 CPU 占用率、堆剩余量、最大连续块、日志剩余空间、总线负载、母线电压这几项作为长期遥测下传,地面通过趋势判断是"偶发过载"还是"正在耗尽"。

常见误区:仅监控"剩余内存总量"是不够的。碎片场景下总量可能仍有 4 MB,但最大连续块已降到 32 KB,此时任何大于 32 KB 的申请都会失败。必须同时下传"最大连续空闲块"这一指标。

理解资源分类与耗尽模式,是后续设计健壮性测试用例的基础。只有先明确"哪类资源、以什么模式、在多长时间尺度上被吃掉",才能有针对性地构造泄漏注入、碎片制造、死锁触发和优先级反转复现等测试场景。