一、图灵机
外部:读写头、纸带
图灵机内部(读写头内部):存储单元、控制单元、运算单元
![操作系统--CPU初级_第1张图片](http://img.e-com-net.com/image/info8/c2eb55e2d03b49cd8395062a81a66879.jpg)
图灵机主要功能就是读取纸带格子中的内容,然后交给控制单元识别字符是数字还是运算符指令,如果是数字则存入到图灵机状态中,如果是运算符,则通知运算符单元读取状态中的数值进行计算,计算结果最终返回给读写头,读写头把结果写入到纸带的格子中。
二、冯诺依曼模型
计算机基本结构:运算器、控制器、存储器、输入设备、输出设备
![操作系统--CPU初级_第2张图片](http://img.e-com-net.com/image/info8/27cf93ea40ff4e5d954e22898c9a98f2.jpg)
1.内存
存储程序和数据、线性、字节
- 每一个字节(8 bit)都对应一个内存地址
- 内存的地址是从 0 开始编号的,然后自增排列
- 最后一个地址为(内存总字节数 - 1)
- 内存的读写任何一个数据的速度都是一样的
2.中央处理器CPU
CPU位宽、寄存器、控制单元、逻辑运算单元
32 位和 64 位 CPU 最主要区别在于一次能计算多少字节数据:
- 32 位 CPU 一次可以计算 4 个字节,可以计算的最大整数是
;
- 64 位 CPU 一次可以计算 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的指令周期
- CPU读取程序计数器里指令的内存地址
- 控制单元操作地址总线访问上述内存地址,得到指令数据
- 指令数据通过数据总线传给CPU,存到指令寄存器
- 程序计数器自增(32位CPU一次可以计算4个字节,所以自增4)
- CPU分析指令寄存器中的指令:计算类型指令交给逻辑运算单元,存储类型指令交给控制单元
五、a = 1 + 2 执行具体过程
数据和指令是分开区域存放的,存放指令区域的地方称为「正文段」,程序运行时,内存用来存放数据的区域是「数据段」。
![操作系统--CPU初级_第3张图片](http://img.e-com-net.com/image/info8/21f55ebd9d954c7db2502ebde3ab3bd2.jpg)
- 指令大小:由于是在 32 位 CPU 执行的,因此一条指令是占 32 位大小,所以你会发现每条指令间隔 4 个字节。
- 数据大小:根据你在程序中指定的变量类型,比如
int
类型的数据则占 4 个字节,char
类型的数据则占 1 个字节。
六、指令
1.编码与解析
上面的例子中,图中指令的内容我写的是简易的汇编代码,目的是为了方便理解指令的具体内容,事实上指令的内容是一串二进制数字的机器码,每条指令都有对应的机器码,CPU 通过解析机器码来知道指令的内容。
- 指令编码(机器码 -> 汇编代码):编译器在编译程序的时候,会构造指令
- 指令解析(汇编代码 -> 机器码):CPU 执行程序的时候,就会解析指令
2.流水线
现代大多数 CPU 都使用来流水线的方式来执行指令,所谓的流水线就是把一个任务拆分成多个小任务,于是一条指令通常分为 4 个阶段,称为 4 级流水线,如下图:
![操作系统--CPU初级_第4张图片](http://img.e-com-net.com/image/info8/9eb8027096124486813fe0ad13d7cad3.jpg)
四个阶段的具体含义:
- Fetch(取得指令): CPU控制器通过程序计数器读取对应内存地址的指令 ;
- Decode(指令译码): CPU控制器对指令进行解码 ;
- Execution(执行指令): CPU控制器或运算器执行指令;
- Store(数据回写): CPU控制器将计算结果存回寄存器或者将寄存器的值存入内存;
上面这 4 个阶段,我们称为指令周期(Instrution Cycle),CPU 的工作就是一个周期接着一个周期,周而复始。
事实上,不同的阶段其实是由计算机中的不同组件完成的:
![操作系统--CPU初级_第5张图片](http://img.e-com-net.com/image/info8/a61d5f57fc604d90a6a225bf530f8cad.jpg)
3.指令的类型
数据传输类、运算类、跳转类、信号类、闲置类
4.指令的执行速度
![](http://img.e-com-net.com/image/info8/a43882dbca1d4acdad131a9f9469ef0e.jpg)
![](http://img.e-com-net.com/image/info8/b2987b98fd794c07963b43cf639b1d33.jpg)
因此,要想程序跑的更快,优化这三者即可:
- 指令数,表示执行程序所需要多少条指令,以及哪些指令。这个层面是基本靠编译器来优化,毕竟同样的代码,在不同的编译器,编译出来的计算机指令会有各种不同的表示方式。
- 每条指令的平均时钟周期数 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