凌晨两点。屏幕上的光标还在那儿瞎闪,跟心电图似的。我盯着终端里一行行往外蹦的编译日志,突然觉得自个儿跟这台死磕代码的破机器挺像。脑子里的提示音跟催命似的,重要的事搁在一边,急事倒抢着冒头。后来闲着没事,随手翻吴国伟那本《嵌入式操作系统原理及应用开发》。手指头滑到“任务管理与调度”那章,停住了。好家伙。咱们平时这种手忙脚乱的劲儿,人家早就琢磨透了,全塞在操作系统的底层逻辑里。这事儿大概就是这么个意思。技术书有时候,真比心理医生还懂人。
书里写得挺实在。实时操作系统最要紧的,就是得清清楚楚知道该先让哪个活儿跑。高优先级中断一砸过来,低优先级的任务只能老实靠边站。读到这儿我忍不住乐了。咱们总以为自己拿捏着人生节奏,一步步推自己的“低优先级任务”。可日子哪是批处理啊。全他妈是硬实时中断。半夜突然弹出来的工作邮件,家里长辈一通电话,临时拉去的扯皮会。眨眼就能把你刚攒的一点节奏打碎。内核的调度算法写得再漂亮,落到人身上,这种被来回撕扯的滋味真不好受。咱们拼命想保住自己的运行周期,结果连一次完整的上下文切换都成了奢望。不过话说回来。把人比作操作系统,可能也就图一乐。人毕竟不是CPU。不能真把情绪挂起、把精力抢占。硬套这套逻辑,反倒容易把自己逼进死胡同。
往后翻到同步互斥那块。讲信号量和互斥锁怎么搭,怎么防死锁。平时看这类技术文档,我基本是跳着扫的。但这回,我居然放慢了翻页的手。死锁到底啥样?两个任务互相攥着对方的资源不撒手,谁也不让步,系统直接卡壳。太熟了。人和人较劲的时候不也这样?明明都在等对方先递个台阶。可两边都死守着各自的临界区,生怕一松口就亏了。作者没写什么人情世故。可那些冷冰冰的锁机制,偏偏把咱们在关系里的笨拙照得清清楚楚。有时候真得学会不攥着控制权不放。主动让出点资源,系统才能重新转起来。道理是用C语言敲的,我却在心里默默给自己打了个补丁。当然,现实里哪有什么标准的互斥锁。人情世故往往比死锁难解多了。有时候让一步不是释放资源,是干脆把线程都停了。
书里还专门辟出一章聊高可靠系统。提到在安全关键领域,漏掉一个小细节都可能栽大跟头。这让我想起自己碰重要事情时的怂样。咱们对身体,对好不容易处熟的关系,对憋在心里很久没敢动的那个念头。其实都是同一个态度。明知道不能崩,所以每一步都蹑手蹑脚。技术书里叫容错机制和冗余设计。落到日子里,说白了就是学会在没底的事儿面前多熬点耐心。不过我觉得吧。这套“冗余”在生活里未必总管用。有时候你备了太多退路,反倒把自己捆住了。技术求稳。日子有时候还得点冒险的劲头。全按高可靠系统的标准过,未免太累人了。
这书最对味的地方,是它不整那些虚头巴脑的。配套的实验系统非得让你自己动手搭平台、烧录、跑测试。作者反复念叨,光啃手册没用,得上手。说真的。刚拿到实验指导书那会儿,我直犯嘀咕。现在谁还乐意从零配环境?可静下心来琢磨。这不正是咱们学东西时的通病吗。总想一键出结果。偏偏不肯忍受环境配置的满屏红字、依赖冲突的抓狂。手册写得极细。一步踩坑,后面全乱套。但偏偏是这种躲不开报错的折腾,把那些干巴巴的概念硬生生砸进脑子里。调试失败几十回。终于看到指示灯按预期亮起来的那一下,心里那点踏实,是任何速成攻略都给不了的。我后来甚至有点享受那种满屏红字了。至少知道bug在哪儿。不像生活里的烂摊子,连个报错日志都不给你留。
书合上的时候,窗外天都泛白了。嵌入式系统图的是极致的可靠和响应。可生活压根不让你把代码写死。全是没捕获的异常和说没就没的延迟。也许咱们折腾一辈子。也就是学着怎么把精力分得更匀当。怎么在乱成一锅粥的时候守住自己的临界区。至于那些根本来不及响应的中断。让它们慢慢排队去吧。反正CPU不会累。人倒是得记得给自己留个看日出的空档。