CPU常被人们形象地比喻成计算机的大脑,无论是大块头的台式机或是小巧玲珑的笔记本电脑,都是由一块小小的CPU芯片在控制。本文将追溯CPU的起源和发展,并一步步揭开其内部的奥秘。
CPU的发展历史
CPU是Central Processing Unit(中央处理器)的简称,它负责执行指令和计算,控制着计算机的所有组件。CPU从无到有,从弱小到强大,经历了漫长发展过程,其间发生了无数的故事,这里我们主要列出CPU发展史上一些重要的里程碑事件(为行文方便,本文中“CPU”和“处理器”同义)。
1823年,瑞典化学家贝采尼乌斯发现了硅。硅的英文名为Silicon,化学符号为Si。硅的发现对现代计算机的发展影响巨大,它是用于生产晶体管的半导体材料,而晶体管则是CPU的关键构建块。硅晶体管使强大且节能的CPU的开发成为可能,从而实现了现代计算。一般人印象中的CPU是一个带有许多针脚的金属块,实际上这个金属块只不过是CPU的散热器和保护壳(IHS,Integrated Heat Spreader),真正的CPU芯片只是中间夹层中的那一小块五彩斑斓的硅片(图1)。

图1 英特尔Core 2 Duo透视图,上层是HIS保护壳,下层是PCB板,夹在中间的是硅芯片
1903年,尼古拉·特斯拉为“AND Gates(与门)”申请了专利。门是计算机和其他电子设备中使用的电气逻辑电路。与门是逻辑门之一,它接受两个或多个输入,并且仅在所有输入都为真时才产生输出。与门是计算机中所有逻辑运算的基础。正是逻辑门的实现使得晶体管的发明成为可能(图2)。

图2 七种基本逻辑门符号及其真值计算
1947年,贝尔实验室的科学家约翰·巴丁、沃尔特·布拉顿和威廉·肖克利发明了第一个晶体管,并于1948年获得专利。这项发明彻底改变了现代计算,并为更小、更强大的计算机铺平了道路。如今,晶体管几乎用于所有电子设备,它是现代CPU实现高性能和低功耗的保证。逻辑门和晶体管从软硬两个方向促进了集成电路(IC)的发展,用于制造复杂的数字电路。1958年,第一个实用集成电路由罗伯特·诺伊斯和杰克·基尔比在硅片上实现。1960年,IBM于纽约建立了第一个用于大规模生产晶体管的工厂。

图3 世界上第一块实用硅集成电路
1968年,罗伯特·诺伊斯、戈登·摩尔和安迪·格鲁夫共同创建英特尔公司。1971年,英特尔发布了一款4位的CPU——即4004处理器,它是一个单片CPU,在一块小型芯片内集成了2250个晶体管,每次能够处理4位数据,每秒运算6万次。英特尔4004也是世界上第一个通用微处理器(图4、图5)。其后,英特尔接连在1972年推出8008处理器,1974年推出8080处理器。1978年,英特尔推出iAPX86处理器,也即8086,这是英特尔的第一款商用16位CPU,正式开启了x86处理器时代。1979年期间,英特尔和摩托罗拉曾有过微处理器之战,摩托罗拉68000对决英特尔8086(及其后的80286),前者应用于Apple Macintosh和Amiga计算机中,一度非常流行。

图4 英特尔4004处理器外观

图5 英特尔4004处理器集成了2250个晶体管
1991年AMD推出AM386微处理器家族,1995年Cyrix发布Cx5x86处理器,都对英特尔造成很大冲击。AMD公司的创建仅比英特尔晚一年,一直是英特尔强有力的竞争对手。Cyrix也和英特尔因为专利侵权的问题打了多年的官司。英特尔在1993年3月正式发布奔腾处理器(图6,又称P5或i586,1992年已完成),作为对竞争对手们的一种反击。奔腾处理器是英特尔最成功和最知名的产品之一,兼容该公司之前的x86系列处理器,在台式机和笔记本电脑市场都取得了极大成功。

图6 英特尔奔腾处理器
1998年,英特尔推出赛扬系列处理器,这是英特尔面向低成本个人电脑的品牌,主要为了应对Cyrix 6x86、AMD K6和IDT Winchip等竞争产品,抢占低端市场。赛扬虽然不如英特尔的高端产品强大,但对于那些不需要英特尔高端处理器性能的人来说,它们是一个负担得起的选择。

图7 英特尔赛扬初代处理器
2005年,AMD发布了其首款双核处理器Athlon 64 X2,该处理器基于AMD的K8架构,主要是为了与英特尔的奔腾D处理器竞争,并开启了桌面处理器全面向64位过渡的先河。很快英特尔进行了反击,于2006年发布其64位的桌面双核处理器Core 2 Duo,并正式取代奔腾D成为英特尔处理器新的产品标准。

图8 英特尔Core 2 Duo处理器
2008年英特尔发布Core i7,2009年发布Core i5,2010年推出作为Core i5精简版的Core i3,至此英特尔Core i系列产品线完成高、中、低三级市场的覆盖,并每隔一年推出一代更新,到2022年已完成13代更新。需要注意的是,一般来说Core i3不如Core i5, Core i5不如Core i7,这只是就同一代产品比较而言。不同代的产品,比如初代的Core i7和第12代的Core i3相比,后者比前者不知要强出多少倍。另外,Core i系列中,i9芯片是从2017年才开始加入的。
科技在发展,当我们阅读此文时,CPU的历史仍在继续书写。

