电子商务网站建设大二实训,wordpress整站导出,广州市比较大型的网站建设公司,wordpress 自建网站硬件结构
CPU是如何执行程序的#xff1f;
图灵机的工作方式
图灵机的基本思想#xff1a;用机器来模拟人们用纸笔进行数学运算的过程#xff0c;还定义了由计算机的那些部分组成#xff0c;程序又是如何执行的。
图灵机的基本组成如下#xff1a;
有一条「纸带」
图灵机的工作方式
图灵机的基本思想用机器来模拟人们用纸笔进行数学运算的过程还定义了由计算机的那些部分组成程序又是如何执行的。
图灵机的基本组成如下
有一条「纸带」纸带由一个个连续的格子组成每个格子可以写入字符纸带就好比内存而纸带上的格子的字符就好比内存中的数据或程序有一个「读写头」读写头可以读取纸带上任意格子的字符也可以把字符写入到纸带的格子读写头上有一些部件比如存储单元、控制单元以及运算单元1、存储单元用于存放数据2、控制单元用于识别字符是数据还是指令以及控制程序的流程等3、运算单元用于执行运算指令
以12为例
首先用读写头把「1、2、」这3个字符分别写入到纸带上的3个格子然后读写头先停在1字符对应的格子上接着读写头读入1到存储设备中这个存储设备成为图灵机的状态然后读写头向右移动一个一个格用同样的方式把2度如刀图灵机的状态于是现在图灵机的状态存储着两个连续的数字1和2读写头在往右移动一个格就会碰到号读写头读到号后将号传输给控制单元控制单元发现是一个号而不是数字所以没有存入到状态中因为号是运算符指令作用时加和目前的状态于是通知运算淡云工作。运算单元收到要加和状态中的值的通知后就会吧状态中的1和2读入并计算再将计算的结果3存放到状态中最后运算单元将结果返回给控制单元控制单元将结果输给读写头读写头向右移动把结果3写入到纸带的格子中通过上面的图灵机计算12的过程可以发现图灵机主要功能就是读取纸带格子中的内容然后交给控制单元识别字符是数字还是运算指令如果是数字则存入到图灵机状态中如果是运算符则通知运算符单元读取状态中的数值进行计算计算结果最终返回给读写头读写头把结果写入到纸带的格子中。
事实上图灵机这个看起来很简单的工作方式和我们今天的计算机是基本一样的。接下来我们一同再看看当今计算机的组成以及工作方式。
冯诺依曼模型
在1945年冯诺依曼和其他计算机科学家们提出了计算机具体实现的报告其遵循了图灵机的设计而且还提出用电子元件构造计算机并约定了用二进制进行计算和存储。
最重要的定义是计算机基本结构分为5个部分分别是运算器、控制器、存储器、输入设备、输出设备这5个部分也被称为冯诺依曼模型。
存储器
控制单元 算术逻辑单元
输入 输出
运算器、控制器是在中央处理器里的存储器就是我们常见的内存输入设备则是计算机外界的设备比如键盘就是输入设备显示器就是输出设备。
存储单元和输入输出设备要与中央处理器打交道的话离不开总线。所以它们之间关系如图 寄存器 存储单元 输入/输出设备
控制单元 控制总线 数据总线 逻辑运算单元 地址总线 CPU
接下来分别介绍内存、中央处理器、总线、输入输出设备。
内存
我们的程序和数据都是存储在内存存储的区域是线性的。
在计算机数据存储中数据的基本单位视字节BYTE1字节等于8位/8bit。每一个字节都对应一个内存地址。
内存的地址是从0开始编号的然后自增排列最后一个地址为内存粽子结束-1这种结构好似我们程序里的数组所以内存的读写任何一个数据的速度都是一样的。
中央处理器
中央处理器也就是我们常见的CPU32位和64位CPU最主要区别在于一次能计算多少字节数据
32位CPU一次可以见4字节
64位CPU一次可以计算8字节
这里的32位和64 位通常称为CPU的位宽。
之所以CPU要这样设计是为了能计算更大的树枝如果是8位的CPU那么一次只能计算1字节0255范围内的数值这样就无法一次完成计算10000*500于是为了能一次计算大数的运算
CPU需要支持多个BYTE一起计算所以CPU位宽越大可以就散的数值就越大比如说32位CPU能计算的最大整数是4294967295.
CPU 内部还有一些组件常见的寄存器、控制单元和逻辑运算单元等。其中控制单元丰泽控制CPU工作逻辑运算单元负责计算而寄存器可以分为多个种类每种寄存器的功能又不尽相同。
CPU的寄存器主要作用是存储计算时的数据你肯呢好奇为什么有了内存还需要寄存器原因很简单因为cpu离内存太远了而寄存器就在cpu里还紧挨着控制单元和逻辑运算单元自然计算时速度会很快。
常见的寄存器分类
通用寄存器用来存放需要进行运算的数据如需要进行加和运算的两个数据。
程序计数器用来存储cpu要执行下一条指令「所在的内存地址」注意不是存储了下一条要执行的指令此时指令还在内存中程序计数器只是存储了下一条指令的「地址」。
指令寄存器用来存放当前正在执行的指令也就是指令本身指令被执行完成之前指令都存储在这里。
总线
总线适用于CPU和内存以及其他设备之间的通信总线可分为三种呢
地址总线用于指定cpu将要操作的内存地址
数据总线用于读写内存的数据
控制总线用于发送和接收信号比如中断、设备复位等信号CPU收到信号后自然进行相应这是也需要控制总线
当CPU要读写内存数据的时候一般需要通过下面这三个总线
首先要通过地址总线来制定内存的地址
然后通过控制总线控制是读或写命令
最后通过数据总线来传输数据
输入输出设备
输入设备想计算机输入数据计算机经过计算后把数据输出给输出设别。期间如果输入设备是键盘按下按键时是需要和CPU进行交互的这时就需要用到控制总线了。
线路位宽与CPU位宽
数据是如何通过线路传输的呢其实是通过操作电压低电压表示0高电压则表示1.
如果构造了高低高这样的信号其实就是101二进制数据十进制则表示5如果只有一条线路就意味着每次只能传递1bit的数据即0或1那么传输101这个数据就需要3次才能传输完成这样的效率非常低。
这样一位一位传输的方式成为串行下一个bit必须等待上一个bit传输完成才能进行传输。当然想一次多传输一些数据增加线路即可这是数据就可以并行传输。
为了避免低效率的串行传输的方式线路的尾款最好一次就能访问到所有的内存地址。
CPU想要操作内存地址就需要地址总线
如果地址总线只有1条那每次只能表示0或1这两种地址所以CPU能操作的内存地址最大数量位2个注意不要理解成同时能操作2个内存地址
如果地址总线右2条那么能表示00、01、10、11这四种地址所以cpu能操作的内存地址最大数量为4个。
那么想要CPU操作4G大的内存那么就需要32条地址总线因为2^2*2^10*2^10*2^102^324G。
知道了线路位宽的意义后我们再来看CPU位宽。
CPU为快最好不要小雨线路位宽比如32位CPU控制40位宽的地址总线和数据总线的话工作起来就会非常复杂且麻烦所以32位CPU最好和32位宽的线路搭配因为32位CPU一次最多只能操作32位宽的地址总线和数据总线。
如果用32位CPU去加和两个64位大小的数字就需要把这2个64位的数字分成两个低位32位数字和两位高位32位数字来计算先加个两个低位的32位数字酸楚仅为然后加和两位高位的32位数字然后再加上仅为就能计算出结果可以发现32位CPU并不能一次性计算出加和两个64位数字的结果。
对于64位CPU就可以一次性算出加和两个64位数字的结果因为64位CPU可以一次读如64位的数字并且64位CPU内部的逻辑运算单元也支持64位数字的计算。但是不代表64位CPU性能比32位CPU高很多很少应用需要算超过32位的数字所以如果计算的数额不超过32位数字的情况下32位和64位CPU之间没什么区别的只有当计算超过32位数字的情况下64位的优势才能体现出来。
另外32位CPU最大只能操作4GB内存就算你装了8GB内存条也没用。而64位CPU寻址范围很大理论最大的寻址空间位2^64即8GB。
程序执行的基本过程
冯诺依曼模型程序实际上是一条一条指令所以程序的运行过程就是把每一条指令一步一步的执行起来负责执行指令的就是CPU了。 那CPU执行程序的过程如下
第一步CPU读取程序计数器的值这个值是指令的内存地址然后CPU的控制单元操作地址总线指定需要访问的内存地址接着通知内存设备准备数据数据准备好后通过数据总线将指令数据传给CPUCPU收到内存传来的数据后将这个指令数据存入指令寄存器。
第二步程序计数器的值自增 表示只想下一条指令。这个自增的大小由CPU的位宽决定比如32位的额CPU指令时4字节需要4个内存地址存放一个内存地址能存一个字节的数据因此程序计数器的值会自增4
第三步CPU分析指令寄存器中的指令确定指令的类型和参数如果是计算类型的指令就把指令交给运算逻辑单元运算如果是存储类型的指令则交由控制单元执行
简单总结一下就是一个程序执行的时候CPU会根据程序计数器里面的内存地址从内存里面吧需要执行的指令读取到指令寄存器里面执行然后根据指令长度自增开始顺序读取下一条指令。
CPU从程序计数器去读取指令、到执行、再到下一条指令这个过程会不断循环直到程序执行结束这个不断循环的过程称为cpu的指令周期。
a12执行具体过程
CPU不认识a12这个字符串要把整个程序翻译成汇编语言的程序这个过程称为编译成汇编代码。
针对汇编代码我们还需要用汇编器翻译成机器码这些机器码由0和1组成的机器语言这一条条机器码就是一条条的计算机指令这个才是CPU能够真正认识的东西。
下面来看看 a 1 2 在 32 位 CPU 的执行过程
程序编译过程中编器器通过分析代码发现1和2都是数据于是程序运行时内存会又个专门的区域来存放这些数据这个区域就是数据段。如下图数据1和2的区域位置
数据1被放到0x200位置
数据 2 被存放到 0x204 位置
注意数据和指令是分开区域存放的存放指令区域的地方称为正文段。
0x100:load指令将0x200地址中的数据1装入到寄存器R0
0x104:load指令将0x204地址中的数据2装入到寄存器R1
0x108:add指令将寄存器R0和R1的数据想家并把结果存放到寄存器R2
0x10cset指令/store指令将寄存器R2中的数据存回数据段中的0x208地址中这个地址也就是变量a内存中的地址。
编一碗好吃呢过后具体执行程序的时候程序计数器会被设置为0x100地址然后依次执行这4条指令。
上面的例子中由于是在32位CPU执行的因此一条指令是占32位大小所以你会发现每条指令间隔4个字节因为内存的存储单元是1字节。
而数据的大小是根据你在程序中指定的变量类型比如int类型的数据则占4字节char/byte占1字节。
指令
上面的例子中图中指令的内容我写的是建议的汇编代码目的是为了方便理解指令的具体内容事实上指令的内容是遗传二进制数字的机器码每条指令都有对应的机器码CPU通过解析机器码老知道指令的内容。
不同的CPU有不同的指令集也就是对应着不同的汇编语言和不同的机器码接下来最简单的mips指集来看看机器码是如何生成的这样也能明白二进制的机器码的具体含义。
mips的指令是一位32位的整数高6位代表着操作吗表示这条指令是一条什么样的指令剩下的26位不同指令类型锁表示的内容也就不相同主要有三种类型R和J。
R指令用在算数和逻辑操作里面有读取和写入数据的寄存器地址。如果是逻辑位操作后面还有唯一操作的位移量而最后的功能码则是再前面的操作吗不够的时候扩展操作吗来表示对应的具体指令的
I指令用在数据传输、条件分支等。这个类型的指令就没有了唯一令的功能码也没有了第三寄存器而是把这三部分直接合并了一个地址值或一个常数
J指令用在跳转高6位之外的26位都是一个跳转之后的地址
接下来我们把前面例子的这条指令add指令将寄存器R0和R 的数据相加并把结果放入到R2翻译成机器码。
加和运算是、add对应的mips指令里操作码是00000以及最末尾的功能码是10000这些数值都是固定的查一下mips指令集的手册就能知道的
rs代表第一个寄存器R0的编号即00000
rt代表第二个寄存器R 1 的编号即00001
rd代表目标的临时寄存器R2的编号即00010
因为不是唯一操作所以位移量是00000
把上面这些数字拼在一起就是一条32位的mips假发指令了那么用16禁止表示的机器码则是0x00011020.编译器在编译程序的时候会构造指令这个过程叫做指令的编码。CPU执行程序的时候就会解析指令这个过程叫做指令的解码。现代大所属CPU都适用流水线的方式来执行指令所谓的流水线就是把一个任务拆分成多个小任务于是一条指令通常分为4个阶段称为4级流水线如下图
2.2磁盘比内存慢几万倍
2.3 如何写出让 CPU 跑得更快的代码
2.4 CPU 缓存一致性
#2.5 CPU 是如何执行任务的
2.6 什么是软中断
中断是什么
中断是一种异步的时间处理机制可以提高系统的并发处理能力。
操作系统收到了中断请求会打断其他进程的运行所以中断请求的相应程序也就是中断处理程序要尽可能快的执行完这样可以减少对正常进程运行调度的影响。
而且中断处理程序在响应中断时可能还会临时关闭中断这意味着如果当前中断处理程序没有执行完之前系统中其他的中断请求都无法被响应也就是说中断有可能丢失所以中断处理程序要短且快。 什么是软中断
Linux系统为了解决中断处理程序执行过长和中断丢失问题将中断过程分成了两个阶段分别是上半部分和下半部分。
上半部分
用来快速处理终端一般会暂时关闭中断请求主要负责处理跟硬件紧密相关或时间敏感的事情。
下半部分
用来延迟处理上半部分未完成的工作一般以内核线程的方式运行。
系统里有哪些软中断
如何定位软中断CPU使用率过高的问题