第一章 计算机系统概述

目录

计算机组成与系统结构

计算机的发展历程

第一代计算机

第二代计算机

第三代计算机

第四代计算机

计算机系统的基本组成

计算机硬件

计算机软件

计算机系统的层次结构

计算机系统抽象层的转换

计算机系统的不同用户

程序开发与执行过程

从源程序到可执行程序

可执行文件的启动和执行

程序与执行的关系

计算机系统性能评价

计算机系统性能评价

计算机性能的定义

计算机性能的测试

用指令执行速度进行性能评估

用基准程序进行性能评估

本章小结


计算机组成与系统结构

参考书目:袁春风老师编写的《计算机组成与系统结构》

计算机组成(computer organization):是指计算机主要功能部件的组成结构、逻辑设计及功能部件间的相互连接关系。

计算机系统结构(computer architecture)的经典定义:是指程序设计者(主要指低级语言程序员或编译程序设计者)所看到的计算机系统的属性,即计算机的功能特性和概念性结构,也称指令集体系结构(Instruction Set Architecture,ISA),包括数据类型及数据格式,指令格式,寻址方式和可访问空间大小,程序可访问的寄存器个数、位数和编号,控制寄存器的定义,I/O空间的编址方式,中断结构,机器工作状态的定义和切换,输人输出数据传送方式,存储保护方式等。

第1章(计算机系统概述)主要介绍冯·诺依曼结构的特点、计算机硬件的基本组成、计算机软件设计和执行过程、计算机系统层次结构以及系统性能评价方法。

第⒉章(数据的机器级表示)主要介绍无符号数和带符号整数的表示、 IEEE 754浮点数标准、西文字符和汉字的编码表示,大端/小端存放顺序及对齐方式以及常用检/纠错码表示与使用方法等。

第3章(运算方法和运算部件)主要介绍各类定点数和浮点数的运算方法和相应的运算部件,以及核心运算部件ALU的功能和设计实现等。

第4章(指令系统)主要介绍高级语言与低级语言的关系、指令格式,操作数类型、寻址方式,操作类型、硬件对过程的支持,用户程序在虚存空间的配置和划分等技术。

第5章(中央处理器)主要介绍CPU的基本功能和内部结构、指令执行过程、数据通路的基本组成和定时,单周期和多周期数据通路、硬连线路和微程序控制器、异常和中断等概念和技术。

第6章(指令流水线)主要介绍指令流水线的基本原理、流水段寄存器的概念,流水线数据通路的设计,流水线的控制信号,结构冒险及其处理、数据冒险及其处理、转发技术、控制冒险及其处理、分支预测原理、超标量和动态流水线的概念和技术。

第7章(存储器分层体系结构)主要介绍存储器分层结构的概念,半导体存储器的组织、多模块存储器、cache的基本原理、cache和主存间的映射关系及替换算法,虚拟存储器的基本概念、页表结构、缺页异常、TLB的实现技术。

第8章(互连及输入输出组织)主要介绍常用输人输出外设和磁盘存储器的工作原理、现代计算机内部互连结构、I/O接口的结构、I/О端口编址方式,程序查询I/O方式、中断I/O方式、DMA方式以及内核I/O软件概述等。

第9章(并行处理系统)主要介绍UMA(对称)多处理器、CC-NUMA多处理器、片级多处理器和多线程技术、集群多计算机,网格多计算机、向量处理机和SIMD技术,还对并行处理编程模型进行了概述。

计算机的发展历程

世界上第一台通用电子计算机是1946年在美国诞生的ENIAC,其设计师是美国宾夕法尼亚大学的莫齐利(Mauchly)和他的学生艾克特(Eckert)。

ENIAC能进行每秒5000次加法运算、每秒400次乘法运算以及平方和立方、sin和cos函数数值运算。当时主要用它来进行弹道参数计算,60秒钟射程的弹道计算时间由原来的20分钟一下子缩短到仅需30秒。ENIAC是个庞然大物,耗资40多万美元,使用了18 000个真空管,重30吨,占地面积170m2,耗电150千瓦,第一次开机时甚至使整个费城地区的照明都闪烁变暗。该机正式运行到1955年10月2日,这十年间共运行了80 223个小时。

自从第一台通用电子计算机 ENIAC诞生后,人类社会进入了一个崭新的电子计算和信息化时代。计算机硬件早期的发展受电子开关器件的影响极大,为此,传统上人们以元器件的更新作为计算机技术进步和划代的主要标志。

第一代计算机

第一代计算机(20 世纪40年代中到20 世纪50年代末)为电子管计算机

计算机“软件”一词尚未出现,编制程序所用工具为低级语言。电子管计算机体积大,速度慢(每秒千次或万次),存储器容量小。

1944年,冯·诺依曼在参加原子弹的研制工作中遇到了极为困难的计算问题。1944年夏的一天,他巧遇美国弹道实验室的军方负责人戈尔斯坦,他正参与ENIAC的研制工作,因此,冯·诺依曼被戈尔斯坦介绍加入 ENIAC研制组。在设计和研制ENIAC过程中,研制小组意识到ENIAC还存在很多问题,例如,没有存储器,也没有采用二进制。1945年,在共同讨论的基础上,冯·诺依曼以《关于EDVAC的报告草案》为题,起草了长达101页的总结报告,发表了全新的“存储程序( stored-program)通用电子计算机方案”宣告了现代计算机结构思想的诞生。

“存储程序”方式的基本思想是:必须将事先编好的程序和原始数据送入主存后才能执行程序,一旦程序被启动执行,计算机能在不需操作人员干预下自动完成逐条取出指令并执行的任务。

冯·诺依曼在IAS于1046年开始设计"存储程序"计算机,该机被称为IAS计算机,是后来通用计算机原型。

IAS计算机基本结构如图所示,包含5个部件:算术逻辑单元(即运算器)﹑程序控制器、主存储器﹑输入设备和输出设备。整个计算机以主存储器为中心,程序和数据首先输入到运算器,然后保存到主存。程序运行时,从主存调出指令,在程序控制器和运算器中执行,执行的中间结果送主存保存,最终结果送输出设备。