图9 英特尔2022年新品Core i9-13900K处理器
CPU的内部结构
CPU芯片上集成了大规模复杂的电路,可以把它看作是一个由很多小块组成的复杂机器,这些小块从功能的角度大致可以划分成三大部分:算术逻辑单元、存储单元和控制单元(图10)。

图10 现代计算机系统概念图
算术逻辑单元(ALU,Arithmetic Logic Unit)
CPU的主要功能就是运算,这正是通过算术逻辑单元ALU实现的。ALU电路内部由算术单元(AU)和逻辑单元(LU)组合而成,可对两个输入值(操作数)执行算术或逻辑运算并产生一个输出值(图11)。算术单元负责对二进制数执行加减乘除等数学运算,而逻辑单元执行与、或、非等逻辑运算,以及对两个操作数进行比较等。另外ALU还具备位移功能,将输入的操作数向左或向右移动从而得到新的操作数。
不只是CPU,其他如图形处理器GPU等几乎所有的微处理器中,ALU都是最基本的组件。

图11 ALU操作示意图
存储单元(MU,Memory Unit)
算术逻辑单元ALU在执行计算的时候,需要读取存储在寄存器中的操作数,计算结果则保存到累加器中(也是一种寄存器),ALU执行的命令则来自指令寄存器。比如,当将两个数字相加时,一个数字放在A寄存器中,另一个放在B寄存器中,ALU执行加法后将结果放入累加器中。如果是逻辑操作,则把要比较的数据放进输入寄存器中,比较的结果1或0放入累加器中。无论是逻辑运算还是算术运算,累加器内容都会被放入缓存中(图12)。

图12 CPU简化概念图
上述的寄存器(Register)和缓存(Cache)即CPU内部的存储单元,用于存储供CPU访问的数据和指令,以及存储任何计算或任务的中间结果。处理的最终结果也会被保存到存储单元中,然后将这些结果发布到输出设备提供给用户。不过CPU内部存储单元的容量极为有限,大量数据只能保存在CPU之外的RAM(随机存取存储器)芯片中,就是我们平常所说的内存,也被称之为主存。存储器单元负责从主存中检索并临时存储数据,负责管理CPU和主存之间的数据流。RAM芯片在关机断电后数据会清零,所以就又有了硬盘、软盘等其他的存储设备,称之为辅存(图13)。

图13 相对而言存储设备的速度和容量成反比,寄存器最快容量最小,反之辅存最慢容量最大
控制单元(CU,Control Unit)
控制单元负责从主存中检索和选取指令,对其进行解码,然后发出适当的控制信号,指导计算机的其他组件(如算术逻辑单元、存储单元、输入/输出设备等)执行所需的操作。控制单元自身并不执行程序指令,它只是输出信号指示系统的其他部分如何做。如果说CPU是计算机的大脑,那么控制单元就是CPU的大脑。
总线(Bus)
CPU内部的算术逻辑单元、存储单元、控制单元等,依靠总线连接为一体,而CPU与外部组件的通信与控制同样靠总线实现。简单来说,计算机总线就是连接计算机系统中各种硬件组件的电线,其物理表现形式可以是线缆(如硬盘线)也可以是PCB板上的印刷线路。
作为计算机系统中的通信链路,计算机总线向系统中的各种硬件组件发送数据、地址、控制信号和电源。根据位置、用途和功能的不同,计算机总线可以有很多分类。比如连接处理器、RAM内存、显卡、硬盘等内部设备的称之为内部总线(一般与CPU直接相连或通过北桥芯片相连),连接显示器、键盘、鼠标、打印机等外部设备的称之为外部总线(一般经由南桥芯片相连)。另外依据总线所连接的组件类型,可以分为系统总线、扩展总线、输入/输出总线等。
更通用的一种分类,是依据总线传输的数据类型进行划分,可以分为数据总线、地址总线、控制总线等三大类。在CPU内部,算术逻辑单元与存储单元之间主要以数据总线相连,传输数据;控制单元则通过控制总线发送信号指示CPU各组件进行相应的操作(图14、图15)。

图14 计算机总线系统示意图

图15 英特尔8085微处理器总线结构
CPU的工作流程
我们用C++、Java、Python等编程语言编译好的程序文件(机器码),保存在硬盘等存储介质上,当操作系统运行这些程序的时候,首先会将它们加载到系统内存中。程序文件实际就是一系列的指令,CPU从内存中检索并读取程序指令,然后通过控制单元对程序指令进行译码操作,使其转化为CPU能够“读懂”的指令格式。接下来控制单元向算术逻辑单元ALU发送信号,ALU即依据指令读取操作数并进行相应计算,其计算结果经由CPU内的存储单元返回内存中。在以上过程中,CPU执行了四个重要步骤:
1、取指令阶段(Instruction Fetch)
2、译码阶段(Instruction Decode)
3、执行计算阶段(Instruction Execute)
4、回写内存阶段(Writeback)
以上四个步骤是完整执行一条指令的过程,称之为指令周期(Instruction Cycle)。这一过程循环往复地进行,直到程序结束(图16)。

图16 指令周期
说起来简单,实际过程却很复杂。单以取指令这一步骤来说,它本身就又由多个微操作组成:
1、程序计数器初始化指针指向内存地址;
2、内存地址被装载到CPU的地址寄存器中;
3、CPU接下来检索该内存地址中的数据,并将其载入数据寄存器中;
4、如果数据包中包含的是指令,将其装载到指令寄存器中;
5、程序计数器递增加1,指向下一个内存地址;
6、指令寄存器中的指令被传入CPU的控制单元中;
7、以上步骤循环往复地进行。
接下来的译码、执行等阶段,也都有着各自复杂的操作,限于篇幅就不详细介绍了