增加平台以前,先画变化会传播到哪里¶
一个 SDK 已支持 Linux,现在准备增加 FreeRTOS。若超时、取消和恢复都复制一遍,两端很快会出现细微差异;若把所有 OS 原语包装成相同接口,又可能隐藏通知和退出条件。边界是否合适,可以从一次具体变化的传播范围判断。
现有边界是纯 C 契约核心与独立运行时。实现见源码与版本。
以变化轴划分责任¶
| 变化 | 应主要影响 | 应保留的共同规则 |
|---|---|---|
| 新 OS/port | runtime、时间换算、创建与退出、构建 | admission、身份、终态、恢复与守恒 |
| 新设备 backend | 协议、能力、发送/完成与重建 | 接受请求后的通知义务 |
| payload 扩大 | 协议与容量、复制/内存账、边界测试 | 不出现截断或静默接受 |
| deadline 规则改变 | core 契约、边界向量、公开文档 | 两端采用同一规则 |
| 新业务功能 | 先确认它属于哪个层次 | 明确输入、状态、资源和失败终态 |
实施以后对照实际改动范围。如果新增 OS 大量修改业务 core,先查是否混入了 OS 细节;若确实出现共同业务需求,则修改 core 并同步两端验证。
一个具体取舍:复制还是借用 payload¶
本例提交前复制 256-byte 控制 payload。以假设的 2000 requests/s 计算,单次复制通过的数据约为 512000 bytes/s。这个数字描述字节量,不能直接推导 CPU 耗时;还要测 cache、内存带宽和后续复制路径。
| 比较项 | 提交时复制 | 借用调用者 buffer |
|---|---|---|
| 调用者复用时点 | submit 返回以后 | 约定的完成/归还以后 |
| 接口复杂度 | buffer 寿命较短 | 要追踪借用、取消、停止和晚到完成 |
| 内存与复制 | 固定内部存储,产生复制 | 可能减少部分副本,仍需元数据和后端存储 |
| 失败收尾 | 内部对象按终态回收 | 各种退出都要恰好归还借用 |
| 硬件约束 | 可集中处理内部 buffer | 调用者存储也要满足 DMA/cache/对齐 |
| 本例证据 | 已有提交后改写原 buffer 的测试 | 尚无同条件收益与完整收尾实现 |
当前选择复制,让调用者的 buffer 寿命与异步请求分离。若后续测量显示复制成为明显成本,再引入借用方案,并先定义释放契约、故障时序与对照测试。这个决定可由新证据改变。所有权机制
给复杂度留下可观测账本¶
| 维度 | 记录内容 | 触发复查的迹象 |
|---|---|---|
| 并发 | 共享写者、锁序、回调上下文 | 同步重入或多层同时等待 |
| 寿命 | 持有者、借用和退出顺序 | 只有正常完成能回收资源 |
| 状态 | 转移、终态和恢复负责人 | 不同层同时重试、无法解释终态 |
| 配置 | 真正支持的 OS×设备×功能组合 | “应该能跑”的组合没有回归 |
| 依赖 | 新平台的修改模块与反向调用 | 适配需要修改多个业务分支 |
| 维护 | 补丁传播、定位时间、分支数量 | 同一修复反复手工移植 |
没有通用的最佳数量。先记录基线,再按产品风险和维护能力限制支持组合;减少组合时也写清放弃了哪些能力。
重构分成可以回退的步骤¶
先保持可构建基线,把目录移动、构建调整、契约更改和行为更改分开。每一步规定回归范围和回滚条件,检查外部 consumer 能否继续只使用公开头文件。
临时平台特例记录原因、影响、责任、移除条件和验证入口。永久承诺所有旧组合会持续增加测试与修复成本,废弃计划也是架构决定的一部分。
跨平台复用用共同语义与回归约束维护。新增抽象前写清解决的实际问题、减少的变化范围,以及它引入的新寿命和配置成本。
进一步落实接口演进¶
兼容性与所有权演进以更大 payload、借用 buffer 与新后端为例,比较配置扩展、版本策略、归还责任和支持矩阵。