英国剑桥大学的M.V.Wilkes在 EDVAC方案启发下,于1949年制造成功的EDSAC成为世界上第一台“存储程序”式的现代计算机,而IAS计算机直到1951年才告完成。此外,尚有1951年的UMVAC-1和1956年的IBM 704等也都属于第一代计算机。
 

第二代计算机

第二代计算机(20世纪50年代中后期到20世纪60年代中)为晶体管计算机

1947年,美国贝尔实验室的三位科学家William Shockley、John Bardeen、Walter Brattain发明了晶体管,为计算机的发展提供了新的技术基础。该实验室于1954年研制了晶体管计算机TRADIC,而麻省理工学院于1957年完成的TX-2对晶体管计算机的发展起了重要作用。IBM公司于1955年宣布的全晶体管计算机7070和7090开启了第二代计算机蓬勃发展的新时期,特别是1959年 IBM公司推出的商用机IBM 1401,更以其小巧价廉和面向数据处理的特性而获得广大用户的欢迎,从而促进了计算机工业的迅速发展。

这一代计算机除了逻辑元件采用晶体管以外,其内存采用磁芯存储器,外存采用磁鼓与磁带存储器,实现了浮点运算,并在系统结构方面提出了变址、中断、I/O处理器等新概念。这时计算机软件也得到了发展,出现了多种高级语言及其编译程序。和第一代电子管计算机相比,第二代晶体管计算机体积小,速度快、功耗低、可靠性高。

 

第三代计算机

第三代计算机(20世纪60年代中到20世纪70年代中后期)为集成电路计算机

1958年德州仪器公司的工程师Jack Kilby和仙童半导体公司的工程师Robert Noyce几乎同时各自独立发明了集成电路,为现代计算机的发展奠定了革命性的基础,使得计算机的逻辑元件与存储器均可由集成电路实现。集成电路的应用是微电子与计算机技术相结合的一大突破,为构作运算速度快.价格低﹑容量大、可靠性高﹑体积小,功耗低的各类计算机提供了技术条件。1964年 IBM公司宣布世界上第一个采用集成电路的通用计算机IBM 360系统研制成功,该系统的发布是计算机发展史上具有重要意义的事件。该系统采用了一系列计算机新技术,包括微程序控制,高速缓存、虚拟存储器和流水线技术等;一次就推出了6种机型,它们相互兼容,可广泛应用于科学计算﹑数据处理等领域;在软件方面首先实现了操作系统,具有资源调度、人机通信和输入输出控制等功能。IBM 360系列的诞生对计算机的普及应用和大规模工业化生产产生了重大影响,到1966年底,其产量已达到每月400台,5年内总产量超过33 000台。
 

第四代计算机

第四代计算机(20世纪70年代后期开始)为超大规模集成电路计算机

20世纪70年代初,随着微电子学飞速发展而产生的大规模集成电路和微处理器给计算机工业注入了新鲜血液。其后,大规模集成电路(LSI)和超大规模集成电路(VLSI)成为计算机的主要器件,其集成度从20世纪70年代初的几千个晶体管/片(如Intel 4004 为2000个晶体管)到20世纪末的千万个晶体管/片。以最大的微处理器制造商Intel公司的产品为例,可以看出,半导体集成电路的集成度越来越高,速度也越来越快,其发展遵循以下摩尔定律:由于硅技术的不断改进,每18个月,集成度将翻一番,速度将提高一倍,而其价格将降低一半。戈登·摩尔(Golden Moore)是Intel公司的创始人之一,摩尔定律是摩尔在1965年接受美国《电子》杂志的总编采访时对半导体芯片工业发展前景的预测,近50年来的实践证明,摩尔定律的预测是基本准确的。

随着超大规模集成电路与微处理器技术的长足进步和现代科学技术对提高计算能力的强烈要求,并行处理技术的研究与应用以及众多巨型机的产生也成为这一时期计算机发展的特点。1976年,Cray公司推出的Cray-1向量巨型机具有12个功能部件,运算速度达每秒1.6亿次浮点运算。不少巨型机采用成百上千个高性能处理器组成大规模并行处理系统,其峰值速度已达到每秒几千亿或万亿次,这种并行处理技术成为20世纪90年代巨型机发展的主流。

第四代计算机时期的另一个重要特点是计算机网络的发展与广泛应用。由于计算机技术与通信技术的高速发展与密切结合,掀起了网络热潮,大量的计算机联入不同规模的网络中,然后通过Internet与世界各地的计算机相联,大大扩展和加速了信息的流通,增强了社会的协调与合作能力,使计算机的应用方式也由个人计算方式向网络化方向发展。

近70年来,人们使用计算机的方式发生了巨大变化。早先是多人共享一台计算机(分时计算方式),然后是一人使用一台计算机(个人计算方式),进而发展到目前多人使用多台计算机的网络计算方式,也就是后PC时代和大数据并行计算时代。
 

计算机系统的基本组成

计算机系统由硬件和软件两部分组成。

  • 硬件是具体物理装置的总称,人们看到的各种芯片、板卡、外设、电缆等都是计算机硬件。
  • 软件包括运行在硬件上的程序和数据以及相关的文档。程序是指挥计算机如何操作的一个指令序列,数据是指令操作的对象。

计算机硬件

绝大多数计算机仍然具有冯·诺依曼结构计算机的特征,其基本的思想主要包括以下几个方面

  • 采取"存储程序"工作方式
  • 计算机由运算器﹑控制器﹑存储器、输人设备和输出设备5个基本部件组成。控制器应能控制指令的自动执行;运算器应能进行加、减、乘、除4种基本算术运算,并且也能进行逻辑运算;操作人员可以通过输入输出设备使用计算机。
  • 存储器不仅能存放数据,而且也能存放指令,形式上数据和指令没有区别,但计算机应能区分它们;
  • 计算机内部以二进制形式表示指令和数据;每条指令由操作码和地址码两部分组成,操作码指出操作类型,地址码指出操作数的地址;由一串指令组成程序。

