了解处理器内部硬件架构,有助于理解软件运行原理,因为这两者本身相辅相成,相互依存。就像枪和狙击手,枪的操作和外形设计都是要根据人体工学,让人不仅操作容易,而且携带也要轻便,做到能随时射出子弹击中目标,枪赋予了人的使命。反过来,狙击手要根据枪的操作和外形设计,找到发挥其最大命中率的方法,做到人枪合一,人赋予了枪的生命.
记得2002年末我在中关村攒了台电脑,当时的最新的桌面cpu是奔4-2.4b,我一咬牙就买它了,当时可花了兄弟我1600块呢,话说当时一个月只挣1500块。其中2.4是指cpu的主频是2.4G。您看,对于cpu的选择,我当时只关注主频,根本不关注其它参数,其实主要是不懂其它参数,哈哈。后来才懂了cpu中另一个非常重要的技术,这就是流水线。
说到流水线,也许您脑子中马上联想到:工厂里一个穿着蓝色工作服的工人,站在像传送带一样的工作台前紧张而有节奏的工作。也许您会问,你怎么知道我是这么想的?哎……电视里都这么演的……没错,这就是流水线。可是这个例子毕竟太遥远,并不是所有同学都在工厂里做过流水线工人,咱们还是拿生活中的例子说事。
大伙儿都有租房子的经历吗?如果没有也没关系,重点不是租房子,我要说的是像我等北漂一族,为了充分利用房子里狭小的空间,肯定用锤子往墙上砸过钉子,您懂的,可以挂东西嘛^_^。
从宏观上看,砸钉子可以分两个步骤:
- 取钉子
- 砸钉子
假设每一步都占用1秒,钉钉子这两个步骤下来是2秒,如果顺序执行这两个步骤,一分钟可以砸30个钉子。过程如表
以上是以串行顺次的方式来砸钉子,不过这种串行的效率实在有限,如果改为并行的方式砸钉子,效率必然大大提高。
生活中处处是并行的例子,最为典型的并行系统就是咱们的身体。比如心脏在为身体泵血的时候,肺同时在保持呼吸为身体供氧,小肠也同时在蠕动,为人体汲取养分。这些器官的活动都是并行的,并不是在心脏跳动完之后,小肠再蠕动,它们的工作是彼此独立无关联的。人体内部的器官虽然是在并行工作,但他们做为一个整体——人,却同一时间只能做好一件事,所以一心不能二用。
如果以“并行”的方式,也就是同时砸钉子,那得多增加人手才行,一个人同时只能做一件事,并且要么拿钉子,要么砸钉子。下面给砸钉子的工作增加个人手,专门给取钉子,这样一个人取钉子,另一个人专门来砸钉子,取钉子和砸钉子的工作重叠进行,过程如表:
上面的并行我加了引号,因为它并不是真正的并行,这是在重叠执行。重叠的意思是说在同一时间内同时完成两个钉子的部分工序,拿第2秒来说,第一行的“砸钉子”是砸的第一个钉子,第二行的“取钉子”取的是第二个钉子,做的并不都是第一个钉子的工序。真正的并行是两个人自己取自己的钉子,然后自己砸自己的钉子,各干各的。而我们的例子中,取钉子的人只会取钉子,砸钉子的人也只会砸钉子。
增加了一个人手之后,除第1秒外,每一秒都有“砸钉子”的动作,所以第一分钟内可以砸入59根钉子,在第二分钟以后,每分钟能砸60个。
以上表4-13的过程便是一个流水线的执行过程,由于砸钉子分为两个步骤,所以以上流水线称为二级流水线。
这种情况在cpu中也是一样的,指令执行单元EU是执行指令的唯一部件,一次只能执行一个指令,单核cpu的情况下,只有一个指令处于执行中。cpu中的各部分也是同时只能做一件事,但它们就像身体器官一样,也是在并行工作,相当于多个“人手”。cpu的指令执行过程分为取指令、译码、执行三个步骤。每个步骤都是独立执行的,cpu可以可以一边执行指令,一边取指令,一边译码。cpu中的时序不是秒,对cpu来说,秒就是天文数字。它的时序是时钟周期。按照这三个步骤,其三级流水线如表
以上在第2周期后,都有指令在执行,这是最基本的流水线啦。为了更好的理解以后的分支预测,在此提醒一下大伙儿:虽然在一个时钟周期内cpu同时干了三件事,但一定要清楚,这三件事不属于同一个指令,是三个指令重叠在一起了,这和砸钉子的流水线是一样的道理。同时完成的是当前指令的第三步、下一条指令的第二步,第三条指令的第一步。cpu中每条指令必须经过取指、译码、执行三步才算完成。
cpu是按照程序中指令顺序来填充流水线的,也就是说按照程序计数器PC(x86中是cs:ip)中的值来装载流水线,当前指令和下一条指令在空间上是挨着的。如果当前执行的指令是jmp,下一条指令已经被送上流水线译码了,第三条指令已经被送上流水线取指啦。仔细想想看,其实这个流水线没用了,因为cpu早已经跳到别处去执行了,第二、三条指令用不上了,所以cpu在遇到无条件转移指令jmp时,会清空流水线