代码揭秘
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.2 CPU很好很强大

1946年,大科学家冯·诺依曼教授发表了名为《电子计算机装置逻辑结构初探》的论文,并设计出了第一台“存储程序”式计算机EDVAC(埃德瓦克),即离散变量自动电子计算机(The Electronic Discrete Variable Automatic Computer)。冯·诺依曼在论文中提出了其著名的“冯诺依曼体系结构”,从而为现代计算机体系结构奠定了基础。冯·诺依曼体系结构理论的要点有二:首先,电子计算机应采用二进制0和1直接模拟开关电路通、断两种状态,用于表示数据或计算机指令;其次,“程序存储,顺序执行”。在冯·诺依曼的设计中,计算机硬件应当由控制器、运算器、存储器、输入设备和输出设备5大部分组成。

半个多世纪过去了,尽管计算机技术已经今非昔比,但现代计算机仍然普遍采用这种体系结构设计和制造。如图1-2所示是现代计算机组成结构示意图。从图中我们可以看到,冯·诺依曼当初设想的计算机5大组成设备仍然完整地保留着。其中,输入设备和输出设备就是图中的外设,它的种类繁多,用以实现不同的功能,如显示器、键盘、鼠标、打印机、扩音器、麦克风等。因为外设种类繁多,所以连接的线缆和端口也是多种多样的。常用的连接线包括PCI总线、火线、USB线缆等;常用的端口包括串口、并口和USB端口等。

图1-2 计算机组成结构示意图

存储器在现代计算机中主要包括:硬盘、光存储设备(CD或者DVD等)、RAM、ROM和CMOS等。

如果按照存储位置而言,计算机存储器是有内外之分的,也就是说,存储器可以分为内存(内部存储器)和外存(外部存储器)两种。其中,位于主板以外的存储器即为外部存储器,例如硬盘、磁带和光存储设备都属于外存;位于主板以内的存储器即为内部存储器。内存通常等同于主存储器(主存),但还有其他形式。广义上的内部存储器应该包括RAM、ROM和CMOS等,其中ROM(只读存储器)和CMOS(互补金属氧化物半导体)用来存储计算机启动时所需的引导信息,存储在它们上面的数据在计算机掉电后不会丢失。

这里所讲的内存主要是指RAM(随机存储器)。RAM分为两类,即DRAM(动态随机存储器)和SRAM(静态随机存储器)。其中,DRAM又包括很多具体的类型,如SDRAM、DDR SDRAM和RDRAM等。准确地说,DRAM才是用来作为计算机中主存使用的RAM,而这里所说的主存就是指使用DRAM来实现的内存。

除了主存以外,内存的另外一种重要形式就是缓存(Cache)。由于SRAM的速度比DRAM要快很多,但容量较小,且价格比较昂贵,因此一般都用来作为缓存(Cache)使用。

控制器和运算器从狭义上可以理解为中央处理器中的控制单元(Control Unit)和算术逻辑单元(ALU)。因为在计算机的其他芯片中也可能存在控制器和运算器,如显示卡。这里所说的控制器和运算器就是指CPU上的控制单元和算术逻辑单元。

CPU(中央处理器)是计算机的核心。当程序运行时,具体的指令就存储在主存中,当CPU需要执行指令时,它就会从主存中取出将要执行的指令。从RAM中取出指令并翻译它们的意思,然后将它们分别派送到下一个处理单元中,这就是控制单元所需要完成的工作。

CPU中的另外一个器件——算术逻辑单元则执行简单的算术计算和逻辑计算功能。

当一条指令到来时,CPU都会执行4个步骤的工作。这4个步骤分别是:

① 获取指令。控制单元从RAM中取出指令。

② 翻译指令。控制单元对指令进行解码,并根据解码的结果将必要的数据从RAM中转移到ALU中。

③ 执行指令。控制单元指导ALU执行必要的逻辑或算术运算。

④ 存储结果。计算结果被存到RAM中。