计算机硬件主要包括中央处理器、存储器、I/О控制器、外部设备和各类总线等。

下图是一个典型的多总线计算机系统的硬件结构示意图,可以得到以下信息:

  • CPU通过I/O桥接器与主存相连,通过I/O桥接器,I/O总线与外部设备相连。在CPU内部,控制器控制寄存器与算术逻辑部件(ALU,用于执行数据的算术和逻辑运算)。ALU处理的数据来自寄存器堆
  • 磁盘和主存是存储部件,分别用于存储长期保存信息和临时保存信息
  • 各类总线以及总线接口部件、I/O桥接器、I/О扩展槽、I/О控制器和显示适配器等都是互连部件,用于完成数据传送任务。所有这些部件的操作都通过CPU中的控制器对指令译码后送出的控制信号的控制来完成。
  • 主存通过存储器总线、I/О桥接器与CPU和输入输出设备交换信息;
  • I/O设备通过各自的外设控制器或适配器连到I/О总线上,例如,可以把鼠标和键盘连接到USB控制器的接口上,显示器连接到显示适配卡的接口上。在一个I/O总线上可以设置多个I/O扩展槽,以连接更多的外设。

从外部来看,普通台式个人计算机(PC)是用各种电缆将显示器、键盘﹑鼠标和机箱等连接而成的一个装置。打开一台普通台式机的机箱后,看到的是如图所示的一组电路板、芯片和连线,有主板、电源、风扇和硬盘驱动器等。

下图是对计算机硬件进行解剖的示意图,显示了一台个人计算机的硬件结构分解过程。计算机主机由多个电路板用总线连接而成,每个电路板上又焊接了多个集成电路芯片,每个芯片中有十几个电路模块,每个模块中有上千万个单元,每个单元中有几个门电路,每个门电路实现基本的逻辑运算。因为计算机中所有信息都采用二进制编码表示,二进制的1和О对应逻辑值“真”和“假”,可方便地通过逻辑运算电路来实现算术运算。

下图是Pentium 4处理器芯片的内部结构示意图。左边是芯片的显微照片,右边是功能模块。Pentium4处理器芯片中除了整数运算数据通路外,还集成了浮点运算数据通路和多媒体处理数据通路;Pentium 4处理器将L1 cache(包括指令cache和数据cache)和L2 cache都做在了CPU芯片内。此外,还有具有支持高级流水线和超线程的部件,以及用于I/O访问和存储器访问的接口部件。

计算机软件

计算机的工作由存储在其内部的程序控制,这是冯·诺依曼结构计算机“存储程序”工作方式的重要特征,因此程序或者软件质量的好坏将大大影响计算机性能的发挥

软件的发展受计算机硬件和计算机应用的推动和制约,其发展过程大致分3个阶段。

第一阶段:从第一台计算机上的第一个机器代码程序出现到实用的高级语言出现为第一阶段(1946——1956年)。这时期的计算机应用以科学计算为主,计算量较大,但输入输出量不大;机器以CPU为中心,存储器较小;直接采用机器语言编程,因而程序设计与编制工作复杂、繁琐、易出错。这时尚未出现软件一词。

第二阶段:从实用的高级程序设计语言出现到软件工程概念出现以前这段时间为第二阶段(1956--1968年)。这时期除了科学计算外,还出现了大量数据处理问题,计算量不大,但输人输出量较大。机器结构转向以存储器为中心,出现了大容量存储器,输人输出设备增加,软件概念也开始出现。为了充分利用处理器、存储器和输入输出等计算机资源,出现了操作系统;为了提高编程工作效率,出现了高级语言;为了适应大量的数据处理,出现了数据库及其管理系统。随着软件规模和复杂性的不断提高,软件开发过程中,甚至出现了人们难以控制的局面,即所谓软件危机。为了克服这种危机,人们研究和采用了很多技术方法,这就导致了“软件工程”概念和方法的出现。

第三阶段:软件工程出现以后至今一直处于第三阶段。对于一些复杂的大型软件,基于个人和简单团队分工的传统开发方式进行开发不仅效率低,可靠性差,且很难完成,必须采用工程方法才能实现。为此,从20世纪60年代末开始,软件工程技术得到了迅速的发展,出现了“计算机辅助软件设计”、“软件自动化”等技术方法和实验系统。目前,人们除了研究改进软件开发技术外,还着重研究具有智能化、自动化、集成化,并行化以及自然化特征的软件新技术。

根据软件的用途,一般将软件分成系统软件和应用软件两大类

系统软件包括为有效、安全地使用和管理计算机以及为开发和运行应用软件而提供的各种软件,介于计算机硬件与应用程序之间,它与具体应用关系不大。系统软件包括操作系统(如Windows)、语言处理系统(如C语言编译器)数据库管理系统(如Oracle)和各类实用程序(如磁盘碎片整理程序、备份程序)。操作系统主要用来管理整个计算机系统的各种资源,包括对它们进行调度﹑管理、监视和服务等,操作系统还提供计算机用户和硬件之间的人机交互界面,并提供对应用软件的支持;语言处理系统主要用于提供一个用高级语言编程的环境,包括源程序编辑﹑翻译、调试,链接、装入运行等功能;数据库管理系统是一种用于建立,使用和维护数据库的软件系统。

专门为数据处理,科学计算、事务管理、多媒体处理、工程设计以及过程控制等应用所编写的各类程序都称为应用软件。例如,人们平时经常使用的电子邮件收发软件、播放软件、游戏软件﹑炒股软件、文字处理软件、电子表格软件、演示文稿制作软件等都是应用软件。
 

计算机系统的层次结构

计算机系统是一个层次结构系统,通过向上层用户提供一个抽象的简洁接口而将较低层次的实现细节隐藏起来。计算机解决应用问题的过程就是不同抽象层进行转换的过程。

计算机系统抽象层的转换

下图是计算机系统层次转换示意图,描述了从最终用户希望计算机完成的应用到电子工程师使用器件完成基本电路设计的整个转换过程。

