操作系统–前言02--程序是如何执行
操作系统–前言02
程序是如何执行的?
我们先来看一道常规的面试题:相比 32 位,64 位的优势是什么?
- 如果是软件,那么我们的数据库有 32 位和 64 位版本;
- 如果是操作系统,那么在阿里云上选择 Centos 和 Debian 版本的时候,也会有 32/64 版本;
- 如果是 CPU,那么有 32 位 CPU,也有 64 位 CPU。
图灵机的构造
计算机科学方面有两个巨大的贡献:
- 清楚的定义了计算机能力的边界,也就是可计算理论
- 定义了计算机由哪些部分组成,程序又是如何让执行的
图灵机的内部构造
- 图灵机拥有一条无限长的纸带,纸带上是一个格子挨着一个格子,格子中可以写字符,你可以把纸带看成内存,而这些字符可以看作是内存中的数据或者程序.
- 图灵机有一个读写头,读写头可以读取任意格子上的字符,也可以改写任意格子的字符.
- 读写头上面的盒子里面是一些精密的零件,包括图灵机的储存,控制单元和运算单元.
图灵机如何执行程序
下面我们来举一个例子,让大家弄清楚图灵机是如何工作的,比如我们要计算 11 + 15 的值,具体的运算步骤如下:
-
首先,我们将“11、15、+” 分别写入纸带上的 3 个格子(现在纸带上的字符串是11、15、 +),然后将读写头先停在 11 对应的格子上。
-
接下来,图灵机通过读写头读入 11 到它的存储设备中(这个存储设备也叫作图灵机的状态)。图灵机没有说读写头为什么可以识别纸带上的字符,而是假定读写头可以做到这点。
-
然后读写头向右移动一个格,用同样的方法将 15 读入图灵机的状态中。现在图灵机的状态中有两个连续的数字,11 和 15。
运算流程是:
- 读写到一个加号
- 然后将+号传输控制单元
- 由于控制单元发现其为一个+号,所以没有存入状态,因为原来就一定预定了+号为一个指令,目的就是加和当前的状态,因此,控制单元识别出控制符,病通知单元工作.
- 运算单元从状态中读入 11、15 并进行计算,将结果 26 存储到状态
- 运算单元将结果回传给控制单元;
- 控制单元将结果传输给读写头.
- 读写头向右移动,将结果 26 写入纸带。
图灵机构造的这一台机器,主要功能就是读写纸带然后计算;纸带中有数据、也有控制字符(也就是指令)
冯诺依曼模型
计算机结构分成以下 5 个部分:
- 输入设备;
- 输出设备;
- 内存;
- 中央处理器;
- 总线。
这个模型也被称为冯诺依曼模型,下面我们具体来看看这 5 部分的作用。
内存
- 存储的数据单位是一个二进制位,英文是 bit( 8 位,英文是 byte)
- 随机存取器,读取任何一个地址数据的速度是一样的
CPU
- 如果 CPU 每次可以计算 4 个 byte,那么我们称作 32 位 CPU;
- 如果 CPU 每次可以计算 8 个 byte,那么我们称作 64 位 CPU。
这里的 32 和 64,称作 CPU 的位宽。
控制单元和逻辑运算单元
- 控制单元专门负责控制 CPU 工作;
- 逻辑运算单元专门负责计算。
寄存器
寄存器在 CPU 里,控制单元和逻辑运算单元非常近,因此速度很快。
-
寄存器中有一部分是可供用户编程用的,比如用来存加和指令的两个参数,是通用寄存器。
-
还有一部分寄存器有特殊的用途,叫作特殊寄存器。比如程序指针,就是一个特殊寄存器。它存储了 CPU 要执行的下一条指令所在的内存地址。注意,程序指针不是存储了下一条要执行的指令,此时指令还在内存中,程序指针只是存储了下一条指令的地址。
-
下一条要执行的指令,会从内存读入到另一个特殊的寄存器中,这个寄存器叫作指令寄存器。指令被执行完成之前,指令都存储在这里。
总线
CPU内存以及其他设备之间,也要通讯,因此我们用一种特殊的设备进行控制,就是总线.分为三种:
-
**地址总线:**专门用来指定cpu将要操作的内存地址
-
**数据总线,**用来读写内存中的数据
当cpu需要读写的内存的时候,先要通过地址总线来指定内存地址,再通过数据总线来传输数据.
-
**控制总线:**用来发送和接受信号.中断信号,还有设备复位、就绪等信号,都是通过控制总线传输。同样的,CPU 需要对这些信号进行响应,这也需要控制总线。
输入、输出设备
- 输入设备向计算机输入数据,计算机经过计算,将结果通过输出设备向外界传达。
- 输入设备、输出设备想要和 CPU 进行交互,比如说用户按键需要 CPU 响应,这时候就需要用到控制总线
线路位宽问题
通过操作电压,低电压是 0,高电压是 1。
一条线路:只能传递 1 个信号,必须在 0,1 中选一个.只能操作两个内存地址
10 条地址总线;一次就可以表示 210 种情况,也就是可以操作 1024 个内存地址
32 条线 :2^32 是 4G。 可以操作4G 的内存地址.
64 位和 32 位的计算
32 位宽的 CPU 控制 40 位宽
-
地址总线、数据总线工作会非常麻烦,需要双方制定协议。 因此通常 32 位宽 CPU 最多操作 32 位宽的地址总线和数据总线。
-
把两个 64 位数字拆成 2 个 32 位数字来计算,这样就需要一个算法,
64 位的 CPU 就可以一次读入 64 位的数字
- 64 位的 CPU 内部的逻辑计算单元,也支持 64 位的数字进行计算
注:不要仅仅因为位宽的区别,就认为 64 位 CPU 性能比 32 位高很多。
注意:32 位宽的 CPU 没办法控制超过 32 位的地址总线、数据总线工作。比如说你有一条 40 位的地址总线(其实就是 40 条线),32 位的 CPU 没有办法一次给 40 个信号,因为它最多只有 32 位的寄存器。因此 32 位宽的 CPU 最多操作 232 个内存地址,也就是 4G 内存地址。