为了使读者更好地理解CPU执行一条指令的具体过程,下面以一条加法指令为例来进行说明。假设A和B是两个数字,现在要求A与B的和R。图1-3演示了CPU执行这条指令的具体过程。首先,控制单元从RAM中取出指令,并对指令进行了翻译。然后,控制单元指导ALU进行加法运算,并告诉ALU从RAM中取出数字并分别存入两个寄存器中。ALU将寄存器1和寄存器2中的数字经累加器操作后得到结果R,并将R存储到RAM中。整个加法过程就执行完毕了。

图1-3 CPU执行指令过程

CPU好比一个永远喂不饱的饕餮,它的处理速度极快,然而主存的速度尽管要比外存快得多,但相比于计算机的处理速度而言,主存显然是慢的。由于主存无法以期望的速度向CPU传递数据,以至于计算机系统产生了“瓶颈”。如果不能找到有效化解或缓解CPU高处理能力和主存低传输速度之间矛盾的方法,那么单纯提高CPU的处理速度就是徒劳无益的。

为了提高CPU的利用率,从而提升计算机的整体运作效率,人们设计了缓存这一结构。回到图1-2中,我们发现微处理器中除了有CPU之外,还有一个重要的部件,那就是缓存(Cache)。缓存是一个特殊的高速内存,前面已经讲过,缓存通常是使用SRAM制成的。缓存的目的是为了给出逼近最快存储器的速度,同时以比较便宜的半导体存储器的价格提供一个大的存储容量。注意这里的所谓大的存储容量是相对于CPU中的寄存器而言的,而更快的速度则是相对主存而言的。换句话说,缓存提供了3种特质:最大程度上逼近寄存器的速度,但又较寄存器而言容量更大,以及较寄存器而言价格更加便宜(尽管缓存的单位价格要比主存贵许多)。

尽管我们已经分析了缓存的诸多特点,但事实上仍然存在两个疑问困扰着读者。首先,尽管缓存要比主存快得多,但它的相对容量却比主存低很多,那么这种小容量、高速度的存储器怎样破除计算机性能上的瓶颈呢?其次,缓存是通过什么途径来缓解CPU高处理能力和主存低传输速度之间矛盾的呢?

其实,上述两个疑问归根结底可以转化为一个问题——那就是缓存的设计原理。这其实涉及调度和映射的问题。简而言之,就是为了加快处理器执行指令的速度,科学家们设计了缓存这个结构用以存储那些最近被使用的数据。缓存之所以能够加快计算机的运行速度,主要在于被称为“访问局部性”的原理,这个原理的主要内容是认为计算机中刚刚被用过的数据很有可能会被再次用到。这是因为在程序执行过程中,处理器访问存储器中的指令和数据倾向于成簇。程序通常包含许多迭代循环和子程序,一旦进入了一个循环或者子程序,就需要重复访问一小组指令。同样,对于表和数组的操作,包含存取一簇簇的数据。在一长段时间内,使用的簇是变动的;而在一小段时间内,处理器主要访问存储器中的固定簇。这就是设计缓存的基本原理。如果读者对这一解释不能完全接受,那么也不要紧,这些问题在本书的后续内容中将有十分详尽的论述,到那时相信读者就会明白其中的道理了。

此外还需补充说明的是,缓存是有分级结构的。一级缓存,或称主要缓存,通常与CPU做在一起,这样做的目的是为了给CPU提供最快的数据访问速度。除了一级缓存以外,还有一个稍慢一点的缓存,即二级缓存,或称辅助缓存,它位于主存和CPU之间,当然有时候它也可能位于CPU之上。如果CPU在缓存中无法找到将要处理的数据,那么它就会直接从主存中取得数据。CPU与存储区域之间的物理距离也反映出读取数据和指令的快慢,从一级缓存中获得数据要比从二级缓存中获取数据快;同样,从二级缓存中获取数据要比从主存中获取数据快。