希望计算机完成或解决的任何一个应用(问题)最开始形成时是用自然语言描述的,但是,计算机硬件只能理解机器语言,而要将一个自然语言描述的应用问题转换为机器语言程序,需要经过多个抽象层的转换。

  1. 将应用问题转换为算法(algorithm)描述,使得应用问题的求解编程流程化的清晰步骤。对问题解决寻找最优算法,并且进行优化:时间,空间
  2. 将算法用编程语言描述的程序,由程序员完成。编程语言有严格的执行顺序,不存在二义性,能唯一确定计算机执行指令的顺序。有高级语言,低级语言之分。高级语言是机器无关语言。低级语言和运行程序的计算机的底层结构密切相关,也被称为机器级语言,如:汇编语言和机器语言(即0,1序列)。
  3. 高级语言到机器语言的转化过程由计算机完成,需要有自动执行转换的程序,成为程序设计处理系统。程序员借助程序设计语言处理系统开发软件。任何一个程序设计语言处理系统都包含一个翻译程序,能把一种编程语言标识的程序转换等价的另一种编程语言程序。

翻译程序有以下三类:

  1. 汇编程序(assembler):也称汇编器,用来将汇编语言源程序翻译成机器语言目标程序。
  2. 解释程序(interpreter):也称解释器,用来将源程序中的语句按其执行顺序逐条翻译成机器指令并立即执行。
  3. 编译程序(compiler):也称编译器,用来将高级语言源程序翻译成汇编语言或机器语言目标程序。

当然,所有的语言处理系统都必须在操作系统提供的计算机环境中运行,操作系统是对计算机底层结构和计算机硬件的一种抽象,这种抽象构成了一台可以让程序员使用的虚拟机(virtual machine)。

从应用问题到机器语言程序的每次转换所涉及的概念都属于软件的范畴,而机器语言程序所运行的计算机硬件和软件之间需要有一个“桥梁”,这个在软件和硬件之间的界面就是指令集体系结构(Instruction Set Architecture,ISA),简称体系结构或系统结构(architecture),它是软件和硬件之间接口的一个完整定义。ISA定义了一台计算机可以执行的所有指令的集合,每条指令规定了计算机执行什么操作,所处理的操作数存放的地址空间以及操作数类型。ISA规定的内容包括数据类型及格式,指令格式,寻址方式和可访问地址空间大小,程序可访问的寄存器个数,位数和编号,控制寄存器的定义,I/О空间的编址方式,中断结构,机器工作状态的定义和切换,输人输出结构和数据传送方式,存储保护方式等。因此,可以看出,指令集体系结构是指软件能感知到的部分,也称软件可见部分。

机器语言程序就是一个ISA规定的指令的序列,因此,计算机硬件执行机器语言程序的过程就是让其执行一条一条指令的过程。ISA是对指令系统的一种规定或结构规范,具体实现的组织(organization)称为微体系结构( microarchitecture),简称微架构。ISA 和微体系结构是两个不同层面上的概念,微体系结构是软件不可感知的部分。例如,加法器采用串行进位方式还是并行进位方式实现属于微体系结构。相同的ISA可能具有不同的微体系结构,例如,对于Intel x86这种ISA,很多处理器的组织方式不同,即具有不同的微架构,但因为它们具有相同的ISA,因此,一种处理器运行的程序,在另一种处理器上也能运行。

微体系结构最终是由逻辑电路(logic circuit)实现的,当然,微架构中的一个功能部件可以用不同的逻辑来实现,用不同的逻辑实现方式得到的性能和成本有差异。

最后,每个基本的逻辑电路都是按照特定的器件技术( device technology)实现的,例如,CMOS电路中使用的器件和NMOS电路中使用的器件不同。
 

计算机系统的不同用户

按照在计算机上完成任务的不同,可以把使用计算机的用户分成以下4类:最终用户、系统管理员,应用程序员和系统程序员。

(1) 最终用户

使用应用程序完成特定任务的计算机用户称为最终用户(end user)。早期的计算机非常昂贵,只能由少数专业人员使用。随着20世纪80年代初个人计算机的迅速普及以及20世纪90年代初多媒体计算机的广泛应用,特别是互联网技术的发展,计算机已经成为人们日常生活中的重要工具。人们利用计算机播放电影﹐玩游戏,炒股票,发邮件,查信息,聊天打电话等,计算机的应用无处不在。因而,许多普通人都成为计算机的最终用户。计算机最终用户使用键盘和鼠标等外设与计算机交互,通过操作系统提供的用户界面启动执行应用程序或系统命令﹐从而完成用户任务。因此,最终用户能够感知到的只是系统提供的简单人机交互界面和安装在计算机中的相关应用程序。
 

(2) 系统管理员

系统管理员(system administrator)是指利用操作系统等软件提供的功能对系统进行配置﹑管理和维护,以建立高效合理的系统环境供计算机用户使用的操作人员。其职责主要包括:安装﹑配置和维护系统的硬件和软件,建立和管理用户账户,升级软件,备份和恢复业务系统和数据等。相对于普通的计算机最终用户,系统管理员作为管理和维护计算机系统的专业人员,应该非常熟悉操作系统提供的有关系统配置和管理方面的功能,很多普通用户解决不了的问题,系统管理员必须能够解决。因此,系统管理员能感知到的是系统中部分硬件层面、系统管理层面以及相关的实用程序和人机交互界面。

(3) 应用程序员

应用程序员(application programmer)是指使用高级编程语言编制应用软件的程序员。应用程序员大多使用高级程序设计语言编写程序。应用程序员所看到的计算机系统除了计算机硬件﹑操作系统提供的应用编程接口(API)、人机交互界面和实用程序外,还包括相应的程序语言处理系统。在语言处理系统中,除了翻译程序外,通常还包括编辑程序﹑链接程序以及将这些程序和工具集成在一起所构成的集成开发环境(Integrated Development Environment,IDE)等。此外,语言处理系统中还包括可供应用程序调用的各类函数库。

(4) 系统程序员

