网页制作网站开发的论文清涧县住房和成乡建设局 网站
网页制作网站开发的论文,清涧县住房和成乡建设局 网站,超级外链工具源码,太原网站制作企业来源 | 小林coding作者 | 小林coding头图 | 下载于视觉中国代码写了那么多#xff0c;你知道 a 1 2 这条代码是怎么被 CPU 执行的吗#xff1f;软件用了那么多#xff0c;你知道软件的 32 位和 64 位之间的区别吗#xff1f;再来 32 位的操作系统可以运行在 64 位的电脑上… 来源 | 小林coding作者 | 小林coding头图 | 下载于视觉中国代码写了那么多你知道 a 1 2 这条代码是怎么被 CPU 执行的吗软件用了那么多你知道软件的 32 位和 64 位之间的区别吗再来 32 位的操作系统可以运行在 64 位的电脑上吗64 位的操作系统可以运行在 32 位的电脑上吗如果不行原因是什么CPU 看了那么多我们都知道 CPU 通常分为 32 位和 64 位你知道 64 位相比 32 位 CPU 的优势在哪吗64 位 CPU 的计算性能一定比 32 位 CPU 高很多吗不知道也不用慌张接下来就循序渐进、一层一层地攻破这些问题。图灵机的工作方式要想知道程序执行的原理我们可以先从「图灵机」说起图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程而且还定义了计算机由哪些部分组成程序又是如何执行的。图灵机长什么样子呢你从下图可以看到图灵机的实际样子图来源自http://www.kristergustafsson.me/turing-machine/图灵机的基本组成如下有一条「纸带」纸带由一个个连续的格子组成每个格子可以写入字符纸带就好比内存而纸带上的格子的字符就好比内存中的数据或程序有一个「读写头」读写头可以读取纸带上任意格子的字符也可以把字符写入到纸带的格子读写头上有一些部件比如存储单元、控制单元以及运算单元1、存储单元用于存放数据2、控制单元用于识别字符是数据还是指令以及控制程序的流程等3、运算单元用于执行运算指令知道了图灵机的组成后我们以简单数学运算的 1 2 作为例子来看看它是怎么执行这行代码的。首先用读写头把 「1、2、」这 3 个字符分别写入到纸带上的 3 个格子然后读写头先停在 1 字符对应的格子上接着读写头读入 1 到存储设备中这个存储设备称为图灵机的状态然后读写头向右移动一个格用同样的方式把 2 读入到图灵机的状态于是现在图灵机的状态中存储着两个连续的数字 1 和 2读写头再往右移动一个格就会碰到 号读写头读到 号后将 号传输给「控制单元」控制单元发现是一个 号而不是数字所以没有存入到状态中因为 号是运算符指令作用是加和目前的状态于是通知「运算单元」工作。运算单元收到要加和状态中的值的通知后就会把状态中的 1 和 2 读入并计算再将计算的结果 3 存放到状态中最后运算单元将结果返回给控制单元控制单元将结果传输给读写头读写头向右移动把结果 3 写入到纸带的格子中通过上面的图灵机计算 1 2 的过程可以发现图灵机主要功能就是读取纸带格子中的内容然后交给控制单元识别字符是数字还是运算符指令如果是数字则存入到图灵机状态中如果是运算符则通知运算符单元读取状态中的数值进行计算计算结果最终返回给读写头读写头把结果写入到纸带的格子中。事实上图灵机这个看起来很简单的工作方式和我们今天的计算机是基本一样的。接下来我们一同再看看当今计算机的组成以及工作方式。冯诺依曼模型在 1945 年冯诺依曼和其他计算机科学家们提出了计算机具体实现的报告其遵循了图灵机的设计而且还提出用电子元件构造计算机并约定了用二进制进行计算和存储还定义计算机基本结构为 5 个部分分别是中央处理器CPU、内存、输入设备、输出设备、总线。这 5 个部分也被称为冯诺依曼模型接下来看看这 5 个部分的具体作用。 内存我们的程序和数据都是存储在内存存储的区域是线性的。数据存储的单位是一个二进制位bit即 0 或 1。最小的存储单位是字节byte1 字节等于 8 位。内存的地址是从 0 开始编号的然后自增排列最后一个地址为内存总字节数 - 1这种结构好似我们程序里的数组所以内存的读写任何一个数据的速度都是一样的。 中央处理器中央处理器也就是我们常说的 CPU32 位和 64 位 CPU 最主要区别在于一次能计算多少字节数据32 位 CPU 一次可以计算 4 个字节64 位 CPU 一次可以计算 8 个字节这里的 32 位和 64 位通常称为 CPU 的位宽。之所以 CPU 要这样设计是为了能计算更大的数值如果是 8 位的 CPU那么一次只能计算 1 个字节 0~255 范围内的数值这样就无法一次完成计算 10000 * 500 于是为了能一次计算大数的运算CPU 需要支持多个 byte 一起计算所以 CPU 位宽越大可以计算的数值就越大比如说 32 位 CPU 能计算的最大整数是 4294967295。CPU 内部还有一些组件常见的有寄存器、控制单元和逻辑运算单元等。其中控制单元负责控制 CPU 工作逻辑运算单元负责计算而寄存器可以分为多种类每种寄存器的功能又不尽相同。CPU 中的寄存器主要作用是存储计算时的数据你可能好奇为什么有了内存还需要寄存器原因很简单因为内存离 CPU 太远了而寄存器就在 CPU 里还紧挨着控制单元和逻辑运算单元自然计算时速度会很快。常见的寄存器种类通用寄存器用来存放需要进行运算的数据比如需要进行加和运算的两个数据。程序计数器用来存储 CPU 要执行下一条指令「所在的内存地址」注意不是存储了下一条要执行的指令此时指令还在内存中程序计数器只是存储了下一条指令的地址。指令寄存器用来存放程序计数器指向的指令也就是指令本身指令被执行完成之前指令都存储在这里。 总线总线是用于 CPU 和内存以及其他设备之间的通信总线可分为 3 种地址总线用于指定 CPU 将要操作的内存地址数据总线用于读写内存的数据控制总线用于发送和接收信号比如中断、设备复位等信号CPU 收到信号后自然进行响应这时也需要控制总线当 CPU 要读写内存数据的时候一般需要通过两个总线首先要通过「地址总线」来指定内存的地址再通过「数据总线」来传输数据 输入、输出设备输入设备向计算机输入数据计算机经过计算后把数据输出给输出设备。期间如果输入设备是键盘按下按键时是需要和 CPU 进行交互的这时就需要用到控制总线了。线路位宽与 CPU 位宽数据是如何通过线路传输的呢其实是通过操作电压低电压表示 0高压电压则表示 1。如果构造了高低高这样的信号其实就是 101 二进制数据十进制则表示 5如果只有一条线路就意味着每次只能传递 1 bit 的数据即 0 或 1那么传输 101 这个数据就需要 3 次才能传输完成这样的效率非常低。这样一位一位传输的方式称为串行下一个 bit 必须等待上一个 bit 传输完成才能进行传输。当然想一次多传一些数据增加线路即可这时数据就可以并行传输。为了避免低效率的串行传输的方式线路的位宽最好一次就能访问到所有的内存地址。CPU 要想操作的内存地址就需要地址总线如果地址总线只有 1 条那每次只能表示 「0 或 1」这两种情况所以 CPU 一次只能操作 2 个内存地址如果想要 CPU 操作 4G 的内存那么就需要 32 条地址总线因为 2 ^ 32 4G。知道了线路位宽的意义后我们再来看看 CPU 位宽。CPU 的位宽最好不要小于线路位宽比如 32 位 CPU 控制 40 位宽的地址总线和数据总线的话工作起来就会非常复杂且麻烦所以 32 位的 CPU 最好和 32 位宽的线路搭配因为 32 位 CPU 一次最多只能操作 32 位宽的地址总线和数据总线。如果用 32 位 CPU 去加和两个 64 位大小的数字就需要把这 2 个 64 位的数字分成 2 个低位 32 位数字和 2 个高位 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 内存就算你装了 8 GB 内存条也没用。而 64 位 CPU 寻址范围则很大理论最大的寻址空间为 2^64。程序执行的基本过程在前面我们知道了程序在图灵机的执行过程接下来我们来看看程序在冯诺依曼模型上是怎么执行的。程序实际上是一条一条指令所以程序的运行过程就是把每一条指令一步一步的执行起来负责执行指令的就是 CPU 了。那 CPU 执行程序的过程如下第一步CPU 读取「程序计数器」的值这个值是指令的内存地址然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址接着通知内存设备准备数据数据准备好后通过「数据总线」将指令数据传给 CPUCPU 收到内存传来的数据后将这个指令数据存入到「指令寄存器」。第二步CPU 分析「指令寄存器」中的指令确定指令的类型和参数如果是计算类型的指令就把指令交给「逻辑运算单元」运算如果是存储类型的指令则交由「控制单元」执行第三步CPU 执行完指令后「程序计数器」的值自增表示指向下一条指令。这个自增的大小由 CPU 的位宽决定比如 32 位的 CPU指令是 4 个字节需要 4 个内存地址存放因此「程序计数器」的值会自增 4简单总结一下就是一个程序执行的时候CPU 会根据程序计数器里的内存地址从内存里面把需要执行的指令读取到指令寄存器里面执行然后根据指令长度自增开始顺序读取下一条指令。CPU 从程序计数器读取指令、到执行、再到下一条指令这个过程会不断循环直到程序执行结束这个不断循环的过程被称为 CPU 的指令周期。a 1 2 执行具体过程知道了基本的程序执行过程后接下来用 a 1 2 的作为例子进一步分析该程序在冯诺伊曼模型的执行过程。CPU 是不认识 a 1 2 这个字符串这些字符串只是方便我们程序员认识要想这段程序能跑起来还需要把整个程序翻译成汇编语言的程序这个过程称为编译成汇编代码。针对汇编代码我们还需要用汇编器翻译成机器码这些机器码由 0 和 1 组成的机器语言这一条条机器码就是一条条的计算机指令这个才是 CPU 能够真正认识的东西。下面来看看 a 1 2 在 32 位 CPU 的执行过程。程序编译过程中编译器通过分析代码发现 1 和 2 是数据于是程序运行时内存会有个专门的区域来存放这些数据这个区域就是「数据段」。如下图数据 1 和 2 的区域位置数据 1 被存放到 0x100 位置数据 2 被存放到 0x104 位置注意数据和指令是分开区域存放的存放指令区域的地方称为「正文段」。编译器会把 a 1 2 翻译成 4 条指令存放到正文段中。如图这 4 条指令被存放到了 0x200 ~ 0x20c 的区域中0x200 的内容是 load 指令将 0x100 地址中的数据 1 装入到寄存器 R00x204 的内容是 load 指令将 0x104 地址中的数据 2 装入到寄存器 R10x208 的内容是 add 指令将寄存器 R0 和 R1 的数据相加并把结果存放到寄存器 R20x20c 的内容是 store 指令将寄存器 R2 中的数据存回数据段中的 0x108 地址中这个地址也就是变量 a 内存中的地址编译完成后具体执行程序的时候程序计数器会被设置为 0x200 地址然后依次执行这 4 条指令。上面的例子中由于是在 32 位 CPU 执行的因此一条指令是占 32 位大小所以你会发现每条指令间隔 4 个字节。而数据的大小是根据你在程序中指定的变量类型比如 int 类型的数据则占 4 个字节char 类型的数据则占 1 个字节。 指令上面的例子中图中指令的内容我写的是简易的汇编代码目的是为了方便理解指令的具体内容事实上指令的内容是一串二进制数字的机器码每条指令都有对应的机器码CPU 通过解析机器码来知道指令的内容。不同的 CPU 有不同的指令集也就是对应着不同的汇编语言和不同的机器码接下来选用最简单的 MIPS 指集来看看机器码是如何生成的这样也能明白二进制的机器码的具体含义。MIPS 的指令是一个 32 位的整数高 6 位代表着操作码表示这条指令是一条什么样的指令剩下的 26 位不同指令类型所表示的内容也就不相同主要有三种类型R、I 和 J。一起具体看看这三种类型的含义R 指令用在算术和逻辑操作里面由读取和写入数据的寄存器地址。如果是逻辑位移操作后面还有位移操作的「位移量」而最后的「功能码」则是再前面的操作码不够的时候扩展操作码来表示对应的具体指令的I 指令用在数据传输、条件分支等。这个类型的指令就没有了位移量和操作码也没有了第三个寄存器而是把这三部分直接合并成了一个地址值或一个常数J 指令用在跳转高 6 位之外的 26 位都是一个跳转后的地址接下来我们把前面例子的这条指令「add 指令将寄存器 R0 和 R1 的数据相加并把结果放入到 R3」翻译成机器码。加和运算 add 指令是属于 R 指令类型add 对应的 MIPS 指令里操作码是 000000以及最末尾的功能码是 100000这些数值都是固定的查一下 MIPS 指令集的手册就能知道的rs 代表第一个寄存器 R0 的编号即 00000rt 代表第二个寄存器 R1 的编号即 00001rd 代表目标的临时寄存器 R2 的编号即 00010因为不是位移操作所以位移量是 00000把上面这些数字拼在一起就是一条 32 位的 MIPS 加法指令了那么用 16 进制表示的机器码则是 0x00011020。编译器在编译程序的时候会构造指令这个过程叫做指令的编码。CPU 执行程序的时候就会解析指令这个过程叫作指令的解码。现代大多数 CPU 都使用来流水线的方式来执行指令所谓的流水线就是把一个任务拆分成多个小任务于是一条指令通常分为 4 个阶段称为 4 级流水线如下图四个阶段的具体含义CPU 通过程序计数器读取对应内存地址的指令这个部分称为 Fetch取得指令CPU 对指令进行解码这个部分称为 Decode指令译码CPU 执行指令这个部分称为 Execution执行指令CPU 将计算结果存回寄存器或者将寄存器的值存入内存这个部分称为 Store数据回写上面这 4 个阶段我们称为指令周期Instrution CycleCPU 的工作就是一个周期接着一个周期周而复始。事实上不同的阶段其实是由计算机中的不同组件完成的取指令的阶段我们的指令是存放在存储器里的实际上通过程序计数器和指令寄存器取出指令的过程是由控制器操作的指令的译码过程也是由控制器进行的指令执行的过程无论是进行算术操作、逻辑操作还是进行数据传输、条件分支操作都是由算术逻辑单元操作的也就是由运算器处理的。但是如果是一个简单的无条件地址跳转则是直接在控制器里面完成的不需要用到运算器。 指令的类型指令从功能角度划分可以分为 5 大类数据传输类型的指令比如 store/load 是寄存器与内存间数据传输的指令mov 是将一个内存地址的数据移动到另一个内存地址的指令运算类型的指令比如加减乘除、位运算、比较大小等等它们最多只能处理两个寄存器中的数据跳转类型的指令通过修改程序计数器的值来达到跳转执行指令的过程比如编程中常见的 if-else、swtich-case、函数调用等。信号类型的指令比如发生中断的指令 trap闲置类型的指令比如指令 nop执行后 CPU 会空转一个周期 指令的执行速度CPU 的硬件参数都会有 GHz 这个参数比如一个 1 GHz 的 CPU指的是时钟频率是 1 G代表着 1 秒会产生 1G 次数的脉冲信号每一次脉冲信号高低电平的转换就是一个周期称为时钟周期。对于 CPU 来说在一个时钟周期内CPU 仅能完成一个最基本的动作时钟频率越高时钟周期就越短工作速度也就越快。一个时钟周期一定能执行完一条指令吗答案是不一定的大多数指令不能在一个时钟周期完成通常需要若干个时钟周期。不同的指令需要的时钟周期是不同的加法和乘法都对应着一条 CPU 指令但是乘法需要的时钟周期就要比加法多。如何让程序跑的更快程序执行的时候耗费的 CPU 时间少就说明程序是快的对于程序的 CPU 执行时间我们可以拆解成CPU 时钟周期数CPU Cycles和时钟周期时间Clock Cycle Time的乘积。时钟周期时间就是我们前面提及的 CPU 主频主频越高说明 CPU 的工作速度就越快比如我手头上的电脑的 CPU 是 2.4 GHz 四核 Intel Core i5这里的 2.4 GHz 就是电脑的主频时钟周期时间就是 1/2.4G。要想 CPU 跑的更快自然缩短时钟周期时间也就是提升 CPU 主频但是今非彼日摩尔定律早已失效当今的 CPU 主频已经很难再做到翻倍的效果了。另外换一个更好的 CPU这个也是我们软件工程师控制不了的事情我们应该把目光放到另外一个乘法因子 —— CPU 时钟周期数如果能减少程序所需的 CPU 时钟周期数量一样也是能提升程序的性能的。对于 CPU 时钟周期数我们可以进一步拆解成「指令数 x 每条指令的平均时钟周期数Cycles Per Instruction简称 CPI」于是程序的 CPU 执行时间的公式可变成如下因此要想程序跑的更快优化这三者即可指令数表示执行程序所需要多少条指令以及哪些指令。这个层面是基本靠编译器来优化毕竟同样的代码在不同的编译器编译出来的计算机指令会有各种不同的表示方式。每条指令的平均时钟周期数 CPI表示一条指令需要多少个时钟周期数现代大多数 CPU 通过流水线技术Pipline让一条指令需要的 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 可以寻址更大的内存空间32 位 CPU 最大的寻址地址是 4G即使你加了 8G 大小的内存也还是只能寻址到 4G而 64 位 CPU 最大寻址地址是 2^64远超于 32 位 CPU 最大寻址地址的 2^32。你知道软件的 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 位指的是指令的位宽。更多阅读推荐开源的新型云原生事件驱动架构实践解析从 Serverfull 到 Serverless发生了什私有云OS赛道反而越开放越好乱中有变云原生从“大爆发”说起疫情中的2021云原生会走向哪里分布式架构的王者Kubernetes凭什么
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92420.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!