操作系统--CPU初级

一、图灵机

外部:读写头、纸带

图灵机内部(读写头内部):存储单元、控制单元、运算单元

操作系统--CPU初级_第1张图片

图灵机主要功能就是读取纸带格子中的内容,然后交给控制单元识别字符是数字还是运算符指令,如果是数字则存入到图灵机状态中,如果是运算符,则通知运算符单元读取状态中的数值进行计算,计算结果最终返回给读写头,读写头把结果写入到纸带的格子中。


二、冯诺依曼模型

计算机基本结构:运算器、控制器、存储器、输入设备、输出设备

操作系统--CPU初级_第2张图片

1.内存

存储程序和数据、线性、字节

  • 每一个字节(8 bit)都对应一个内存地址
  • 内存的地址是从 0 开始编号的,然后自增排列
  • 最后一个地址为(内存总字节数 - 1)
  • 内存的读写任何一个数据的速度都是一样的

2.中央处理器CPU

CPU位宽、寄存器、控制单元、逻辑运算单元

32 位和 64 位 CPU 最主要区别在于一次能计算多少字节数据:

  • 32 位 CPU 一次可以计算 4 个字节,可以计算的最大整数是(2^8)^4
  • 64 位 CPU 一次可以计算 8 个字节,可以计算的最大整数是(2^8)^8

这里的 32 位和 64 位,通常称为 CPU 的位宽,代表的是 CPU 一次可以计算(运算)的数据量。

其中,控制单元负责控制 CPU 工作,逻辑运算单元负责计算,CPU 中的寄存器主要作用是存储计算时的数据

常见的寄存器种类:

  • 通用寄存器:存放需要进行运算的数据
  • 程序计数器:存储 CPU 要执行下一条指令「所在的内存地址」,此时指令还在内存中
  • 指令寄存器;存放当前正在执行的指令

3.总线

通信

  • 数据总线:读写内存的数据
  • 地址总线:指定 CPU 将要操作的内存地址
  • 控制总线:发送和接收信号,比如中断、设备复位等信号,CPU 收到信号后自然进行响应,这时也需要控制总线;

当 CPU 要读写内存数据的时候,一般需要通过下面这三个总线:

  • 首先要通过「地址总线」来指定内存的地址;
  • 然后通过「控制总线」控制是读或写命令;
  • 最后通过「数据总线」来传输数据;

4.输入、输出设备

输入、输出数据


三、数据是如何通过线路传输的呢?

串行传输(低效率)、线路位宽、CPU位宽

内存大小 = 可操作的内存地址数量 = 2^(地址总线数量) = 2^(线路位宽)

CPU 想要操作「内存地址」就需要「地址总线」,1 bit 只有 0、1 两种电信号。

CPU 位宽最好不要小于线路位宽,所以 32 位的 CPU 最好和 32 位宽的线路搭配,因为 32 位 CPU 一次最多只能操作 32 位宽的地址总线和数据总线。

32 位 CPU 最大只能操作 4GB 内存,就算你装了 8 GB 内存条也没用。而 64 位 CPU 寻址范围则很大,理论最大的寻址空间为 2^64

但是并不代表 64 位 CPU 性能比 32 位 CPU 高很多,很少应用需要算超过 32 位的数字,所以如果计算的数额不超过 32 位数字的情况下,32 位和 64 位 CPU 之间没什么区别的,只有当计算超过 32 位数字的情况下,64 位的优势才能体现出来


四、程序执行的基本过程

CPU的指令周期

  1. CPU读取程序计数器里指令的内存地址
  2. 控制单元操作地址总线访问上述内存地址,得到指令数据
  3. 指令数据通过数据总线传给CPU,存到指令寄存器

  1. 程序计数器自增(32位CPU一次可以计算4个字节,所以自增4)

  1. CPU分析指令寄存器中的指令:计算类型指令交给逻辑运算单元,存储类型指令交给控制单元

五、a = 1 + 2 执行具体过程

数据和指令是分开区域存放的,存放指令区域的地方称为「正文段」,程序运行时,内存用来存放数据的区域是「数据段」。

操作系统--CPU初级_第3张图片

  • 指令大小:由于是在 32 位 CPU 执行的,因此一条指令是占 32 位大小,所以你会发现每条指令间隔 4 个字节。
  • 数据大小:根据你在程序中指定的变量类型,比如 int 类型的数据则占 4 个字节,char 类型的数据则占 1 个字节。