系统程序员(system programmer)指设计和开发系统软件的程序员。系统程序员开发操作系统、编译器和实用程序等系统软件时,需要熟悉计算机底层的相关硬件和系统结构,甚至可能需要直接与计算机硬件和指令系统打交道。比如,直接对各种控制寄存器、用户可见寄存器、I/О控制器等硬件进行控制和编程。因此,系统程序员必须熟悉指令系统、机器结构和相关的机器功能特性,有时还要直接用汇编语言等低级语言编写程序代码。

一个计算机系统可以认为是由各种硬件和各类软件采用层次化方式构建的分层系统,不同计算机用户工作所在的系统结构层如图

有图可知,ISA处于硬件和软件的交界面上,硬件所有的功能都由ISA集中体现,软件通过ISA在计算机上执行。所以,ISA是整个计算机系统中的核心部分。

ISA层下面是硬件部分,上面是软件部分。硬件部分包括CPU、主存和输人输出等主要功能部件,这些功能部件通过数字逻辑电路设计实现。软件部分包括低层的系统软件和高层的应用软件,汇编程序、编译程序和操作系统等这些系统软件直接在ISA上实现,系统程序员所看到的机器的属性是属于ISA层面的内容,所看到的机器是配置了指令系统的机器,称为机器语言机器,工作在该层次的程序员称为机器语言程序员;系统管理员工作在操

程序开发与执行过程

程序的开发和执行涉及计算机系统的各个不同层面,因而计算机系统层次结构的思想体现在程序开发和执行过程的各个环节中。下面以简单的 hello程序为例,简要介绍程序的开发与执行过程,以便加深对计算机系统层次结构概念的认识。

”因为编写程序并让其在计算机上执行是为了解决最终用户的应用问题,因而,程序有时被称为用户程序(user program)或应用程序(application program)。

从源程序到可执行程序

以下是 hello.c 的 C 语言源程序代码

为了让计算机能执行上述应用程序,应用程序员应按照以下步骤进行处理。

(1)通过程序编辑软件得到hello. c文件。hello.c在计算机中以ASCII字符方式存放,如图所示,图中给出了每个字符对应的ASCII码的十进制值。例如,第一个字节的值是35,代表字符'#';第二个字节的值是105,代表字符'i',最后一个字节的值为125,代表字符'}'。通常把用ASCII码字符或汉字字符表示的文件称为文本文件( text file),源程序文件都是文本文件,是可显示和可读的。

文件在计算机的存储形式,对文件内容进行编码,每个字母,符号,汉字对用一个编码存出在计算机里。

(2)将hello.c进行预处理、编译、汇编和链接,最终生成可执行目标文件。例如,在UNIX系统中,可用GCC编译驱动程序进行处理,命令如下:unix>gcc -o hello hello.c

上述命令中,最前面的unix>为shell命令行解释器的命令行提示符,gcc为GCC编译驱动程序名,-o表示后面为输出文件名, hello. c为要处理的源程序。从hello.c到可执行目标文件hello的转换过程如图所示。

(1)预处理阶段:预处理程序(cpp)对源程序中以字符#开头的命令进行处理,例如,将#include命令后面的.h文件内容嵌入到源程序文件中。预处理程序的输出结果还是一个源程序文件,以i为扩展名。即内容还是C语言的代码。

(2)编译阶段:编译程序(cc1)对预处理后的源程序进行编译,生成一个汇编语言源程序文件,以s为扩展名,例如, hello.s是一个汇编语言程序文件。

(3)  汇编阶段:汇编程序(as)对汇编语言源程序进行汇编,生成一个可重定位目标文件(relocatable object file),以o为扩展名,例如, hello.o是一个可重定位目标文件。它是一种二进制文件(binary file),因为其中的代码已经是机器指令,数据以及其他信息也都是用二进制表示的,所以它是不可读的,即打开显示出来的是乱码。

(4)链接阶段:链接程序(ld)将多个可重定位目标文件和标准库函数合并成为一个可执行目标文件(executable object file),可执行目标文件简称为可执行文件。本例中,链接器将hello.o和标准库函数printf所在的可重定位目标模块printf.o进行合并,生成可执行文件hello。

最终生成的可执行文件被保存在磁盘上,可以通过某种方式启动一个磁盘上的可执行文件运行。

可执行文件的启动和执行

对于一个存放在磁盘上的可执行文件,可以在操作系统提供的用户操作环境中,采用双击对应图标或在命令行中输入可执行文件名等多种方式来启动执行。在UNIX系统中,可以通过shell命令行解释器来执行一个可执行文件。例如,对于上述可执行文件 hello,通过shell命令行解释器启动执行的结果如下:

shell命令行解释器会显示提示符unix>,告知用户它准备接收用户的输入,此时,用户可以在提示符后面输入需要执行的命令名,它可以是一个可执行文件在磁盘上的路径名,例如,上述“./ hello”就是可执行文件 hello的路径名,其中“./”表示当前目录。在命令后用户需按下Enter键表示结束。如图显示了在计算机中执行·hello的整个过程。

如图所示:

  1. shell 程序会将用户从键盘输入的每个字符逐一读人 CPU寄存器中(对应线①)
  2. 然后再保存到主存储器中,在主存的缓冲区形成字符串"./hello"(对应线②)。
  3. 等到接收到Enter键时, shell将调出操作系统内核中相应的服务例程,由内核来加载磁盘上的可执行文件 hello到存储器(对应线③)。
  4. 内核加载完可执行文件中的代码及其所要处理的数据(这里是字符串"hello,world\n")后,将hello第一条指令的地址送到程序计数器(Program Counter,PC)中,CPU永远将PC的内容作为将要执行的指令的地址,因此,处理器随后开始执行hello程序﹐它将加载到主存的字符串"hello,world\n"中的每一个字符从主存取到CPU的寄存器中(对应线④)
  5. 然后将CPU寄存器中的字符送到显示器上显示出来(对应线⑤)。

可以知道:程序的数据(字符串)和指令是分开存储的。CPU的PC存储执行指令的地址 

