死锁、活锁和饥饿怎样区分并定位?
死锁是参与者永久互等资源;活锁是状态不断变化却没有有效进展;饥饿是某任务长期得不到 CPU 或资源。定位需观察等待关系、锁持有者、任务运行时间和状态随时间的变化。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
死锁是参与者永久互等资源;活锁是状态不断变化却没有有效进展;饥饿是某任务长期得不到 CPU 或资源。定位需观察等待关系、锁持有者、任务运行时间和状态随时间的变化。
事件计数表示尚未处理的发生次数,生产者 give、消费者 take;资源计数表示可用相同资源数量,获取后必须在资源归还时 give。两者都不表达对象内容,若要携带数据应使用队列。
Buildroot 以生成单一完整镜像为中心,配置和上手相对直接,适合固定产品;Yocto/BitBake 以层、Recipe、包和可复用发行版为中心,适合多产品、复杂定制与长期供应链,但学习和构建成本更高。
Oops 表示内核检测到严重异常并打印上下文,可能杀死当前任务后继续但系统已不可信;Panic 会停止或按策略重启整个系统。先固定内核构建,查看异常类型、PC/LR、调用栈、寄存器、进程、中断上下文和 taint。
命令号应用 _IO/_IOR/_IOW/_IOWR 宏表达方向、类型和结构大小,用户结构采用固定宽度类型、明确填充和版本/长度,驱动用 copy_from_user/to_user 并校验保留字段。发布后的 UAPI 不应随意改变布局。
驱动应通过标准框架按描述符获取 regulator、clk、reset 和 pinctrl,而不是直接写 SoC 固定寄存器;按器件数据手册的顺序 enable/deassert/select,并在失败或 remove/suspend 时逆序回滚。
Runtime PM 在系统运行时按设备空闲状态独立关电/关钟,系统 Suspend 则协调全机进入睡眠。驱动需维护 usage count、autosuspend 和依赖关系,并在回调中保存/恢复必要上下文,阻止 I/O 与断电竞争。
TCP Keepalive 在连接长时间空闲后探测对端网络栈是否可达,默认周期往往很长;应用心跳可按业务 SLA 验证服务线程、会话和端到端响应,还能携带序列与状态。两者可组合但不能替代请求超时。