计算机系统漫游

全书第一章以一种高层次的角度展示了计算机系统的复杂与精巧。简单介绍了计算机的组成、信息的本质、程序的执行过程、计算机软件与硬件如何联系、处理器的工作内容等一些主要涉及计算机内部系统的内容。


计算机中的信息

在计算机中,所有的信息都按照二进制(0 和 1)来存储, 称为位(bit), 所有的数字、字符、操作,都按照一定的位序列来排列,计算机能够根据位序列的不同识别不同的符号。
所以,所有保存在计算机中的信息对于计算机来说都仅仅是一连串位序列而已,是上下文的顺序赋予了其独特的、人类赋予其的含义。

程序编译的过程

  • hello.c 是我们编写的代码,称为源程序或源代码
  • 预处理阶段 预处理器(cpp)根据 hello.c 源代码,向原本的代码中加入头文件引入的地方,将文件存储为 hello.i
  • 编译阶段 编译器(ccl) 将 hello.i 翻译为 hello.s,包含一个汇编程序
  • 汇编阶段 汇编器(as) 将 hello.s 翻译为机器语言指令, 存储为 hello.o
  • 链接阶段 在程序中使用的 C 标准库中的函数可以被连接器(ld) 合并至 hello.o 文件中,最终得到可执行文件 hello

程序执行的过程

在编译完成后,我们会得到一个可执行文件 hello

  1. 在执行这个文件时,我们会将文件名通过键盘读入计算机中,此时shell 程序将我们输入的字符逐个读取至寄存器,最后统一存放至主存中
  2. 当输入结束时,shell 程序开始加载可执行的 hello 文件。通过一系列指令将hello 目标文件中的代码和数据从磁盘中复制到主存之中
  3. 当所有数据都加载至主存中之后,处理器开始执行 hello 文件中 main 程序中的机器语言指令。这些指令将程序输出结果从主存复制到寄存器文件中,最后从寄存器文件中复制到屏幕上,完成整个程序的执行过程。

高速缓存

通过程序的执行过程,我们可以看到计算机系统花费大量的时间去计算程序,最终将程序结果输出,这其中涉及到大量的信息搬运(即复制)过程。因此,提高程序运行效率的一个重要方式就是要使得这些搬运过程尽可能地快速、高效。
因此,使用高速缓存存储器(cache memory) 来存放近期可能会处理的数据可以避免程序从磁盘等地低效的读取数据,从而极大程度上提高程序的性能。

操作系统

操作系统是一种软件,作用于应用程序与硬件之间。
操作系统有两个主要作用:

  1. 防止硬件被失控的应用程序滥用
  2. 向应用程序提供简单且一致的机制来控制复杂并且通常大不相同的硬件设备

上述的两种功能是操作系统通过三个基本的抽象概念来实现的:进程虚拟内存文件

  • 进程
    进程操作系统对一个正在运行的应用程序的抽象。
    一个系统上可以同时运行多个进程,每个进程看似独占的使用CPU
    当一个进程和另一个进程的指令在 CPU 中交错执行时,称这种现象为 并发运行
    在绝大多数情况下,一个系统需要运行的进程数目时绝对大于其CPU个数的,而不论在多核系统还是单核系统中,一个CPU都可以看上去同时执行多个程序,这种现象是通过处理器在进程间进行上下文切换来实现的
    进程的切换是由操作系统 内核(kernel) 管理的,内核是操作系统常驻主存的部分
  • 线程
    线程是进程的组成单元,是进程的执行单元
    线程运行于进程的上下文之中,所有的线程共享同样的代码与全局数据