![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机组成原理
小问号阿
谦虚学习,一步一脚印
展开
-
深入计算机组成原理(二)给你一张知识地图,计算机组成原理应该这么学
了解了现在计算机的基本硬件组成和背后最基本的冯·诺依曼体系结构,我们就可以正式进入计算机组成原理的学习了。在学习一个一个零散的知识点之前,我整理了一份学习地图,好让你对将要学习的内容有一个总纲层面的了解。从这张图可以看出来,整个计算机组成原理,就是围绕着计算机是如何组织运作展开的。计算机组成原理知识地图计算机组成原理的英文叫 Computer Organization。这里的Organiz...转载 2019-05-24 15:03:27 · 4165 阅读 · 3 评论 -
深入计算机组成原理(二十)面向流水线的指令设计(上):一心多用的现代CPU
前面我们用了三讲,用一个个的电路组合,制作出了一个完整功能的CPU。这里面一下子给你引入了三个“周期”的概念,分别是指令周期、机器周期(或者CPU周期)以及时钟周期。你可能会有点摸不着头脑,为什么小小一个CPU,有那么多的周期(Cycle)呢?我们在一开始,不是把CPU的性能定义得非常清楚了吗?我们说程序的性能,是由三个因素相乘来衡量的,我们还专门说过“指令数 x CPI x 时钟周期”这个公式...转载 2019-07-08 17:33:45 · 1558 阅读 · 0 评论 -
深入计算机组成原理(十六)浮点数和定点数(下):深入理解浮点数到底有什么用?
上一讲,我们讲了用“浮点数”这样的数据形式,来表示一个不能确定大小的数据范围。同时,我们也发现,其实我们平时写的0.1、0.2并不是精确的数值,只是一个近似值。只有0.5这样,可以表示成2的-1次方这种形式的,才是一个精确的浮点数。你是不是感到很疑惑,浮点数的近似值究竟是怎么算出来的?浮点数的加法计算又是怎么回事?在实践应用中,我们怎么才能用好浮点数呢?这一节,我们就一起来看这几个问题。浮点数...转载 2019-06-27 18:33:44 · 2328 阅读 · 3 评论 -
深入计算机组成原理(十八)建立数据通路(中):指令+运算=CPU
上一讲,我们看到,要能够实现一个完整的CPU功能,除了加法器这样的电路之外,我们还需要实现其他功能的电路。其中有一些电路,和我们实现过的加法器一样,只需要给定输入,就能得到固定的输出。这样的电路,我们称之为组合逻辑电路(Combinational Logic Circuit)。但是,光有组合逻辑电路是不够的。你可以想一下,如果只有组合逻辑电路,我们的CPU会是怎么样的?电路输入是确定的,对应的输...转载 2019-07-03 21:04:16 · 1170 阅读 · 0 评论 -
深入计算机组成原理(十七)建立数据通路(上):指令+运算=CPU
前面几讲里,我从不同的部分为你讲解了CPU的功能。在“指令”部分,我为你讲解了计算机的“指令”是怎么运算的,也就是我们撰写的代码,是怎么编程一条条的机器能够理解的指令的,以及是按照什么样的顺序运行的。在“计算”部分,我为你讲解了计算机的“计算”部分是怎么执行的,数据的二进制表示是怎么样的,我们执行的加法和乘法又是通过什么样的电路来实现的。然而,光知道在两部分还不能算是真正揭开了CPU的秘密,...转载 2019-07-01 12:12:14 · 1579 阅读 · 0 评论 -
深入计算机组成原理(十九)建立数据通路(下):指令+运算=CPU
上一讲,我们讲解了时钟信号是怎么实现的,以及怎么利用这个时钟信号,来控制数据的读写,可以使得我们能把需要的数据“存储”下来。那么,这一讲,我们要让计算机“自动”跑起来。通过一个时钟信号,我们可以实现计数器,这个会成为我们的PC寄存器。然后,我们还需要一个能够帮我们在内存里面寻找指定数据地址的译码器,以及解析读取到的机器指令的译码器。这样,我们就能把所有学习到的硬件组件串联起来,变成一个CPU,实...转载 2019-07-07 10:10:00 · 1212 阅读 · 1 评论 -
深入计算机组成原理(二十二)冒险和预测(一):hazard是“危”也是“机”
过去两讲,我为你讲解了流水线设计CPU所需要的基本概念。接下来,我们看看,要想通过流水线设计来提升CPU 的吞吐率,我们需要冒哪些险。任何一本讲解CPU的流水线设计的教科书,都会提到流水线设计需要解决的三大冒险,分别是结构冒险(Structural Hazard)、数据冒险(Data Hazard)以及控制冒险(Control Hazard)。这三大冒险的名字很有意思,他们都叫做hazard(...转载 2019-08-08 14:59:16 · 5392 阅读 · 0 评论 -
深入计算机组成原理(二十一)面向流水线的指令设计(下):奔腾4是怎么失败的?
上一讲,我给你初步介绍了CPU的流水线级数。乍看起来,流水线级数是一个提升性能的灵丹妙药。它通过把一条指令的额操作切分成更细的多个步骤,可以避免CPU的“浪费”。每一个细分流水线步骤都很简单,所以我们的单个时钟周期的时间就可以设的更短。这也变相地让CPU的主频提升的很快。这一系列的优点,也引出了现代桌面CPU的最后一场大战,也就是Intel的Pentium4和AMD的Athlon之间的竞争。在技...转载 2019-08-07 11:41:47 · 832 阅读 · 0 评论 -
深入计算机组成原理(二十三)冒险和预测(二):流水线里的接力赛
上一讲,我为你讲解了结构冒险和数据冒险,以及对应这两种冒险的两个解决方案。一种方案是增加资源,通过添加指令缓存和数据缓存,让外面对于指令和数据的访问可以同时进行。这个办法帮助CPU解决了取指令和访问数据之间的资源冲突。另一种方案是直接进行等待。通过插入NOP这样的无效指令,等待之前的指令完成。这样外面就能解决不同指令之间的数据依赖问题。第一种方案,好比在软件开发的过程中,发现效率不够,于是研发负...转载 2019-08-10 15:59:04 · 1233 阅读 · 0 评论 -
深入计算机组成原理(二十四)冒险和预测(三):CPU里的“线程池”
过去两讲,我为你讲解了通过增加资源、停顿等待以及主动转发数据的方式,来解决结构冒险和数据冒险问题。对于结构冒险,由于限制来自于同一时钟周期不同的指令,要访问相同的硬件资源,解决方案是增加资源。对于数据冒险,由于限制来自于数据之间的各种依赖,我们可以提前把数据转发到下一个指令。但是即便综合使用这三种技术,我们仍然会遇到不得不停下整个流水线,等待前面的指令完成的情况,也就是采用流水线停顿的方案。比如...转载 2019-08-15 08:38:11 · 975 阅读 · 0 评论 -
深入计算机组成原理(二十五)冒险和预测(四):今天下雨了,明天还会下雨吗?
过去三讲,我为你介绍了结构冒险和数据冒险,以及增加资源、流水线停顿、操作数前推、乱序执行,这些解决各种“冒险”的技术方案。在结构冒险和数据冒险中,你会发现,所有的流水线停顿操作都要从指令执行阶段开始。流水线的前两个阶段,也就是取指令(IF)和指令译码(ID)的阶段,是不需要停顿的。CPU会在流水线里面直接去取下一条指令,然后进行译码。取指令和指令译码不会需要遇到任何停顿,这是基于一个假设。这个...转载 2019-08-17 10:55:35 · 1252 阅读 · 0 评论 -
深入计算机组成原理(二十六)Superscalar和VLIW:如何让CPU的吞吐率超过1?
我们先回顾一下第四讲,不知道你是否还记得这个公式: 程序的 CPU 执行时间 = 指令数 × CPI × Clock Cycle Time这个公式里,有一个叫CPI的指标。我们知道,CPI的倒数,又叫做IPC(Instruction Per Clock),也就是一个时钟周期里面能够执行的指令数,代表了CPU的吞吐率。那么,这个指标,放在我们前面几节反复优化流水线架构的CPU里,能达...转载 2019-09-20 09:06:21 · 1144 阅读 · 0 评论 -
深入计算机组成原理(十五)浮点数和定点数(上):怎么用有限的bit标识尽可能多的信息?
在我们日常的程序开发中,不只会用到整数。更多情况下,我们用到的都是实数。比如,我们开发一个电商App,商品的价格常常会是9.9;再比如说,现在流行的深度学习算法,对应的机器学习里的模型里的各个权重也都是1.23这样的数。可以说,在实际的应用过程中,这些有零又整的实数,是和整数同样常用的数据类型,我们也需要考虑到。浮点数的不精确性那么,我们能不能用二进制标识所有的实数,然后在二进制下计算它的加减...转载 2019-06-26 17:23:49 · 1109 阅读 · 0 评论 -
深入计算机组成原理(十三)加法器:如何像搭乐高一样搭电路(上)?
上一讲,我们看到了如何通过电路,在计算机硬件层面设计最基本的单元,门电路。我给你看的门电路非常简单,只能做简单的“与(AND)”、“或(OR)”、“非(NOT)”和“异或(XOR)”,这样最基本的单比特逻辑运算。下面这些门电路的标识,你需要非常熟悉,后续的电路都是由这些门电路组合起来的。这些基本的门电路,是我们计算机硬件端的最基本的“积木”,就好像乐高积木里面最简单的小方块。看似不起眼,但是把...转载 2019-06-22 19:46:10 · 2216 阅读 · 0 评论 -
深入计算机组成原理(十)动态链接:程序内部的”共享单车“
我们之前讲过,程序的链接,是把对应的不同文件内的代码段,合并到一起,成为最后的可执行文件。这个链接的方式,让我们在写代码的时候做到了”复用“。同样的功能代码只用写一次,然后提供给很多不同的程序进行链接就行了。这么说来,”链接“其实有点像我们日常生活中的标准化、模块化生产。我们有一个可以生产标准螺帽的生产线,就可以生产很多不同的螺帽。只要需要螺帽,我们就可以通过链接的方式,去复制一个出来,放到需要...转载 2019-06-18 12:09:36 · 529 阅读 · 1 评论 -
深入计算机组成原理(三)通过你的CPU主频,我们来谈谈"性能"究竟是什么?
性能 = 1 / 响应时间转载 2019-05-24 16:15:02 · 2284 阅读 · 0 评论 -
深入计算机组成原理(一)冯·诺依曼体系结构:计算机组成的金字塔
学习计算机组成原理,到底是在学些什么呢?这个事儿,一两句话还真说不清楚。不过没关系,我们先从“装电脑”这个看起来没有什么技术含量的事情说起,来弄清楚计算机到底是由什么组成的。不知道你是否自己搞过“装机”这回事。在2019年的今天,大部分人用的计算机,应该都是已经组装好的“品牌机”。如果我们把时钟拨到上世纪八九十年代,不少早期的电脑爱好者,都是自己采购各种电脑配件,来装一台自己的计算机的。计算机...转载 2019-05-23 20:37:51 · 4927 阅读 · 0 评论 -
深入计算机组成原理(四)穿越功耗墙,我们该从哪些方面提升“性能”?
上一讲,在讲CPU的性能时,我们提到了这样一个公式: 程序的CPU执行时间 = 指令数 x CPI x Clock Cycle Time这样来看,如果要提升计算机的性能,我们可以从指令数、CPI以及CPU主频这三个地方入手。要搞定指令数或者CPI,乍一看都不太容易。于是,研发CPU的硬件工程师们,从80年代开始,就挑上了CPU这个“软柿子”。在CPU上多放一些晶体管,不断提升CPU...转载 2019-05-31 10:07:17 · 1473 阅读 · 0 评论 -
深入计算机组成原理(五)计算机指令:让我们试试用纸带编程
你在学写程序的时候,有没有想过,古老时代的计算机程序是怎么写出来的?其实在当年,不想现在这样,都是用一种古老的物理设备,叫做“打孔卡”(Punched Card)。用这种设备写程序,可没法像现在这样,掏出键盘就能打字,而是要先在脑海里或者在纸上写出程序,然后在纸带或者卡片上打洞。这样,要写的程序,要处理的数据,就变成一条条纸带或者卡片,之后再交给当时的计算机去处理。你看这个穿孔纸带是不是有点...转载 2019-06-04 10:44:57 · 2384 阅读 · 0 评论 -
深入计算机组成原理(六)指令跳转:原来if...else就是goto
上一讲,我们讲解了一行代码是怎么变成计算机指令的。你平时写的程序中,肯定不只有int a = 1这样最简单的代码或者指令。我们总是要用到if…else这样的条件判断语句、while和for这样的循环语句,还有函数或者过程调用。对应的,CPU执行的也不只是一条指令,一般一个程序包含很多指令,因为有if…else、for这样的条件和循环存在,这些指令也不会一路平铺执行下去。今天我们就在上一节的基础...转载 2019-06-10 20:25:11 · 5339 阅读 · 3 评论 -
深入计算机组成原理(七)函数调用,为什么会发生stack overflow?
在开发软件的过程中我们经常会遇到错误,如果你用Google搜过出错信息,那你多少应该都访问过Stack Overflow这个网站。作为全球最大的程序员问答网站,Stack Overflow的名字来自于一个常见的报错,就是栈溢出(stack overflow)。今天,我们就从程序的函数调用开始,讲讲函数间的互相调用,在计算机指令层面是怎么实现的,以及什么情况下会发生栈溢出这个错误。为什么我们需要...转载 2019-06-10 21:56:53 · 1006 阅读 · 0 评论 -
深入计算机组成原理(十一)二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
上算法和数据结构课的时候,老师们都会和你说,程序=算法+数据结构。如果对应到组成原理或者说硬件层面,算法就是我们前面讲的各种计算机指令,数据结构就对应我们接下来要讲的二进制数据。众所周知,现代计算机都是用0和1组成的二进制,来表示所有的信息。前面几讲的程序指令用到的机器码,也是使用二进制表示的;我们存储在内存里面的字符串、整数、浮点数也都是用二进制表示的。万事万物在计算机里都是0和1,所以呢,搞...转载 2019-06-20 17:19:52 · 8973 阅读 · 0 评论 -
深入计算机组成原理(十四)乘法器:如何像搭乐高一样搭电路(下)?
和小学学习数学一样,学完了加法之后,我们自然而然就来学习乘法。既然是退回到小学,我们就把问题搞的简单一点,先来看两个4位数的乘法。这里的4位数,当然还是一个二进制数。十进制中的13乘以9,计算的结果应该是117.我们通过转换成二进制,然后列竖式的方法,来看看整个计算的过程是怎么样的。顺序乘法的实现过程从列出竖式的过程中,你会发现,二进制的乘法有一个很大的有点,就是这个过程你不需要背九九乘法...转载 2019-06-25 09:56:58 · 2497 阅读 · 0 评论 -
深入计算机组成原理(九)程序装载:“640k内存”真的不够用么?
计算机这个行业的历史上有过很多成功的预言,最著名的自然是“摩尔定律”。当然免不了的也有很多“失败”的语言,其中一个最著名的就是,比尔盖茨在上世纪80年代说的“640k ought to be enough for anyone”,也就是“640k内存对哪个人来说都够用了”。那个年代,微软开发的还是DOS操作系统,程序员们还在绞尽脑汁,想要用好这极为有限的640k内存。而现在的电脑都是8G以上了,...转载 2019-06-17 15:57:03 · 1362 阅读 · 0 评论 -
深入计算机组成原理(十二)理解电路:从电报机到门电路,我们如何做到“千里传信”?
我们前面讲过机器指令,你应该知道,所有最终执行的程序其实都是使用“0”和“1”这样的二进制代码来表示的。上一讲里,我也向你展示了,对应的整数和字符串,其实也是用“0”和“1”这样的二进制代码来表示的。那么你可能要问了,我知道了这个有什么用呢?毕竟我们人用纸和笔来做运算,都是用十进制,直接用十进制和我们最熟悉的符号不是更简单么?为什么计算机里我们最终要选择二进制呢?这一讲,我和你一起来看看,计算...转载 2019-06-21 16:37:18 · 1048 阅读 · 0 评论 -
深入计算机组成原理(八)ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
过去的三节,你和我一起通过一些简单的代码,看到了我们写的程序,是怎么变成一条条机器指令的;if…else这样的条件跳转是怎么样执行的;for/while这样的循环是怎么执行的;函数间的互相调用是怎么发生的。既然我们的程序最终都被变成了一条条机器码去执行,那为什么同一个程序,在同一台计算机上,在Linux下可以运行,而在Windows下却不行呢?反过来,Windows上的程序在Linux上也是不能...转载 2019-06-12 09:54:29 · 529 阅读 · 0 评论 -
深入计算机组成原理(二十七)SIMD:如何加速矩阵乘法
上一讲,我们讲解了CPU里的黑科技,超标量技术和超长指令字技术。超标量技术能够让取指令以及指令译码也并行进行;在编译的过程,超长指令字技术可以搞定指令前后的依赖关系,使得一次可以取一个指令包。不过,CPU里的各种神奇的优化我们还远远没有说完。这一讲里,我们讲一讲最后两个提升CPU性能的架构设计。它们分别是,超线程技术以及可能没有那么熟悉的单指令多数据流技术。超线程:Intel多卖给你的那一倍...转载 2019-09-22 10:50:49 · 4118 阅读 · 7 评论