程序员应该知道的操作系统基础知识

首先我们先思考一个问题,程序在操作系统中是怎么执行的? 程序执行的原理是什么?

图灵机的构造

想要学懂程序执行的原理,就要从图灵机说起了。它在计算机科学方面有两个巨大的贡献:

第一,它清楚地定义了计算机能力的边界,也就是可计算理论;

第二,它定义了计算机由哪些部分组成,程序又是如何执行的。

image-2020121815233200

我们先来看一看图灵机的内部构造:

图灵机拥有一条无限长的纸带,纸带上是一个格子挨着一个格子,格子中可以写字符,你可以把纸带看作内存,而这些字符可以看作是内存中的数据或者程序。

图灵机有一个读写头,读写头可以读取任意格子上的字符,也可以改写任意格子的字符。

读写头上面的盒子里是一些精密的零件,包括图灵机的存储、控制单元和运算单元。

图灵机如何执行程序

下面我们来举一个例子,让大家弄清楚图灵机是如何工作的,比如我们要计算 11 + 15 的值,具体的运算步骤如下:

  • 首先,我们将“11、15、+” 分别写入纸带上的 3 个格子(现在纸带上的字符串是11、15、 +),然后将读写头先停在 11 对应的格子上。
image-20201218154002829
  • 接下来,图灵机通过读写头读入 11 到它的存储设备中(这个存储设备也叫作图灵机的状态)。图灵机没有说读写头为什么可以识别纸带上的字符,而是假定读写头可以做到这点。
image-20201218154535850
  • 然后读写头向右移动一个格,用同样的方法将 15 读入图灵机的状态中。现在图灵机的状态中有两个连续的数字,11 和 15。

    image-20201218155139135
  • 接下来重复上面的过程,会读到一个+号。下面我详细说一下这个运算流程:

    • 读写头读到一个 + 号 ;

    • 然后将 + 号传输给控制单元 ;

    • 控制单元发现是一个 + 号,所以没有存入状态中。因为 + 号是一个我们预设的控制符(指令),它的作用是加和目前状态。因此,控制单元识别出是控制符,并通知运算单元工作;

    • 运算单元从状态中读入 11、15 并进行计算,将结果 26 存储到状态;

    • 运算单元将结果回传给控制单元;

    • 控制单元将结果传输给读写头。

image-2020121816034232
    • 读写头向右移动,将结果 26 写入纸带。
image-20201218160811336

这样,我们就通过图灵机计算出了 11+15 的值。不知道你有没有发现,图灵机构造的这一台机器,主要功能就是读写纸带然后计算;纸带中有数据、也有控制字符(也就是指令),这个设计和我们今天的计算机是一样的。

图灵通过数学证明了,一个问题如果可以拆解成图灵机的可执行步骤,那问题就是可计算的。另一方面,图灵机定义了计算机的组成以及工作原理,但是没有给出具体的实现。

冯诺依曼模型

首先我们了解一下CPU的组成部分:CUP中包括:控制器,运算器,中断系统和寄存器,寄存器中就包括我们比较熟悉的PC(程序计数器),IR(指令寄存器)等通用寄存器;其中程序计数器(PC)保存有下一次要取的指令的地址。 取到的指令被放置在处理器的指令寄存器(IR)中。需要了解更细致的参见哈尔滨工业大学刘宏伟老师的计算机组成原理 ,这里就不展开细说了。下图就是CPU的大致组成部分

image-2021218162750066

冯诺依曼模型图

具体的实现是 1945 年冯诺依曼和其他几位科学家在著名的 101 页报告中提出的。报告遵循了图灵机的设计,并提出用电子元件构造计算机,约定了用二进制进行计算和存储,并且将计算机结构分成以下 5 个部分:

  • 输入设备;

  • 输出设备;

  • 内存;

  • 中央处理器;

  • 总线。

这个模型也被称为冯诺依曼模型,下面我们具体来看看这 5 部分的作用。

内存

在冯诺依曼模型中,程序和数据被存储在一个被称作内存的线性排列存储区域。存储的数据单位是一个二进制位,英文是 bit。计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit); 每一个字节都对应一个内存地址。内存地址由 0 开始编号,比如第 1 个地址是 0,第 2 个地址是 1, 然后自增排列,最后一个地址是内存中的字节数减 1。

我们通常说的内存都是随机存取器,也就是读取任何一个地址数据的速度是一样的,写入任何一个地址数据的速度也是一样的。

CPU

冯诺依曼模型中 CPU 负责控制和计算。为了方便计算较大的数值,CPU 每次可以计算多个字节的数据。

如果 CPU 每次可以计算 4 个 byte,那么我们称作 32(4x8) 位 CPU;

如果 CPU 每次可以计算 8 个 byte,那么我们称作 64(8x8) 位 CPU。

这里的 32 和 64,称作 CPU 的位宽。

控制单元和逻辑运算单元

CPU 中有一个控制单元专门负责控制 CPU 工作;还有逻辑运算单元专门负责计算。具体的工作原理我们在指令部分给大家分析。

寄存器

CPU 要进行计算,比如最简单的加和两个数字时,因为 CPU 离内存太远,所以需要一种离自己近的存储来存储将要被计算的数字。这种存储就是寄存器。寄存器就在 CPU 里,控制单元和逻辑运算单元非常近,因此速度很快。

  • 寄存器中有一部分是可供用户编程用的,比如用来存加和指令的两个参数,是通用寄存器。例如:IR

  • 还有一部分寄存器有特殊的用途,叫作特殊寄存器。比如程序指针,就是一个特殊寄存器。它存储了 CPU 要执行的下一条指令所在的内存地址。例如: PC(程序计数器)。注意,程序指针不是存储了下一条要执行的指令,此时指令还在内存中,程序指针只是存储了下一条指令的地址

  • 下一条要执行的指令,会从内存读入到另一个特殊的寄存器中,这个寄存器叫作指令寄存器。指令被执行完成之前,指令都存储在这里

总线

CPU 和内存以及其他设备之间,也需要通信,因此我们用一种特殊的设备进行控制,就是总线。总线分成 3 种:

  • 一种是地址总线,专门用来指定 CPU 将要操作的内存地址。

  • 还有一种是数据总线,用来读写内存中的数据。

当 CPU 需要读写内存的时候,先要通过地址总线来指定内存地址,再通过数据总线来传输数据。

  • 最后一种总线叫作控制总线,用来发送和接收关键信号,比如中断信号,还有设备复位、就绪等信号,都是通过控制总线传输。同样的,CPU 需要对这些信号进行响应,这也需要控制总线。
输入、输出设备

输入设备向计算机输入数据,计算机经过计算,将结果通过输出设备向外界传达。如果输入设备、输出设备想要和 CPU 进行交互,比如说用户按键需要 CPU 响应,这时候就需要用到控制总线。

到这里,相信你已经对冯诺依曼模型的构造有了一定的了解