背景回顾:操作系统是连接软件和硬件的桥梁。因此想要理解操作系统,我们首先需要对操作系统的服务对象 (应用程序) 有更精确和深刻的理解。
本讲内容:程序的状态机模型;回答以下问题:
我们在编程时,总是想象程序 “独占整个计算机,逐条指令执行”,大部分时候都不用 “考虑” 操作系统的存在。当系统调用发生时,程序执行被完全暂停,但操作系统依然在工作——就像麻醉后醒来,周围的环境发生了变化,但我们完全没有感到时间的流逝。
如果你感到 strace 的结果不那么友善,用适当的工具处理它就非常重要了。课堂上我们展示了用命令行工具进行处理的 “传统方法”:
$ strace ls |& grep -e read -e write
对新手来说,感到困惑是非常正常的——但我们总是可以把不熟悉的东西用熟悉的东西类比 (正是 AI 擅长的)。今天你只要学会提问,就几乎总是能得到满意的答案。
Everything (高级语言代码、机器代码) 都是状态机;而编译器实现了两种状态机之间的翻译。无论何种状态机,在没有操作系统时,它们只能做纯粹的计算,甚至都不能把结果传递到程序之外——而程序与操作系统沟通的唯一桥梁是系统调用 (例如 x86-64 的 syscall 指令)。如此重要的桥梁,操作系统中自然也有工具:strace 可以查看程序运行过程中的系统调用序列。
本次课没有书本阅读材料;但你可以花一些时间了解一下相关的源码项目:
在你的 Linux 中运行课堂上的代码示例,包括:
在之后的课程中,我们默认你会运行和理解课堂上的代码示例。