9.6 本章小结 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯343
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
<!-- page: 23 -->
计算机组成与系统结构(第3版)
6
图1.3所示为个人计算机主板,其中有一个 CPU 芯片插座,用于插入相应的CPU 芯
片;通过PCI和PCIe×16等总线插槽可连接相应外设控制卡,从而连接更多的外设;内存
条也可插入内存条插槽进行扩充和更换。
PCl总线插槽
PCle×16总线插槽 PCle×1总线插槽
CPU芯片插座
内存条插槽
图1.3 台式个人计算机主板
图1.4是对计算机硬件进行解剖的示意图,显示了一台个人计算机的硬件结构分解过
程。计算机主机由多个电路板用总线连接而成,每个电路板上又焊接了多个集成电路芯片,
每个芯片中有十几个电路模块,每个模块中有上千万个单元,每个单元中有几个门电路,每
个门电路实现基本的逻辑运算,因为计算机中所有信息都采用二进制编码表示,二进制的1
和0对应逻辑值“真”和“假”,可方便地通过逻辑运算电路来实现算术运算。
个人计算机由
主机和外设组成
主机中包含
多个电路板
每个电路板上有
十几个集成电路组成
每个集成电路中
有十几个模块
每个门电路实现
基本逻辑运算
十
所有信息都用0 oB1
二进制编码表示
每个单元由几个
门电路组成
图1.4 个人计算机的硬件结构解剖
每个模块中有
上千万个单元
图1.5是Pentium 4处理器芯片的内部结构示意图。左边是芯片的显微照片,右边是
功能模块。Pentium 4处理器芯片中除了整数运算数据通路外,还集成了浮点运算数据通
<!-- page: 24 -->
计算机系统概述
路和多媒体处理数据通路。Pentium 4处理器将L? cache(包括指令 cache 和数据 cache)和
L2 cache 都做在了CPU芯片内。此外,还有具有支持高级流水线和超线程的部件,以及用
于I/O访问和存储器访问的接口部件。
控制器
控制器
VO接口
部件
指令cache
数据
cache
增强的浮点和
整数
多媒体部件
数据通路L2 cache
和主存接
口部件
控制器
高级流水线、
控制器
超线程支持
图1.5 Pentium4处理器芯片的内部组成
##### 1.2.2 计算机软件
计算机中的操作由存储并运行在其内部的程序进行控制,这是冯·诺依曼结构计算机
“存储程序”工作方式的重要特征。计算机软件就是指存储和运行在计算机硬件中的程序,
因此程序和软件质量的好坏将大大影响计算机性能的发挥。一般将软件分成应用软件和系
统软件两大类。
专门为数据处理、科学计算、事务管理、多媒体处理、工程设计以及过程控制等应用所编
写的各类程序都称为应用软件。例如,人们平时经常使用的电子邮件收发软件、视频播放软
件、游戏软件、炒股软件、文字处理软件、电子表格软件、演示文稿制作软件等都是应用软件。
系统软件包括为有效、安全地使用和管理计算机以及为开发和运行应用软件而提供的
各种软件,介于计算机硬件与应用软件之间,它与具体应用关系不大。系统软件包括操作系
统(如 Windows)、语言处理系统(如C语言编译器)、数据库管理系统(如 Oracle)和各类实
用程序(如磁盘碎片整理程序、备份程序)等。操作系统主要用来管理整个计算机系统的资
源,包括对它们进行调度、管理、监视和服务等,操作系统还提供计算机用户和硬件之间的人
机交互界面,并提供对应用软件的支持;语言处理系统主要用于提供一个用高级语言编程的
环境,包括源程序的编辑、转换、链接、装入和调试等功能;数据库管理系统是一种用于建立、
使用和维护数据库的软件系统。
1.3计算机系统层次结构
计算机系统是一个层次结构系统,每一层都通过向上层用户提供一个抽象的简洁接口
而将低层的实现细节隐藏起来。计算机解决应用问题的过程就是不同抽象层进行转换的
过程。
第1章
7
<!-- page: 25 -->
计算机组成与系统结构(第3版)
8
1.3.1计算机系统抽象层的转换
图1.6是计算机系统层次转换示意图,描述了从最终用户希望计算机完成的应用(问
题)到电子工程师使用器件完成基本电路设计的整个转换过程。
软件一
硬件;
虚
功能部件/RTL
由路
最终用户
程序员
架构师
电子工程师
图1.6 计算机系统抽象层及其转换
通常用自然语言对应用(问题)进行描述,但计算机硬件只能理解机器语言,要将一个自
然语言描述的应用问题转换为机器语言程序,需要经过多个抽象层的转换。
1.算法和程序
首先,要将应用问题转换为算法(algorithm)描述,使得应用问题的求解变成流程化的
清晰步骤,并能确保步骤是有限的。其次,将算法转换为用编程语言描述的程序(program),
需要程序员进行程序设计。编程语言(programming language)与自然语言不同,它有严格
的执行顺序,不存在二义性,能够唯一地确定计算机执行指令的顺序。
2.编程语言
编程语言可以分成高级语言和低级语言两类。高级语言(high-level language)和底层
计算机结构无关,大部分编程语言都是高级语言;低级语言(low-level language)则和运行程
序的计算机的底层结构密切相关,通常称为机器级语言(machine-level language)。机器语
言和汇编语言都是机器级语言。
机器语言(machine language)就是用二进制进行编码的机器指令(instruction),每条机
器指令都是一个0/1序列。机器语言程序的可读性很差,也不易记忆,给程序员的编写和阅
读带来极大的困难。因此,人们引入了一种机器语言的符号表示语言,通过用简短的英文符
号和二进制代码建立对应关系,以方便程序员编写和阅读,这种语言称为汇编语言
(assembly language)。
3.语言处理系统
与低级语言相比,高级语言的可读性要好得多,因此绝大部分程序员使用高级语言编写
程序。程序员编写的高级语言程序必须转换成机器语言程序才能被计算机直接执行。这个
转换过程是计算机自动完成的,因而需要有能够执行自动转换的程序,包含这种转换程序的
软件开发工具统称为语言处理系统。
任何一个语言处理系统中,都包含一个翻译程序(translator),它能把一种编程语言表
示的程序转换为等价的另一种编程语言程序。被翻译的语言和程序分别称为源语言和源程
<!-- page: 26 -->
计算机系统概述
序,翻译生成的语言和程序分别称为目标语言和目标程序。翻译程序有以下3类。
(1)汇编程序(assembler):也称汇编器,用来将汇编语言源程序翻译成机器语言目标
程序。
(2)解释程序(interpreter):也称解释器,用来将源程序中的语句按其执行顺序逐条翻
译成机器指令并立即执行。
(3)编译程序(compiler):也称编译器,用来将高级语言源程序翻译成汇编语言或机器
语言目标程序。
4.操作系统
所有的语言处理系统都必须在操作系统提供的计算机环境中运行,操作系统是对计算
机底层结构和计算机硬件的一种抽象,这种抽象构成了一台可以让程序员使用的虚拟机
(virtual machine)。
5.指令集体系结构
从应用问题到机器语言程序的每次转换所涉及的概念都是属于软件的范畴,而机器语
言程序所运行的计算机硬件和软件之间需要有一个“桥梁”,这个在软件和硬件之间的界面
就是指令集体系结构(instruction set architecture,ISA),简称体系结构或系统结构
(architecture),有时也称为指令系统或指令集架构,它是软件和硬件之间接口的一个完整
定义。ISA定义了一台计算机可以执行的所有指令的集合,每条指令规定了计算机执行什
么操作,所处理的操作数所存放的位置以及操作数的类型等。ISA 规定的内容包括指令格
式、指令操作类型,指令的操作数类型、寻址方式和可访问地址空间大小,程序可访问的寄存
器个数、位数和编号,控制寄存器的定义,I/O空间的编址方式,中断结构,机器工作状态的
定义和切换,输入/输出结构和数据传送方式,存储保护方式等。
因此,指令集体系结构是指软件能感知到的部分,也称软件可见部分。机器语言程序就
是一个ISA规定的指令的序列,因此,计算机硬件执行机器语言程序的过程就是执行程序
所包含的一条一条指令的过程。
6.微体系结构
ISA是对指令系统的一种规定或结构规范,而具体实现的组织(organization)称为微体
系结构(microarchitecture),简称微架构。ISA和微体系结构是两个不同层面上的概念,微
体系结构是软件不可感知的部分。例如,加法器采用串行进位方式还是并行进位方式实现
属于微体系结构范畴。相同的ISA可能具有不同的微体系结构,例如,对于Intel x86 这种
ISA,很多处理器的组织方式不同,即具有不同的微架构。
微体系结构由逻辑电路(logic circuit)实现,当然,微架构中的一个功能部件可以用不同
的逻辑来实现,用不同的逻辑实现方式得到的性能和成本有差异。最后,每个基本的逻辑电
路都是按照特定的器件技术(device technology)实现的。
1.3.2计算机系统的不同用户
按照在计算机上完成任务的不同,可以把使用计算机的用户分成以下4类:最终用户、
系统管理员、应用程序员和系统程序员。
使用应用程序完成特定任务的计算机用户称为最终用户(end user),例如,使用炒股软
件的股民,使用财会软件的会计等。最终用户使用键盘和鼠标等外设与计算机交互,通过操
第1章
9
<!-- page: 27 -->
计算机组成与系统结构(第3版)
10
作系统提供的用户界面启动执行应用程序,从而完成用户任务。
系统管理员(system administrator)是指利用操作系统、数据库管理系统等软件提供的
功能对系统进行配置、管理和维护,以建立高效合理的系统环境供计算机用户使用的操作人
员。其职责主要包括安装、配置和维护系统的硬件和软件,建立和管理用户账户,升级软件,
备份和恢复业务系统和数据等。
应用程序员(application programmer)是指使用高级编程语言编制应用软件的程序员。
应用程序员大多使用高级程序设计语言编写程序。系统程序员(system programmer)指设
计和开发操作系统、编译器、数据库管理程序等系统软件的程序员。
很多情况下,同一个人可能既是最终用户,又是系统管理员,同时还是应用程序员或系
统程序员。例如,对于一个计算机专业的学生来说,有时需要使用计算机玩游戏或网购物
品,此时为最终用户的角色;有时需要整理计算机磁盘中的碎片、升级系统或备份数据,此时
是系统管理员的角色;有时需要完成老师布置的一个应用程序的开发,此时是应用程序员的
角色;有时可能还需要完成老师布置的操作系统或编译程序等软件的开发,此时是系统程序
员的角色。
计算机系统可以认为是由各种硬件和各类软件采用层次化方式构建的系统,如图1.7
所示,不同用户工作在计算机系统的不同层次。
应用程序员、
最终用户
应用程序
-系统管理员
系统程序员
编译程序
汇编程序
操作系统
.CPU_
主存
数字设计
电路设计
Vo
指令集体系结构(ISA)
图1.7 计算机系统的层次化结构
从图1.7中可看出,ISA位于硬件和软件的交界面上,硬件所有的功能都由ISA集中体
现,软件通过ISA在计算机上执行。因此ISA 是整个计算机系统的核心部分。
ISA层下面是硬件部分,上面是软件部分。硬件部分包括 CPU、主存和输入/输出等主
要功能部件,这些功能部件通过数字逻辑电路设计实现。软件部分包括低层的系统软件和
高层的应用软件,汇编程序、编译程序和操作系统等这些系统软件直接在ISA上实现,系统
程序员所看到的机器的属性是属于ISA层面的内容,所看到的机器是配置了指令系统的机
器,称为机器语言机器,工作在该层次的程序员称为机器语言程序员;系统管理员工作在操
作系统层,所看到的是配置了操作系统的虚拟机器,称为操作系统虚拟机;汇编语言程序员
工作在提供汇编程序的虚拟机器级,所看到的机器称为汇编语言虚拟机;应用程序员大多工
作在提供编译器或解释器等翻译程序的语言处理系统层,因此,应用程序员大多用高级语言
编写程序,因而也称为高级语言程序员,所看到虚拟机器称为高级语言虚拟机;最终用户则
工作在最上面的应用程序层。
在计算机技术中,一个存在的事物或概念从某个角度看似乎不存在,即感觉不到实际存
<!-- page: 28 -->
计算机系统概述
在的事物或概念,则称其是透明的。通常,在一个计算机系统中,系统程序员所看到的底层
机器级的概念性结构和功能特性对高级语言程序员(通常就是应用程序员)来说是透明的,
即看不见或感觉不到。
1.4程序开发与执行过程
程序的开发和执行涉及计算机系统的各个不同层面,因而计算机系统层次结构的思想
体现在程序开发和执行过程的各个环节中。下面以简单的hello程序为例,简要介绍程序
的开发与执行过程,以便加深对计算机系统层次结构概念的认识。
1.4.1从源程序到可执行程序
以下是 hello.e 的 C语言源程序代码:
### 1 #include<stdio.h>
2
### 3 int main()
### 5 printf("hello, world\n");
61
为了让计算机能执行上述应用程序,应用程序员应按照以下步骤进行处理。
(1)通过程序编辑软件得到hello.c文件。hello.c在计算机中以ASCⅡ字符方式存放,
如图1.8所示,图中给出了每个字符对应的ASCII码的十进制值。
#i n c
u
d
1
e <s p> <s t di o
### 35 105 110 99 108 117 100 10132
### 60 115 116 100 105 111 46
h>\n \n int <sp>m ai n()\n{
### 104 62 10 10 105 110 11632109 97 105 110 40 41 10 123
\n<sp><sp><sp><sp> pri n tf (“h
1032
32
32
### 32 112 114 105 110 116 102 40 34 104 101 108
### 1 o
<8p> W
0
r ld \n” );\n }
### 108 111 44
32
### 119 111 114 108 100 92 110 34 41 59 10 125
图1.8 hello.c 源程序文件的表示
(2)将hello.c进行预处理、编译、汇编和链接,最终生成可执行目标文件。从 hello.c
到可执行目标文件 hello的转换过程如图1.9所示。
printf.o
hello.c
预处理程序
hello.i
编译程序
hello.s
汇编程序
hello.o
(cpp)
(ccl)
(as)
C 源程序
预处理过的
汇编源程序
可重定位
(文本文件)
源程序
(文本文件)
目标程序
(二进制
(文本文件)
文件)
图1.9 hello.c 源程序文件到可执行目标文件的转换过程
链接程序
(ld)
hello
可执行
目标程序
(二进制
文件)
第1章
11
<!-- page: 29 -->
计算机组成与系统结构(第3版)
12
在图1.9中,预处理程序(cpp)对源程序中以字符#开头的命令进行处理,例如,将
#include 命令后面的.h文件内容嵌入到源程序文件中。预处理程序的输出结果还是一个
源程序文件,以.i为扩展名。
编译程序(ccl)对预处理后的源程序进行编译,生成一个汇编语言源程序文件,以.s为
扩展名,例如,hello.s 是一个汇编语言程序文件。
汇编程序(as)对汇编语言源程序进行汇编,生成一个可重定位目标文件(relocatable
objeet file),以.o为扩展名,例如,hello.o是一个可重定位目标文件;它是一种二进制文件
(binary file),因为其中的代码已经是机器指令,数据以及其他信息也都用二进制表示,所以
它是不可读的,即打开显示出来的是乱码。
链接程序(ld)将多个可重定位目标文件和标准库函数合并成一个可执行目标文件
(executable object file),可执行目标文件简称为可执行文件。本例中,链接器将 hello.o 和
标准库函数 printf所在的可重定位目标模块 printf.o进行合并,生成可执行文件 hello。
最终生成的可执行文件保存在磁盘等外存中,可以通过某种方式启动可执行文件运行。
1.4.2可执行文件的启动和执行
对于一个存放在磁盘上的可执行文件,可以在操作系统提供的用户操作环境中,采用双
击对应图标或在命令行中输入可执行文件名等多种方式来启动执行。例如,对于上述可执
行文件 hello,通过shell 命令行解释器启动执行的结果如下:
unix>./hello
hello, world
unix>
shell 命令行解释器会显示提示符unix>,告知用户它准备接收用户的输入。此时,用
户可以在提示符后面输入需要执行的命令名,它可以是一个可执行文件在磁盘上的路径名,
例如,上述“./hello”就是可执行文件hello的路径名,其中“./”表示当前目录。在命令后用户
需按下 Enter 键表示结束。图1.10显示了hello程序在计算机中被启动并执行的整个过程。
CPU
寄存器堆
控制器
ALU
处理器总线
存储器总线
VO桥接器
②
总线接口
④
VO总线
③
(5)
主存储器
"/hello"
"hello,world\n"
USB
控制器
①
显示
适配卡
磁盘
控制器
扩展槽
鼠标键盘
显示器
"/hello"
" hello, world"
磁盘
hello可执行文件
图1.10 启动和执行 hello 程序的整个过程
<!-- page: 30 -->
计算机系统概述
如图1.10所示,shell程序会将用户从键盘输入的每个字符逐一读入CPU 寄存器中
(对应线①),然后再保存到主存储器中,在主存的缓冲区形成字符串"./hello"(对应线②)。
等到接收到Enter按键时,shell将调出操作系统内核中相应的服务例程,由内核来加载磁
盘上的可执行文件 hello 到存储器(对应线③)。内核加载完可执行文件中的代码及其所要
处理的数据(这里是字符串"hello,world\n")后,将hello 程序第一条指令的地址送到程序
计数器(program counter,PC)中,CPU永远都是将PC的内容作为将要执行的指令的地址,
因此,CPU随后从第一条指令开始执行hello程序,将加载到主存的字符串"hello,world\n"
中的每一个字符从主存取到CPU的寄存器中(对应线④),然后将 CPU寄存器中的字符送
到显示器上显示出来(对应线⑤)。
从上述过程可以看出,一个程序被启动执行,必须依靠操作系统的支持,包括外壳程序
和内核服务例程。例如,shell命令行解释器是操作系统外壳程序,它为用户提供了一个启
动程序执行的环境,用来对用户从键盘输入的命令进行解释,并调出操作系统内核来加载用
户程序(用户输入命令对应的程序)。显然,用来加载用户程序并使其从第一条指令开始执
行的操作系统内核服务例程也是必不可少的。此外,在上述过程中,涉及键盘、磁盘和显示
器等外部设备的操作,这些外部设备是不能由用户程序直接访问的,此时,也需要依靠操作
系统内核服务例程的支持,例如,用户程序需要调用内核的read系统调用服务例程读取磁
盘文件,或调用内核的write系统调用服务例程把字符串写到显示器中。
从图1.10可以看出,程序的执行过程就是数据在CPU、主存储器和1/O模块之间流动
的过程,所有数据的流动都通过总线、I/O桥接器等进行。数据在总线上传输之前,需要先
缓存在存储部件中,因此,除了主存储器本身是存储部件以外,在 CPU、I/O桥接器、设备控
制器中也有存放数据的缓冲存储部件,如CPU中的通用寄存器、设备控制器中的数据缓冲
寄存器等。
1.4.3程序与指令及控制信号的关系
程序以可执行文件形式存放在外存,其中一定包含机器代码段。可执行文件的执行实
际上是所包含的机器代码段执行的过程。机器代码段由一条一条机器指令(通常简称为指
令)构成。指令(instruction)就是用0和1表示的一串0/1序列,用来指示CPU完成一个特
定的原子操作,例如,取数指令从存储单元中取出数据存放到寄存器中;存数指令将寄存器
的内容写入存储单元;加法指令将两个寄存器内容相加后送入目标寄存器中;传送指令将一
个寄存器内容送到另一个寄存器中。
指令通常被划分为若干字段,有操作码字段、地址码字段和立即数字段等。操作码字段
指出指令的操作类型,如取数、加、减、传送、跳转等;地址码字段指出指令所处理的操作数所
存放的寄存器的编号或所在主存单元的地址等;立即数字段指出具体的一个操作数或偏移
地址等。
图1.11给出了实现两个相邻数组元素交换功能的不同层次语言的描述。如图1.11所
示,在高级语言源程序中,可直观地用三条赋值语句实现两个相邻数组元素的交换。在经编
译生成的汇编语言源程序中,上述三条赋值语句可转换为4条汇编指令,其中,两条是取数
指令lw(load word),另两条是存数指令sw(store word)。在经汇编后生成的机器语言目标
程序中,对应的机器指令是特定格式的二进制代码,例如,汇编指令“lw$15,0($2)”的机器
第1章
13
<!-- page: 31 -->
计算机组成与系统结构(第3版)
14
temp=v[k];
v[k]=v[k+1];
高级语言源程序
v[k+1]=temp;
编译程序
lw S15,0(S2)
计算机软件层
lw S16,4(S2)
汇编语言源程序
swS16,0(S2)
swS15,4(S2)
汇编程序