1967 年初,Taylor 和 Roberts 在密西根州安阿伯市召开了一次联网试验研讨会,请各路研究人员对这个问题发表见解。
在会上,多数人对 Roberts 的 ARPANET 计划持怀疑态度。所有与会者争论的焦点,无非是如何让自己的大型机与其它机器直接通讯。不同的机器硬件和软件互不兼容,这样做不仅困难重重,而且管理十分不便。
Roberts 在 W.Clark(林肯实验室的计算机专家,J.C.R.Licklider 的挚友)的建议下,认识到应该设计出一种小型专用电脑,让它充当信息传输和转换的中介物。
实际上,Clark 以前就发明了工具电脑 LINC(实验室工具计算机的英文缩写)。
LINC拥有1KB内存,而且成本不超过2.5万美元。除了缺少微处理器之外(当时微处理器尚未被发明),它实际上就是一台个人计算机。由于资金不足,Clark的LINC计划并没有最终实现,但类似于LINC这种简单的计算机完全符合条件去解决ARPANET设计中的这道难题。
按照 Clark 设想,所有提供资源的大型主机都不必亲自参与联网,而在网络与主机之间插入一台中介电脑。中介电脑只需做两件事:第一,接受远程网络传来的信息并转换为本地主机使用的格式;第二,负责线路调度工作,也就是说,为本地传出的信息规定路线,然后传递出去。这样一来,在网络上实际相互“对话”的只是统一的中介计算机。
这个建议让 Roberts 十分兴奋,这个完美的方案从根本上解决了计算机系统不兼容的问题。回到华盛顿后,Roberts 立即拟定了一份备忘录,将中介电脑正式命名为“接口信号处理机”(英文缩写 IMP)。而 IMP 就是我们今天所熟悉的网络路由器(Router)的雏形。
1967 年当年 10 月,美国计算机学会在田纳西州盖特林堡召开年会。Roberts抓住这次难得的机会,在会议上宣读了有关ARPANET的论文。虽然,在论文中提到在ARPANET中可以使用IMP来实现互不兼容的电脑联网,但网络通讯可靠性差的缺陷还是让他感到不安。此外,ARPA 要求他建设的是一个能够经受核攻击的通信网络。 当时正处于冷战的最紧张时期,像电话系统那种高度集中式的网络,即使主要系统的一小部分遭到损害,所有的长途通信都会被中断。至止,Roberts还没有找到一个既能高效传送信息,又能承受攻击的理想办法。
在会议中,英国科学家 Donald. Davies 的研究成果给了 Roberts 启发。
Davies提出的分组交换技术,使Roberts预感到难题即将解决。实际上,在Davies提出分组交换技术的头两年,美国兰德公司的PaulBaran已经提出类似的理论。于是,Roberts在会后找出PaulBaran提出的关于分组交换技术的报告,进行反复研究。不久后,他还亲自上门拜访Baran,并聘请他担任ARPANET计划的非正式顾问。
至此,ARPANET 计划所必需的技术理论已具备,接下来的事就是要将这些理论的东西变成事实。众所期望的“天下第一网”即将诞生。
1967年备忘录IPTOPI会议上,LarryRoberts★在美国密西根州安阿伯市召开的ARPA组织了关 ARPANET 设计方案的讨论。
★美国兰德公司、英国国家物理实验室、美国国防高级研究计划局参预网络包交换技术的人员召开第一次会议。
★DougEngelbart申请了鼠标专利。 ★ScientificDataSystems推出SDS940。《福布斯》杂志把这些超级计算机称为“计算快艇”,它们的意义超出了售货赚钱的范畴。
★美国政府命令美国家标准局解决联邦机构对使用两位还是四位日期的问题的争论,在五角大楼的压力下,国家标准局保留了两位标准。
★Alton Doody 和 William Davidson 在《哈佛商业观察》上发表题为《零售业的下一次革命》的文章。该文提出了电子商务概念,即用户使用与中心分配设施相连接的、计算机一类的控制台,利用电子手段划拨资金。
1968 群雄争夺,以小取胜1968 年 6 月 3 日,信息处理技术办公室(IPTO)向国防部高级研究计划局(ARPA)递交了《资源共享的电脑网络》研究计划。时间过去不到20天,ARPA就正式批准了这个计划,预算金额高达50万美元。而这时,Roberts首先要解决的就是接口信号处理机(IMP)的设计问题。
8月,Roberts代表ARPA的IPTO正式提出了课题,要求设计并制造出网络通信的关键设备——包交换装置。他们把这种装置称为“接口信号处理机”(IMP:InterfaceMessageProcessor)。希望通过IMP来研究在小型的、交互连接式的电脑上进行通信的系统。这个课题的具体要求是制造出给4个节点用的4个IMP,实现这4个节点之间的联网,并且设计出今后可以容纳17个网站的电脑网络。
为了广泛地筛选适合做这项工作的公司,Roberts 代表信息处理技术办公室发出了 140 份“项目招标”。这下子引来了几十家对该项目感兴趣的公司。
其中就有 IBM 这样实力雄厚的大公司。不过,IBM 给出的方案是使用他们自己生产的360MODEL50型电脑来作为IMP。尽管其性能非常优越,但价格太高。要知道,国防部对IMP的需求量是很大的,每一个主机都要配上一台这样的机器。要是都用360MODEL50的话,代价也实在太大了。另外,AT&T给出的方案与IBM的相似,因此也遭到否决。
ARPA 经过大会招标之后选择了 12 份标书,再经过反复考虑,很快把范围缩小到4家公司。可是完全出乎意料的是,1968年12月,马萨诸塞州的BBN公司在FrankHeart领导下的一个小组正式得到了ARPA的IMP项目。而这规模很小的公司,当时职工不过600余人,在FrankHeart领导的小组也不过10来个人,的确让人觉得有些不可思议。事实上,ARPA选择Frank小组的理由是,他们选择了一种名叫HoneywellDDP-516的微型计算机作为IMP的原型,该机不仅价格适当,而且坚固耐冲击,完全胜任ARPA规定的战争环境要求。
Frank 小组要把 DDP- 516 电脑改造成一台谁也没有见过的机器。 与当时所有的电脑一样,DDP-516机既没有硬盘,也没有软盘,由磁芯阵列充当存储装置,穿孔纸带阅读机输入程序,用汇编语言设计软件。以如此简陋的设备完成如此艰巨的使命,他们面临着无数的困难和挑战。除此之外,Frank小组还要与网络各节点相互协调,一个一个解决接口问题。千钧重担压在BobKahn肩上,许多时间他都伴随着电话生活,起草出一份精确明晰的接口技术参数说明书。在此期间,他的伙伴们也克服种种困难,按期完成了复杂的接口设备制作任务。
而为了以后的联网实验,Roberts 在美国西海岸选择了 4 个节点作为实验对象。
第一个节点选在加州大学洛杉矶分校(UCLA),因为 Roberts 他过去麻省理工学院的同事 Leonard Kleinrock 教授在该校主持网络研究。
第二个节点选在斯坦福研究院(SRI),那里有 D.Engelbart 等一批电脑网络先驱人物。
此外,加州大学圣巴巴拉分校(UCSB)和盐湖城犹他大学(UTAH)分别被确定为第三和第四节点。这两所大学都是电脑绘图研究的先驱,RobertTaylor的前任IvanSutherland教授此时正任教于UTAH另外参加联网试验的机器包括 Sigma-7、IBM360、PDP-10 和 XDS-940 四种大型计算机。
1968年备忘录 ★6月3日,信息处理技术办公室(IPTO)向ARPA提交建立网络的计划。 ★美国斯坦福大学的JoshuaLederberg开发出第一个医疗诊断程序Dendral。
★以前在Digital负责PDP-8开发的主任工程师EdsonDeCastro和Digital 的其他几位工程师创办了 Data General 公司。
★9月28日,RaymondSchoolfield赤身露体站在亚特兰大IBM公司总部大楼的前面,手里举着一块牌子,上面写着“计算机可恶”。
★Edsger Dijkstra 提出了“结构化编程”的概念,并且声称不应再用“GOTO”语句。
★12月,BBN公司由FrankHeart领导的小组得到ARPA的接口信息处理机(IMP)的项目
1969 互联网诞生一切准备妥当之后,ARPA 计划于 1969 年正式联网实验。既然是联网,就至少应该是两台电脑,也就是两个节点相连。可是 ARPANET(阿帕网)的实验却是从一个节点开始的。
其实,ARPANET 最早的实验是从主机和接口信号处理机(IMP)的连接开始的。所以,只算得上是一个节点。在此期间,最早提出包交换理论,并曾经对Roberts产生过影响的Kleinrock已经到加州大学洛杉矶分校工作。Roberts给了他一个合同,在加州大学建立一个由他主持的“网络评测中心”(NetworkMeasurementCenter)。因此,建立ARPANET的工作,也就围绕加州大学洛杉矶分校(UCLA)展开,“网络评测中心”则被选来当作ARPANET的第一个节点。
1969年8月30日,BBN公司给加州大学洛杉机分校(UCLA)送来了IMP。
他们把这台用HoneywellDDP-516小型机改装的IMP与加州大学洛杉机分校的SDSSigma7型电脑连在一起。
在网络上的第一个节点安装调试成功后不久,BBN 公司又给斯坦福研究院(SRI)的 XDS-940 型电脑连上了 IMP,由此完成了 ARPANET 上第二个节点的安装工作。
一个月后,斯坦福研究院的主机(XDS-940)和加州大学洛杉矶分校的主机(Sigma 7)已经和各自的 IMP 连通起来。
10 月 29 日晚,Kleinrock 教授命令他的研究助理、加州大学洛杉矶分校的大学生 C. Kline 坐在 IMP 前,戴上头戴式耳机和麦克风,以便通过长途电话随时与斯坦福研究院终端操作员保持密切联系。
据 Kline 回忆,教授让他首先传输的是 5 个字母——“LOGIN”(登录),以确认分组交换技术的传输效果。根据事前约定,他只需要将“LOG”三个字母传送出去,然后由斯坦福研究院的机器自动产生“IN”,并合成为“LOGIN”。22 点 30 分,他带着激动不安的心情,在键盘上刚敲入两个字母“LO”后,IMP仪表显示,传输系统突然崩溃,通讯无法继续进行下去。世界上第一次互联网络的通讯试验,仅仅传送了两个字母“LO”!但它真真切切标志着人类历史上最激动人心的那一刻到来了!由于没有照相机摄影留念,Kline 把这一重大事件发生的准确时刻记录在他的“IMP LOG”(工作日志)上,并签上了自己姓名的缩写(CSK),作为互联网络诞生永久的历史见证。
数小时后,系统完全修复,Kline 不仅传出了“LOGIN”,而且传送了其它资料和数据。有趣的是,第一次通过 IMP“握手”的两台大型主机,却分别使用不同的“语言”。一台使用的是 ASCII 码,另一台使用的却是 EBCDIC 码。
不久后,加州大学圣巴巴拉学院(UCSB)的 IBM 360/75 电脑和盐湖城犹他学院(UTAH)的 DEC PDP-10 型电脑也都分别连接上了 IMP。这两个学院之间有图形方面的合作项目。
从当时的草图中我们可以看出,当时所谓的“互联网”实际上是在加州大学洛杉矶分校、加州大学圣巴巴拉学院和斯坦福研究院之间完成的。而犹他学院则是通过斯坦福研究院和其它节点连接的。
就这样,按照ARPA的计划,由4个节点构成的ARPANET正式投入运行。虽然当时用作接口机的HoneywellDDP-516型小型机的内存只有12KB,从加州大学到斯坦福研究院之间的信号传输速率只有50Kbps,但是无论如何,这四台电脑的连接已经具有形成今天的Internet的雏形!
1969年备忘录 ★ARPANET于10月29日22:30诞生。 ★IBM不再将软件与硬件捆绑销售,允许客户分开购买它的软件和硬件,从而建立了软件市场。
★DataGeneral公司推出16位Nova小型计算机。 ★Xerox出资10亿美元收购ScientificDataSystems公司。 ★NiemanMarcus公司的假日产品目录推出了“Kitchen计算机系统”,该系统包含Honeywell公司的H-316小型计算机和键盘控制台,价格为1万美元。
★AT&T贝尔实验的程序员KennethThompson和DennisRitchie将UNIX操作系统发展到 DEC 的微型计算机上。
70 年代初的美国深陷在越南战场的泥潭中,不能自拔,而国内的反战呼声一浪高过一浪。美国到了二战后第一个内外交困的年代。虽然这样,但是国内的各种科学技术还是在飞速地发展。ARPANET 在不断地壮大。
1970 年的 ARPANET 已初具雏形,并且开始向非军用部门开放,许多大学和商业部门开始接入。但是它只有四台主机联网运行,甚至连局域网(LAN)的技术也还没有出现。也许,当时的那种联网在今天看来实在是太初级了。当时用作接口机的 Honeywell DDP516 型小型机的内存只有 12K。
ARPANET 在洛杉矶的加利福尼亚州大学洛杉矶分校、加州大学圣巴巴拉分校、斯坦福大学、犹他州大学四所大学的 4 台大型计算机采用分组交换技术,通过专门的接口信号处理机(IMP)和专门的通信线路相互连接。为了把这四个不同型号、使用不同操作系统、不同数据格式、不同终端的计算机连在一起实现相互通信和资源共享,有许许多多的人为此煞费苦心、艰辛探索,付出了无数的心血。其中包括有“阿帕网”之父的拉里·罗伯茨。
伴随着 ARPANET 的成长,第一份有关最初的 ARPANET 主机-主机间通信协议的出版物,由C.S.Carr、S.Crocker和V.G.Cerf撰写的“HOST-HOSTCommunicationProtocolintheARPANetwork”,发表在了AFIPS的SJCC会议论文集上。这份出版物在当时成了不少工程师的“掌中宝”。当然,政府的支持是早期ARPANET能够顺利发展的主要动力,以“保持美国在技术上的领先地位,防止潜在对手不可预见的技术进步”为首要职责的DARPA(国防高级研究计划署)主动把1969年的合同截止日期延续到了1970年12月31日。当初合同的总金额是50万美元,而实际执行的时候大约增加了一倍,在1970年与BBN公司新签定的合同中,金额则达到了200万美元。从此以后,ARPANET的规模开始不断扩大。
AT&T公司在UCLA和BBN公司之间建成了第一个跨国家连接的56Kbps的通信线路。这条线路后来被BBN公司和RAND公司的另一条线路所取代。第二条线路则连接MIT公司和犹他州大学。
1970 年 12 月,S.Crocker 在加州大学洛杉机分校领导的网络工作小组(NWG)制定出“网络控制协议”(NCP)。他也正是一年多前写出第一个具有历史意义的“征求意见与建议(RFC)的人。最初,这个协议还是作为信包交换程序的一部分来设计的,可是他们很快就意识到关系重大,不如把这个协议独立出来为好。
也在那个时候,天才的 Kahn 也为临时需要而开发过局部使用的“网络控制协议”。由于这个协议是局部使用,就不必考虑不同电脑之间、不同操作系统之间的兼容性问题,因此也就简单的多。虽然“网络控制协议”是一台主机直接对另一台主机的通信协议,实质上它是一个设备驱动程序。一开始的时候,那些“接口信号处理机”被用在同样的网络条件下,相互之间的连接也就相对稳定,因此没有必要涉及控制传输错误的问题。
可是要把各种不同类型、不同型号的电脑和网络连在一起有多么困难。于是很多人都在研究怎样建立一个共同的标准,让在不同的网络后面的计算机可以自由地沟通。
1970年备忘录 ★Digital推出PDP-11/20系列16位小型机。 ★IBM的EdgarCodd发表论述关系型数据库的论文。 ★GeneAmdahl组建Amdahl公司。 ★通用电气公司为NASA开发出第一种飞行模拟程序。 ★TelemartEnterprises公司在美国圣地亚哥市的计算机化食品杂货店开张。购物者利用电话连接到计算机来订购食品;商店后来不得不关门,因超量的电话使计算机过载。
★Honeywell 公司收购通用电气公司的计算机部。
了解 RISC CPU 的工作原理随着去年AMDAthlon的推出,两大CPU厂商Intel和AMD之间的竞争愈演愈烈,几乎每个月都有新的CPU推出,各个媒体和网上也充斥着各种各样的评测性文章。
但是,现在我要问一句:“什么是 CPU?”我相信大多数人并不知道什么是CPU。当然,你可以回答CPU是中央处理器,或者来一句英文:CentralProcessingUnit。是的,没错。但,RISC和CISC是什么?什么是“9路超标量设计”、“20级流水线”?什么是“解码”,为什么Athlon和PIII的解码过程需要的时钟周期大大大于其他的RISC处理器?这些都不是一句“中央处理器”所能够回答的。
本文希望以比较通俗的语言深入介绍一下 CPU 的原理。
一、 指令系统要讲 CPU,就必须先讲一下指令系统。指令系统指的是一个 CPU 所能够处理的全部指令的集合,是一个CPU的根本属性。比如我们现在所用的CPU都是采用x86指令集的,他们都是同一类型的CPU,不管是PIII、Athlon或Joshua。我们也知道,世界上还有比PIII和Athlon快得多的CPU,比如Alpha,但它们不是用x86指令集,不能使用数量庞大的基于x86指令集的程序,如Windows98。之所以说指令系统是一个CPU的根本属性,是因为指令系统决定了一个CPU能够运行什么样的程序。
所有采用高级语言编出的程序,都需要翻译(编译或解释)成为机器语言后才能运行,这些机器语言中所包含的就是一条条的指令。
1、 指令的格式一条指令一般包括两个部分:操作码和地址码。操作码其实就是指令序列号,用来告诉 CPU 需要执行的是那一条指令。地址码则复杂一些,主要包括源操作数地址、目的地址和下一条指令的地址。在某些指令中,地址码可以部分或全部省略,比如一条空指令就只有操作码而没有地址码。
举个例子吧,某个指令系统的指令长度为 32 位,操作码长度为 8 位,地址长度也为8位,且第一条指令是加,第二条指令是减。当它收到一个“00000010000001000000000100000110”的指令时,先取出它的前8位操作码,即00000010,分析得出这是一个减法操作,有3个地址,分别是两个源操作数地址和一个目的地址。于是,CPU就到内存地址00000100处取出被减数,到00000001处取出减数,送到ALU中进行减法运算,然后把结果送到00000110处。
这只是一个相当简单化的例子,实际情况要复杂的多。
2、 指令的分类与寻址方式
一般说来,现在的指令系统有以下几种类型的指令: (1)算术逻辑运算指令算术逻辑运算指令包括加减乘除等算术运算指令,以及与或非异或等逻辑运算指令。现在的指令系统还加入了一些十进制运算指令以及字符串运算指令等。
(2)浮点运算指令 用于对浮点数进行运算。浮点运算要大大复杂于整数运算,所以 CPU 中一般还会有专门负责浮点运算的浮点运算单元。现在的浮点指令中一般还加入了向量指令,用于直接对矩阵进行运算,对于现在的多媒体和 3D 处理很有用。
(3)位操作指令 学过 C 的人应该都知道 C 语言中有一组位操作语句,相对应的,指令系统中也有一组位操作指令,如左移一位右移一位等。对于计算机内部以二进制不码表示的数据来说,这种操作是非常简单快捷的。
(4)其他指令 上面三种都是运算型指令,除此之外还有许多非运算的其他指令。这些指令包括:数据传送指令、堆栈操作指令、转移类指令、输入输出指令和一些比较特殊的指令,如特权指令、多处理器控制指令和等待、停机、空操作等指令。
对于指令中的地址码,也会有许多不同的寻址(编址)方式,主要有直接寻址,间接寻址,寄存器寻址,基址寻址,变址寻址等,某些复杂的指令系统会有几十种甚至更多的寻址方式。
3、 CISC 与 RISCCISC,Complex Instruction Set Computer,复杂指令系统计算机。RISC,Reduced Instruction Set Computer,精简指令系统计算机。虽然这两个名词是针对计算机的,但下文我们仍然只对指令集进行研究。
(1)CISC 的产生、发展和现状 一开始,计算机的指令系统只有很少一些基本指令,而其他的复杂指令全靠软件编译时通过简单指令的组合来实现。举个最简单的例子,一个a乘以b的操作就可以转换为a个b相加来做,这样就用不着乘法指令了。当然,最早的指令系统就已经有乘法指令了,这是为什么呢?因为用硬件实现乘法比加法组合来得快得多。
由于那时的计算机部件相当昂贵,而且速度很慢,为了提高速度,越来越多的复杂指令被加入了指令系统中。但是,很快又有一个问题:一个指令系统的指令数是受指令操作码的位数所限制的,如果操作码为8位,那么指令数最多为256条(2的8次方)。
那么怎么办呢?指令的宽度是很难增加的,聪明的设计师们又想出了一种方案:操作码扩展。前面说过,操作码的后面跟的是地址码,而有些指令是用不着地址码或只用少量的地址码的。那么,就可以把操作码扩展到这些位置。
举个简单的例子,如果一个指令系统的操作码为 2 位,那么可以有 00、01、10、11四条不同的指令。现在把11作为保留,把操作码扩展到4位,那么就可以有00、01、10、1100、1101、1110、1111七条指令。其中1100、1101、1110、1111这四条指令的地址码必须少两位。
然后,为了达到操作码扩展的先决条件:减少地址码,设计师们又动足了脑筋,发明了各种各样的寻址方式,如基址寻址、相对寻址等,用以最大限度的压缩地址码长度,为操作码留出空间。
就这样,慢慢地,CISC 指令系统就形成了,大量的复杂指令、可变的指令长度、多种的寻址方式是 CISC 的特点,也是 CISC 的缺点:因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费点的时间。除了个人PC市场还在用x86指令集外,服务器以及更大的系统都早已不用CISC了。x86仍然存在的唯一理由就是为了兼容大量的x86平台上的软件。
(2)RISC的产生、发展和现状 1975年,IBM的设计师JohnCocke研究了当时的IBM370CISC系统,发现其中占总指令数仅20%的简单指令却在程序调用中占了80%,而占指令数80%的复杂指令却只有20%的机会用到。由此,他提出了RISC的概念。
事实证明,RISC 是成功的。80 年代末,各公司的 RISC CPU 如雨后春笋般大量出现,占据了大量的市场。到了90年代,x86的CPU如pentium和k5也开始使用先进的RISC核心。
RISC 的最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。由于下文所讲的 CPU 核心大部分是讲RISC 核心,所以这里就不多介绍了,对于 RISC 核心的设计下面会详细谈到。
RISC目前正如日中天,Intel的Itanium也将最终抛弃x86而转向RISC结构。
二、CPU 内核结构好吧,下面来看看 CPU。CPU 内核主要分为两部分:运算器和控制器。
(一) 运算器
1、算术逻辑运算单元ALU(ArithmeticandLogicUnit) ALU主要完成对二进制数据的定点算术运算(加减乘除)、逻辑运算(与或非异或)以及移位操作。在某些 CPU 中还有专门用于处理移位操作的移位器。
通常 ALU 由两个输入端和一个输出端。整数单元有时也称为 IEU(IntegerExecutionUnit)。我们通常所说的“CPU是XX位的”就是指ALU所能处理的数据的位数。
2、浮点运算单元FPU(FloatingPointUnit) FPU主要负责浮点运算和高精度整数运算。有些FPU还具有向量运算的功能,另外一些则有专门的向量处理单元。
3、通用寄存器组 通用寄存器组是一组最快的存储器,用来保存参加运算的操作数和中间结果。在通用寄存器的设计上,RISC 与 CISC 有着很大的不同。CISC 的寄存器通常很少,主要是受了当时硬件成本所限。比如x86指令集只有8个通用寄存器。所以,CISC的CPU执行是大多数时间是在访问存储器中的数据,而不是寄存器中的。这就拖慢了整个系统的速度。而RISC系统往往具有非常多的通用寄存器,并采用了重叠寄存器窗口和寄存器堆等技术使寄存器资源得到充分的利用。
对于x86指令集只支持8个通用寄存器的缺点,Intel和AMD的最新CPU都采用了一种叫做“寄存器重命名”的技术,这种技术使x86CPU的寄存器可以突破8个的限制,达到32个甚至更多。不过,相对于RISC来说,这种技术的寄存器操作要多出一个时钟周期,用来对寄存器进行重命名。
4、 专用寄存器专用寄存器通常是一些状态寄存器,不能通过程序改变,由 CPU 自己控制,表明某种状态。
(二) 控制器
运算器只能完成运算,而控制器用于控制着整个 CPU 的工作。 1、 指令控制器 指令控制器是控制器中相当重要的部分,它要完成取指令、分析指令等操作,然后交给执行单元(ALU 或 FPU)来执行,同时还要形成下一条指令的地址。
2、 时序控制器 时序控制器的作用是为每条指令按时间顺序提供控制信号。时序控制器包括时钟发生器和倍频定义单元,其中时钟发生器由石英晶体振荡器发出非常稳定的脉冲信号,就是 CPU 的主频;而倍频定义单元则定义了 CPU 主频是存储器频率(总线频率)的几倍。
3、 总线控制器 总线控制器主要用于控制 CPU 的内外部总线,包括地址总线、数据总线、控制总线等等。
4、中断控制器 中断控制器用于控制各种各样的中断请求,并根据优先级的高低对中断请求进行排队,逐个交给 CPU 处理。
(三) CPU 核心的设计CPU 的性能是由什么决定的呢?单纯的一个 ALU 速度在一个 CPU 中并不起决定性作用,因为ALU的速度都差不多。而一个CPU的性能表现的决定性因素就在于CPU内核的设计。
1、超标量(Superscalar) 既然无法大幅提高 ALU 的速度,有什么替代的方法呢?并行处理的方法又一次产生了强大的作用。所谓的超标量 CPU,就是只集成了多个 ALU、多个 FPU、多个译码器和多条流水线的 CPU,以并行处理的方式来提高性能。
超标量技术应该是很容易理解的,不过有一点需要注意,就是不要去管“超标量”之前的那个数字,比如“9 路超标量”,不同的厂商对于这个数字有着不同的定义,更多的这只是一种商业上的宣传手段。
2、流水线(Pipeline) 流水线是现代 RISC 核心的一个重要设计,它极大地提高了性能。 对于一条具体的指令执行过程,通常可以分为五个部分:取指令,指令译码,取操作数,运算(ALU),写结果。其中前三步一般由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令顺序执行,那么先是指令控制器工作,完成第一条指令的前三步,然后运算器工作,完成后两步,在指令控制器工作,完成第二条指令的前三步,在是运算器,完成第二条指令的后两部……很明显,当指令控制器工作是运算器基本上在休息,而当运算器在工作时指令控制器却在休息,造成了相当大的资源浪费。解决方法很容易想到,当指令控制器完成了第一条指令的前三步后,直接开始第二条指令的操作,运算单元也是。这样就形成了流水线系统,这是一条 2 级流水线。
如果是一个超标量系统,假设有三个指令控制单元和两个运算单元,那么就可以在完成了第一条指令的取址工作后直接开始第二条指令的取址,这时第一条指令在进行译码,然后第三条指令取址,第二条指令译码,第一条指令取操作数……这样就是一个 5 级流水线。很显然,5 级流水线的平均理论速度是不用流水线的 4 倍。
流水线系统最大限度地利用了 CPU 资源,使每个部件在每个时钟周期都工作,大大提高了效率。但是,流水线有两个非常大的问题:相关和转移。
在一个流水线系统中,如果第二条指令需要用到第一条指令的结果,这种情况叫做相关。以上面哪个 5 级流水线为例,当第二条指令需要取操作数时,第一条指令的运算还没有完成,如果这时第二条指令就去取操作数,就会得到错误的结果。所以,这时整条流水线不得不停顿下来,等待第一条指令的完成。这是很讨厌的问题,特别是对于比较长的流水线,比如 20 级,这种停顿通常要损失十几个时钟周期。目前解决这个问题的方法是乱序执行。乱序执行的原理是在两条相关指令中插入不相关的指令,使整条流水线顺畅。比如上面的例子中,开始执行第一条指令后直接开始执行第三条指令(假设第三条指令不相关),然后才开始执行第二条指令,这样当第二条指令需要取操作数时第一条指令刚好完成,而且第三条指令也快要完成了,整条流水线不会停顿。当然,流水线的阻塞现象还是不能完全避免的,尤其是当相关指令非常多的时候。
另一个大问题是条件转移。在上面的例子中,如果第一条指令是一个条件转移指令,那么系统就会不清楚下面应该执行那一条指令?这时就必须等第一条指令的判断结果出来才能执行第二条指令。条件转移所造成的流水线停顿甚至比相关还要严重的多。所以,现在采用分支预测技术来处理转移问题。虽然我们的程序中充满着分支,而且哪一条分支都是有可能的,但大多数情况下总是选择某一分支。比如一个循环的末尾是一个分支,除了最后一次我们需要跳出循环外,其他的时候我们总是选择继续循环这条分支。根据这些原理,分支预测技术可以在没有得到结果之前预测下一条指令是什么,并执行它。现在的分支预测技术能够达到 90%以上的正确率,但是,一旦预测错误,CPU 仍然不得不清理整条流水线并回到分支点。这将损失大量的时钟周期。所以,进一步提高分支预测的准确率也是正在研究的一个课题。
越是长的流水线,相关和转移两大问题也越严重,所以,流水线并不是越长越好,超标量也不是越多越好,找到一个速度与效率的平衡点才是最重要的。
三、CPU 的外核
1、解码器(Decode Unit)这是 x86CPU 才有的东西,它的作用是把长度不定的 x86 指令转换为长度固定的类似于RISC的指令,并交给RISC内核。解码分为硬件解码和微解码,对于简单的x86指令只要硬件解码即可,速度较快,而遇到复杂的x86指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂。好在这些复杂指令很少会用到。
Athlon也好,PIII也好,老式的CISC的x86指令集严重制约了他们的性能表现。
2、一级缓存和二级缓存(Cache)以及缓存和二级缓存是为了缓解较快的 CPU 与较慢的存储器之间的矛盾而产生的,以及缓存通常集成在CPU内核,而二级缓存则是以OnDie或OnBoard的方式以较快于存储器的速度运行。对于一些大数据交换量的工作,CPU的Cache显得尤为重要。
好了,看到了吧,CPU 其实也就这样,并不是很神秘。这篇文章的所有内容都不针对某一种 CPU,而是适合于任何 CPU,是一些最基本的 CPU 原理,希望能够对你有所帮助。
/
发表评论 取消回复