六、指令

1.编码与解析

上面的例子中,图中指令的内容我写的是简易的汇编代码,目的是为了方便理解指令的具体内容,事实上指令的内容是一串二进制数字的机器码,每条指令都有对应的机器码,CPU 通过解析机器码来知道指令的内容。

  • 指令编码(机器码 -> 汇编代码):编译器在编译程序的时候,会构造指令
  • 指令解析(汇编代码 -> 机器码):CPU 执行程序的时候,就会解析指令

2.流水线

现代大多数 CPU 都使用来流水线的方式来执行指令,所谓的流水线就是把一个任务拆分成多个小任务,于是一条指令通常分为 4 个阶段,称为 4 级流水线,如下图:

操作系统--CPU初级_第4张图片

四个阶段的具体含义:

  1. Fetch(取得指令): CPU控制器通过程序计数器读取对应内存地址的指令 ;
  2. Decode(指令译码): CPU控制器对指令进行解码 ;
  3. Execution(执行指令): CPU控制器运算器执行指令;
  4. Store(数据回写): CPU控制器将计算结果存回寄存器或者将寄存器的值存入内存

上面这 4 个阶段,我们称为指令周期Instrution Cycle,CPU 的工作就是一个周期接着一个周期,周而复始。

事实上,不同的阶段其实是由计算机中的不同组件完成的:

操作系统--CPU初级_第5张图片

3.指令的类型

数据传输类、运算类、跳转类、信号类、闲置类

4.指令的执行速度

因此,要想程序跑的更快,优化这三者即可:

  • 指令数,表示执行程序所需要多少条指令,以及哪些指令。这个层面是基本靠编译器来优化,毕竟同样的代码,在不同的编译器,编译出来的计算机指令会有各种不同的表示方式。
  • 每条指令的平均时钟周期数 CPI,表示一条指令需要多少个时钟周期数,现代大多数 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU 时钟周期数尽可能的少;
  • 时钟周期时间,表示计算机主频,取决于计算机硬件。有的 CPU 支持超频技术,打开了超频意味着把 CPU 内部的时钟给调快了,于是 CPU 工作速度就变快了,但是也是有代价的,CPU 跑的越快,散热的压力就会越大,CPU 会很容易奔溃。

七、补充

64 位相比 32 位 CPU 的优势在哪吗?64 位 CPU 的计算性能一定比 32 位 CPU 高很多吗?

64 位相比 32 位 CPU 的优势主要体现在两个方面:

  • 64 位 CPU 可以一次计算超过 32 位的数字,而 32 位 CPU 如果要计算超过 32 位的数字,要分多步骤进行计算,效率就没那么高,但是大部分应用程序很少会计算那么大的数字,所以只有运算大数字的时候,64 位 CPU 的优势才能体现出来,否则和 32 位 CPU 的计算性能相差不大
  • 通常来说 64 位 CPU 的地址总线是 48 位,而 32 位 CPU 的地址总线是 32 位,所以 64 位 CPU 可以寻址更大的物理内存空间。如果一个 32 位 CPU 的地址总线是 32 位,那么该 CPU 最大寻址能力是 4G,即使你加了 8G 大小的物理内存,也还是只能寻址到 4G 大小的地址,而如果一个 64 位 CPU 的地址总线是 48 位,那么该 CPU 最大寻址能力是 2^48,远超于 32 位 CPU 最大寻址能力。

你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电脑上吗?64 位的操作系统可以运行在 32 位的电脑上吗?如果不行,原因是什么?

64 位和 32 位软件,实际上代表指令是 64 位还是 32 位的:

  • 如果 32 位指令在 64 位机器上执行,需要一套兼容机制,就可以做到兼容运行了。但是如果 64 位指令在 32 位机器上执行,就比较困难了,因为 32 位的寄存器存不下 64 位的指令
  • 操作系统其实也是一种程序,我们也会看到操作系统会分成 32 位操作系统、64 位操作系统,其代表意义就是操作系统中程序的指令是多少位,比如 64 位操作系统,指令也就是 64 位,因此不能装在 32 位机器上。

总之,硬件的 64 位和 32 位指的是 CPU 的位宽,软件的 64 位和 32 位指的是指令的位宽


八、参考

小林 coding

你可能感兴趣的:(操作系统学习记录,ubuntu)