从上述过程可以看出,一个用户程序被启动执行,必须依靠操作系统的支持,包括外壳程序和内核服务例程。例如,shell 命令行解释器是操作系统外壳程序,它为用户提供了一个启动程序执行的环境,用来对用户从键盘输入的命令进行解释,并调出操作系统内核来加载用户程序(用户输人命令对应的程序)。显然,用来加载用户程序并使其从第一条指令开始执行的操作系统内核服务例程也是必不可少的。此外,在上述过程中涉及键盘、磁盘和显示器等外部设备的操作,这些底层硬件是不能由用户程序直接访问的,此时,也需要依靠操作系统内核服务例程的支持,例如,用户程序需要调用内核的read系统调用服务例程读取磁盘文件,或调用内核的write系统调用服务例程把字符串写到显示器中等。
从图可以看出,程序的执行过程就是数据在CPU、主存储器和I/О模块之间流动的过程,所有数据的流动都是通过总线、I/О桥接器等进行的。数据在总线上传输之前,需要先缓存在存储部件中,因此,除了主存储器本身是存储部件以外,在CPU、I/O桥接器、设备控制器中也有存放数据的缓冲存储部件,例如CPU中的寄存器堆、设备控制器中的数据缓冲寄存器等。

程序与执行的关系

可执行目标文件中包含机器代码段,可执行文件的执行实际上是所包含的机器代码段执行的过程。机器代码段由一条一条机器指令(通常简称为指令)构成。指令(instruction)就是用0和1表示的一串0/1序列,用来指示CPU完成一个特定的原子操作

