前言
本书的目标是,通过实际动手操作,一边验证结果,一边讲解构成计算机系统的操作系统(以下简称 OS)和硬件设备的运行原理。本书介绍的 OS 是 Linux,目标读者是应用程序开发人员、系统设计师、运维管理人员和技术支持人员等。只要知道 Linux 的基本命令,就能阅读本书。
由于现代计算机系统的层次化和功能细分化,用户一般不会直接意识到 OS 和硬件设备。层次化通常用如图 0-1 所示的漂亮模型来解释。负责任意一层的人,只需了解比他负责的那一层更深的一层就可以了。比如,运维管理人员只需了解应用程序的外部构成就行,应用程序开发人员只需知道如何运用库就行。
图 0-1 计算机系统的层次(漂亮的模型)
但是,现实中的系统其实是像图 0-2 那样的。不管哪一层,都与其他层有着复杂的关联。如果只了解其中一部分,就会遇到很多自己解决不了的问题。而且现实情况是,人们通常不得不在实际工作中花费大量时间去学习覆盖这么多层的知识。
图 0-2 计算机系统的层次(现实情况)
笔者编写本书的目的就是解决这一问题。
通过阅读本书,读者可以在以下方面得到提升1。
1虽说如此,但本书的目标读者并非想成为 OS 或硬件方面的专家的人。本书的内容只是笔者根据自己的判断精选的、至少需要了解的 OS 和硬件设备的相关知识。
- 根据硬件的特性更好地开发软件
- 明白应该依照什么指标来设计系统
- 冷静地处理 OS 或硬件设备相关的问题
◆ ◆ ◆
需要说明的是,由于网络相关的信息庞杂,如果将其写入本书,本书的主旨将变得模糊不清,所以本书不介绍网络相关的内容。
本书提供了大量实验程序,读者可以通过亲自动手运行程序,来确认系统的行为。建议大家一定要亲自动手运行,这是因为与“只看书”相比,“边看边尝试”的学习效果要好得多。实验程序可以从本书的支持页面2)下载。此外,关于函数的含义,书中也会稍作解释。由于源代码的开源许可证是 GPL v2,所以大家可以随意使用或更改。对于不想运行程序的读者,本书也展示了笔者的计算机上的运行结果,只要理解了相应的内容,就完全没问题。
2请至“随书下载”处下载本书实验程序。——编者注
本书中的实验程序是使用 C 语言和 Python 编写的,另外也有少量 Bash 脚本。这里顺便补充一下使用 C 语言的理由。与现今流行的 Go 或 Python 等编程语言相比,C 语言只有比较原始的功能,因此其生产力较低。但是,拥有比较原始的功能就意味着,可以通过它看到 OS 和硬件设备原本的样子,这一点与本书目标一致,因此本书选择使用 C 语言来编写实验程序。
在本书中,实验程序的运行环境是 Ubuntu 16.04/x86_64。不过,由于实验程序并不依赖 Linux 发行版,所以即使 Ubuntu 的版本不同,或者发行版不同,程序也应该可以正常运行。此外,请尽量使用搭建在实体机而非虚拟机上的系统,因为在虚拟机中,部分实验程序的运行结果会和本书不一样。
在运行实验程序或收集其他统计信息时,需要以下软件包。
binutils
build-essential
sysstat
这些软件包可以通过以下命令来安装。
$ sudo apt install binutils build-essential sysstat
本书中的数据是在如下配置的计算机上得到的。
- CPU:Ryzen 1800X(超线程关闭)
- RAM:Kingston KVR24N17S8/8×4(32 GB)
- SSD:Crucial CT275X200(256 GB)
- HDD:SEAGATE ST3000DM001(3 TB)
- Ubuntu 16.04/x86_64
- Linux 内核:4.10.0-40-generic