例如,取数指令(load instruction)从存储单元中取出一个数据存放到CPU的寄存器中,存数指令( storeinstruction)将CPU寄存器的内容写入一个存储单元,ALU指令(ALU'instruction)将两个寄存器的内容进行某种算术或逻辑运算后再送入一个CPU寄存器中,输出指令(outputinstruction)将一个CPU寄存器的内容送到I/O模块的某个寄存器中,如此等等。
可以看出,上述hello程序的执行过程中,字符串"hello,world\n"中的每个字符都要通过取数指令从存储器送到CPU寄存器中,然后,再通过输出指令从CPU寄存器送到显示适配器(也称显示控制器或显卡)中。

指令通常被划分为若干个字段,有操作码字段、地址码字段和立即数字段等。操作码字段指出指令的操作类型,如加、减﹑传送、跳转等;地址码字段指出指令所处理的操作数的地址,如寄存器编号v内存单元地址等;立即数字段指出具体的一个操作数或偏移地址等。

图1.12给出了实现两个相邻数组元素交换功能的不同层次语言的描述。

在高级语言源程序中,可直观地用3个赋值语句实现;

在经编译后生成的汇编语言源程序中,可用4个汇编指令表示,其中,两条是取数指令lw(load word),另两条是存数指令sw(store word)

在经汇编后生成的机器语言程序中,对应的机器指令是特定格式的二进制代码,例如,第一条lw指令对应的机器代码为1000 1100 0100 1111 0000 0000 0000 0000,这是一条MIPS体系结构中的指令,其中,高6位100011为操作码,随后5位00010为寄存器编号⒉,再后面5位01111为另一个寄存器编号,最后16位为立即数0。

CPU能够通过逻辑电路直接执行这种二进制表示的机器指令。指令执行时通过控制器将指令操作码进行译码,以解释成控制信号(control signal)来控制数据通路执行。例如,控制信号ALUop=add可以控制ALU进行加法操作,RegWr=1可以控制将结果写入寄存器。

计算机系统性能评价

如图给出了冯·诺依曼结构的简单模型机,通过描述该模型机的工作原理,以期说明指令的含义和指令的执行过程。

在该模型机中,CPU包含ALU、通用寄存器组(GPRs)、标志寄存器、控制器、指令寄存器(Instruction Register,IR),程序计数器、存储器地址寄存器(Memory Address Register,MAR)和存储器数据寄存器(Memory Data Register,MDR)。

ALU用于进行算术运算和逻辑运算;

通用寄存器组由若干个通用寄存器组成,每个通用寄存器有一个编号;通过指令可以指定哪个编号的寄存器中的数据作为ALU运算的操作数;

标志寄存器用来存放ALU运算得到的一些标志信息,如结果是否为0、有无产生进位或借位、结果是否为负数等;

IR用于存放从主存读出的指令;指令中的操作码被送到控制器进行译码,以生成控制信号,图中从控制器送出的虚线就是控制信号,可以控制如何修改PC以得到下一条指令的地址,可以控制ALU执行什么运算,可以控制主存进行读操作还是写操作(读/写控制信号)。

CPU和主存之间通过一组总线相连,总线中有地址、控制和数据3组信号线。MAR中的地址信息将会直接送到地址线上;控制线中有读/写信号线,指出数据是从CPU写人主存储器还是从主存储器读出到CPU,根据是读操作还是写操作来控制将MDR中的数据直接送到数据线上还是将数据线上的数据接收到MDR中。

主存储器用来存储指令和操作数。每个存储单元有一个编号,称为地址,通常一个存储单元存放一个字节(8位),因此,每条指令可能占用多个存储单元,一个操作数也会占用多个存储单元,指令的地址和操作数的地址都是指一组连续存储单元中最小的地址。CPU可以读取主存中的指令和操作数,也可以将运算结果写人主存。当CPU需要读/写主存时,CPU将所访问的指令或操作数的地址送到地址线上,并将读/写控制信号送到读/写信号线上。

CPU和主存构成主机,主机外部的输入设备和输出设备通过相应的方式与主机相连。冯·诺依曼结构采用“存储程序”的工作方式,因此,组成一个程序的指令序列以及程序所处理的操作数都被事先存放在主存储器中。程序中第一条指令的地址置于PC中,因此,一旦启动程序执行,CPU就按照以下步骤自动取出程序中的一条一条指令执行。

第一步:根据PC取指令到IR。将PC的内容送MAR,MAR中的内容直接送地址线,同时,控制器将读信号送读/写信号线,主存根据地址线上的地址和读信号,从指定存储单元开始读出指令,并送到数据线上,MDR从数据线接受指令信息,并传送到IR中。

第二步:指令译码并送出控制信号。控制器根据IR中指令的操作码,生成相应的控制信号,送到不同的执行部件。例如,若IR中的指令是ALU运算指令﹐则读/写控制信号被送到ALU的操作控制端,以控制ALU将要进行什么运算;若IR中的指令是取数或存数指令(lw或sw),则读/写控制信号被送到总线的控制线上。

第三步:取操作数。如果是ALU运算类指令,则根据IR中指令指定的寄存器编号选择两个或一个寄存器中的内容作为操作数,送到ALU的输人端。

第四步:指令执行。若是ALU运算类指令,则ALU在控制信号的控制下,进行相应的运算,并生成运算结果和相应的标志信息,若是取数/存数指令,则主存在读/写控制信号的控制下,对地址线指定的存储单元进行读/写。

第五步:回写结果。将ALU运算的结果写入指定编号的寄存器或指定的主存单元中。为了能自动执行程序中的一条一条指令,CPU必须能够自动得到下一条指令的地址并送PC。对于每条指令的长度都一样的指令系统(定长指令字系统),只要每次都将PC自动加上指令长度即可,通常在主存取指令时修改PC;对于变长指令字系统,则需要对指令进行译码,根据不同的情况来使PC加上不同的值。不管是定长指令字系统还是变长指令字系统,当一条指令执行结束时,PC中一定是下一条指令的地址,因而,继续按照上述5个步骤,CPU 就可以按照程序规定的顺序自动地执行程序中的所有指令。

指令的执行由时钟信号(clock signal)进行定时,一条指令的执行可能需要一个或多个时钟周期。

计算机系统性能评价

一个完整的计算机系统由硬件和软件构成﹐硬件性能的好坏对整个计算机系统的性能起着至关重要的作用。硬件的性能检测和评价比较困难,因为硬件的性能只能通过运行软件才能反映出来,而在相同硬件上运行不同类型的软件,或者同样的软件用不同的数据集进行测试,所测到的性能都可能不同。因此,必须有一套综合的测试和评价硬件性能的方法。

计算机性能的定义

吞吐率(throughput)和响应时间(response time)是考量一个计算机系统性能的两个基本指标。

吞吐率表示在单位时间内所完成的工作量。在有些场合下,吞吐率也被称为带宽( bandwidth);

响应时间也称为执行时间(execution time)或等待时间(latency),是指从作业提交开始到作业完成所用的时间。通常情况下,一个程序的响应时间除了程序包含的指令在CPU上执行所用的时间外,还包括磁盘访问时间,存储器访问时间、输入输出操作所需时间以及操作系统运行这个程序所用的额外开销等。

不同应用场合下计算机用户所关心的性能是不同的。例如,在多媒体应用场合,用户希望音/视频的播放要流畅,即单位时间内传输的数据量要大,因而关心的是系统吞吐率是否高;而在银行、证券等事务处理应用场合,用户希望业务处理速度快,不需长时间等待,因而更关心响应时间是否短;还有些应用场合(如ATM、文件服务、Web服务等),用户则同时关心吞吐率和响应时间。

计算机性能的测试

如果不考虑应用背景而直接比较计算机性能,则大都用执行时间来衡量。因此,从执行时间来考虑,完成同样工作量所需时间最短的那台计算机性能是最好的。

操作系统在对处理器进行调度时,一段时间内往往会让多个程序(更准确地说是进程)轮流使用处理器,因此在某个用户程序执行过程中,可能同时还会有其他用户程序和操作系统程序在执行,所以,用户感觉到的某个程序的执行时间并不是其真正的执行时间。通常把用户感觉到的执行时间分成以下两部分:CPU时间和其他时间。CPU时间指CPU用于程序执行的时间,它又包括以下两部分:

  1. 用户CPU时间,指真正用于运行用户程序代码的时间;
  2. 系统CPU时间,指为了执行用户程序而需要CPU运行操作系统程序的时间。

其他时间指等待I/O操作完成的时间或CPU用于执行其他用户程序的时间。

计算机系统的性能评价主要考虑的是CPU性能。系统性能和CPU性能不等价,两者有一些区别。系统性能是指系统的响应时间,它与CPU外的其他部分也有关系;而CPU性能是指用户CPU时间,它只包含CPU运行用户程序代码的时间。

在对CPU时间进行计算时需要用到以下几个重要的概念和指标。

(1)时钟周期(clock cycle,tick ,clock tick ,clock)。计算机执行一条指令的过程被分成若干步骤和相应的动作来完成,每一步动作都要由相应的控制信号进行控制,这些控制信号何时发出、作用时间多长,都要由相应的定时信号进行同步。因此,CPU必须能够产生同步的时钟定时信号,也就是CPU的主脉冲信号,其宽度称为时钟周期。

(2)时钟频率(clock rate,主频)。CPU的主频就是CPU中的主脉冲信号的时钟频率,是CPU时钟周期的倒数。

(3)CPI(cycles per instruction)。CPI表示执行一条指令所需的时钟周期数。由于不同指令的功能不同,所需的时钟周期数也不同,因此,对于一条特定指令而言,其CPI指执行该条指令所需的时钟周期数,此时CPI是一个确定的值;对于一个程序或一台机器来说,其CPI指该程序或该机器指令集中的所有指令执行所需的平均时钟周期数,此时,CPI是一个平均值。

计算公式如下:

有了CPU执行时间,就可以评判两台计算机性能的好坏。计算机的性能可以看成是CPU时间的倒数,因此,两台计算机性能之比就是CPU时间之比的倒数。若计算机Ml和M2的性能之比为n,则说明“计算机Ml的速度是计算机M2的速度的n倍”,也就是说,“在计算机M2上执行程序的时间是在计算机M1上执行时间的n倍”。

CPU时间度量公式中的时钟周期、指令条数、CPI三个因素是相互制约的。例如,更改指令集可以减少程序所含指令的条数,但是,同时可能引起CPU结构的调整,从而可能会增加时钟周期的宽度(即降低时钟频率)。对于解决同一个问题的不同程序,即使是在同一台计算机上,指令条数最少的程序也不一定执行得最快。有关时钟周期、指令条数和CPI的相互制约关系,在学完后面有关指令系统设计﹑数据通路设计等章节后,会有更深刻的认识和理解。

上述例子说明,由于时钟频率的提高可能会对CPU结构带来影响,从而使其他性能指标降低,因此,虽然时钟频率提高会加快CPU执行程序的速度,但不能保证执行速度有相同倍数的提高。

上述例子说明,指令条数少并不代表执行时间短,同样,时钟频率高也不说明执行速度快。在评价计算机性能时,仅考虑单个因素是不全面的,必须3个因素同时考虑。1.5.3节介绍的性能指标MIPS曾被普遍使用,它就没有考虑所有3个因素﹐所以用它来评价性能有时会得到不准确的结论。

用指令执行速度进行性能评估

最早用来衡量计算机性能的指标是每秒钟完成单个运算(如加法运算)指令的条数。当时大多数指令的执行时间是相同的,并且加法指令能反映乘、除等运算性能,其他指令的时间大体与加法指令相当,故加法指令的速度有一定的代表性。指令速度所用的计量单位为MIPS(Million Instructions Per Second),其含义是平均每秒钟执行多少百万条指令。

早期还有一种类似于MIPS的性能估计方式,就是指令平均执行时间,也称等效指令速度法或Gibson混合法。随着计算机体系结构的发展,不同指令所需的执行时间差别越来越大,人们就根据等效指令速度法通过统计各类指令在程序中所占比例进行折算。设某类指令i在程序中所占比例为w;,执行时间为t,,则等效指令的执行时间为:T=w1×t1十w2×t2十…十wn×tn(n为指令种类数)。若指令执行时间用时钟周期数来衡量,则上式计算的结果就是CPI。对指令平均执行时间求倒数能够得到MIPS值。

选取一组指令组合,使得得到的平均CPI最小,由此得到的MIPS 就是峰值MIPS( peak MIPS)。有些制造商经常将峰值MIPS直接当作 MIPS,而实际上的性能要比标称的性能差。

相对 MIPS(relative MIPS)是根据某个公认的参考机型来定义的相应MIPS值,其值的含义是被测机型相对于参考机型MIPS的多少倍。

MIPS反映了机器执行定点指令的速度,但是,用MIPS来对不同的机器进行性能比较有时是不准确或不客观的。因为不同机器的指令集不同,而且指令的功能也不同,也许在机器M1上某一条指令的功能,在机器M2上要用多条指令来完成,因此,同样的指令条数所完成的功能可能完全不同;另外,不同机器的CPI和时钟周期也不同,因而同一条指令在不同机器上所用的时间也不同。下面的例子可以说明这点。

用基准程序进行性能评估

基准程序(benchmarks)是进行计算机性能评测的一种重要工具。基准程序是专门用来进行性能评价的一组程序,能够很好地反映机器在运行实际负载时的性能,可以通过在不同机器上运行相同的基准程序来比较在不同机器上的运行时间,从而评测其性能。基准程序最好是用户经常使用的一些实际程序﹐或是某个应用领域的一些典型的简单程序。对于不同的应用场合,应该选择不同的基准程序。例如,对用于软件开发的计算机进行评测时,最好选择包含编译器和文档处理软件的一组基准程序;而如果是对用于CAD处理的计算机进行评测时,最好选择一些典型的图形处理小程序作为一组基准程序。

基准程序是一个测试程序集,由一组程序组成。例如,SPEC测试程序集是应用最广泛、也是最全面的性能评测基准程序集。1988年,由Sun、MIPS、HP、Apollo、DEC 五家公司联合提出了SPEC标准。它包括一组标准的测试程序、标准输入和测试报告。这些测试程序是一些实际的程序,包括系统调用、I/О等。最初提出的基准程序集分成两类:整数测试程序集SPECint和浮点测试程序集SPECfp。后来分成了按不同性能测试用的基准程序集,如CPU性能测试集(SPEC CPU2000)、 Web服务器性能测试集(SPECweb99)等。

如果基准测试程序集中不同的程序在两台机器上测试得出的结论不同,则如何给出最终的评价结论呢?例如,假定基准测试程序集包含程序P1和P2,程序P1在机器M1和机器M2上运行的时间分别是10s和2s,程序P2在机器Ml和机器M2上运行的时间分别是120s和600s,即:对于P1,M2的速度是M1的5倍;而对于P2,M1的速度是M2的5倍,那么,到底是M1还是M2更快呢?可以用所有程序的执行时间之和来比较,例如,Pl和P2在M1上的执行时间总和为130s,而在 M2上的总时间为602s,故 Ml比 M2快。但通常不这样做,而是采用执行时间的算术平均值或几何平均值来综合评价机器的性能。如果考虑每个程序的使用频度而用加权平均的方式,结果会更准确。

也可以将执行时间进行归一化来得到被测试的机器相对于参考机器的性能。执行时间的归一化值=参考机器上的执行时间÷被测机器上的执行时间

例如, SPEC 比值(SPEC ratio)是指将测试程序在Sun SPARCstation上运行时的执行时间除以该程序在测试机器上的执行时间所得到的比值。比值越大,机器的性能越好。

使用基准程序进行计算机性能评测也存在一些缺陷,因为基准程序的性能可能与某一小段的短代码密切相关,此时,硬件系统设计人员或编译器开发者可能会针对这些代码片段进行特殊的优化,使得执行这段代码的速度非常快,以至于得到不准确的性能评测结果。例如, Intel Pentium处理器运行SPECint时用了公司内部使用的特殊编译器,使其性能表现得很高,但用户实际使用的是普通编译器,达不到所标称的性能。又如,矩阵乘法程序SPECmatrix300有99%的时间运行在一行语句上,有些厂商用特殊编译器优化该语句,使性能达到VAX 11/780的729.8倍!

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dao-道法自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值