以下为个人学习笔记和习题整理
书籍:计算机组成与设计:软 / 硬件接口 (Computer Organization And Design: The Hardware/Software Interface)、计算机系统基础(第 2 版 袁春风)
https://www.bilibili.com/video/BV1qa4y1j7xk

# 概述

The most beautiful thing we can experience is the mysterious . It is the source of all true art and science. —— Albert Einstein, What I Believe, 1930

  • 我们能体验的最美好的事物是神秘,它是一切真正的艺术和科学的源泉。 —— 阿尔伯特・爱因斯坦,《我的信仰》,1930

# 关于本书

我们认为,在 计算机科学和工程 (computer science and engineering) 中的学习应该反映该领域 当前的状态 ,并介绍形成、塑造计算的那些原理。我们还认为,计算机各专业的读者都需要理解决定 计算机系统能力 (capabilities)性能 (performance)能耗 (energy) 以及最终的成功与否的 组成范式 (organizational paradigms)

Wikipedia: Paradigm

In science and philosophy, a paradigm (/ˈpærədaɪm/) is a distinct set of concepts or thought patterns , including theories, research methods, postulates, and standards for what constitutes legitimate contributions to a field.

  • 在科学和哲学中,范式是一套独特的 概念思维模式 ,包括理论、研究方法、假设和对某一领域作出合理贡献的标准。
  • 现代计算机技术要求每一个计算机专业的专业人员都要同时了解 硬件软件 。不同层次的硬件和软件之间的 交互 也为理解 计算的基本原理 提供了一个框架。无论你的主要兴趣是硬件还是软件,计算机科学还是电气工程, 计算机组成和设计 的中心思想都是相同的。因此,本书的重点是展示硬件和软件之间的关系,并着重介绍当今计算机中的基础概念。

    最近从 单处理器 (uniprocessor)多核微处理器 (multicore microprocessors) 的转变证实了这个观点的正确性,这是第一版以来给出的。

    • 虽然程序员可以忽略这些建议,而依靠计算机架构师、编译器作者和芯片工程师来让他们的程序运行得更快或更节能,而不修改程序,但那个时代已经结束了。为了使程序运行得更快,它们必须成为 并行的 (parallel)

    • 虽然许多研究人员的目标是让程序员可以不考虑他们正在编程的 硬件的底层并行特性 ,但要实现这一愿景还需要很多年。我们的观点是,至少在接下来的十年里,如果想让程序在 并行计算机 上高效运行,大多数程序员将不得不理解 硬件/软件接口

  • 这本书的受众包括那些:

    1. 汇编语言 (assembly language)逻辑设计 (logic design) 方面缺乏经验、需要理解 基本的计算机组成 的人,以及

    2. 具有汇编语言和 / 或逻辑设计背景,想要学习 如何设计一个计算机理解系统如何工作 以及为什么它这样运行的读者。

# 计算应用的分类及其特性

智能家电手机 再到最大的 超级计算机 ,它们虽然都使用一组 通用的硬件技术 (见章节 1.4 和 1.5),但这些不同的应用有 不同的设计需求 ,并以不同的方式使用这些核心的硬件技术。

广义地说,计算机用于三类不同的应用:

  1. 个人计算机 (Personal computers, PCs):也许是最广为人知的计算机形式,本书的读者可能已经广泛使用。

    • 个人计算机强调以低成本向 单个用户 提供良好的性能,通常运行 第三方软件
    • 这类计算机推动了许多计算技术的发展,而这些技术只有大约 35 年的历史!
  2. 服务器 (Servers):曾经大得多的计算机的现代形式,通常只能 通过网络访问

    • 服务器是面向 承载大型工作负载 的。这些负载可以是由 单个复杂的应用 组成的,通常是科学或工程应用,也可以是处理 许多小型工作 的,例如在构建一个大型的 web 服务器时发生的工作。

      这些应用通常基于 来自其他来源的软件 (如数据库或模拟系统),但通常会针对特定功能进行修改或定制。

    • 服务器采用与桌面计算机 相同的基本技术 ,但提供更大的计算、存储和输入 / 输出能力。

    • 一般来说,服务器也更重视 可靠性 ,因为崩溃的代价通常比单用户 PC 更高。

    服务器成本和能力 上的差异最大:

    • 在低端,一台服务器可能比一台 没有屏幕或键盘的桌面计算机 多一点,价格为 1000 美元。这些低端服务器通常用于文件存储、小型商业应用或简单的 web 服务(见章节 6.10)。
    • 另一个极端是 超级计算机 ,目前由数万个处理器和 许多 TB 的内存 组成,成本高达数千万到数亿美元。超级计算机通常用于高端的 科学和工程计算 ,如天气预报、石油勘探、蛋白质结构测定和其他大规模问题。尽管这类超级计算机代表了 计算能力的顶峰 ,但它们只占服务器和整个计算机市场收入的相对较小的一部分。
    Terminology: terabyte

    terabyte (TB): Originally 1,099,511,627,776 ( 2402^{40} ) bytes, although communications and secondary storage systems developers started using the term to mean 1,000,000,000,000 ( 101210^{12} ) bytes.

    • To reduce confusion, we now use the term tebibyte (TiB) for 2402^{40} bytes, defining terabyte (TB) to mean 101210^{12} bytes.

    • Figure 1.1 shows the full range of decimal and binary values and names.

      Untitled_0

  3. 嵌入式计算机 (Embedded computers):计算机中 规模最大 ,应用和性能上范围最广的一类。嵌入式计算机包括汽车中的微处理器、电视机中的计算机,以及控制现代飞机或货船的处理器网络 (networks of processors)

    • 嵌入式计算系统的设计目的是运行一个或一组相关的应用程序,这些应用程序通常 与硬件集成 并作为单个系统交付给用户。因此,尽管有大量的嵌入式计算机,大多数用户从来没有真正看到他们正在使用计算机!

      Embedded computer: A computer inside another device used for running one predetermined application or collection of software .

      • 嵌入式计算机:一个存在于另一个设备中的计算机,用于运行一个预先定义的应用程序,或一组软件。
    • 嵌入式应用通常有独特的应用需求,这些需求结合了 最低性能严格的成本或功耗限制 。例如,考虑一个音乐播放器:处理器只需要尽可能快地处理其 有限的功能 ,除此之外,最大限度地 降低成本和功耗 是最重要的目标。

      尽管价格低廉,嵌入式计算机 对故障的容忍度 却往往较低,因为其结果可能从令人不适(例如,新电视机无法正常工作)到毁灭性(例如,飞机或货船失事)不等。

      • 面向消费者 的嵌入式应用中,例如数字家电,可靠性主要是通过 简单设计 (simplicity) 实现的,重点是尽可能完美地完成 一个功能
      • 大型嵌入式系统 中,经常使用来自 服务器领域 的冗余技术。
    • 虽然这本书的重点是通用计算机,大多数概念可直接或者稍微修改之后用于嵌入式计算机。

    Elaboration: processor cores

    Many embedded processors are designed using processor cores , a version of a processor written in a hardware description language, such as Verilog or VHDL (see Chapter 4). The core allows a designer to integrate other application-specific hardware with the processor core for fabrication on a single chip.

    • 许多 嵌入式处理器 都是使用 处理器核 设计的,处理器核是用 硬件描述语言 编写的处理器版本(如 Verilog 或 VHDL,见第 4 章)。处理器核允许设计者将其他 特定于应用程序的硬件 集成到处理器核中,以便在单个芯片上制造。

# 欢迎来到后 PC 时代

技术的持续进步带来了 计算机硬件代际变化 ,撼动了整个信息技术产业。自上一版以来,我们经历了如此重大的变化,就像 30 年前开始转向个人电脑一样。

  1. 代替 PC 的是 个人移动设备 (PMD, personal mobile device)。PMD 由电池供电,通过无线方式连接到互联网,通常需要花费数百美元,并且像个人电脑一样,用户可以下载 软件 (“apps”) 来运行它们。

    • 与个人电脑不同的是,它们不再有键盘和鼠标,而更有可能依赖于触摸屏,甚至语音输入。
    • 今天的 PMD 是 智能手机平板电脑 ,但明天它可能包括电子眼镜。
  2. 取代传统 服务器 的是 云计算 (Cloud Computing),它依赖于大型 数据中心 ,这些数据中心现在被称为 仓储规模计算机 (WSC) (Warehouse Scale Computers)。

    • 像 Amazon 和谷歌这样的公司构建了包含 10 万台服务器的 WSC,然后让一些公司可以 租用 其中的一部分,这样他们就可以向 PMD 提供 软件服务 ,而不必自己构建 WSC。
    • 事实上,通过云部署的 软件即服务 (SaaS, Software as a Service) 正在彻底改变软件行业,就像 PMD 和 WSC 正在彻底改变硬件行业一样。今天的软件开发人员通常会让他们的应用程序的一部分 运行在 PMD 上 ,另一部分 运行在云上

    软件即服务 (SaaS):通过互联网 以服务的形式 提供 软件数据 ,通常是通过运行在本地客户端设备上的 浏览器 等小的程序,向远程的服务器发送请求,而不是在该设备上运行所有的二进制代码(一部分在服务器端执行)。例如 网络搜索 (web search) 和社交网络。

# 你能从本书学到什么

成功的程序员总是关心其程序的 性能 (performance) ,因为让用户 快速得到结果 对软件成功与否至关重要。

  • 在 20 世纪 60 年代和 70 年代,计算机性能的一个主要限制是计算机 内存的大小 。因此,程序员通常遵循一个简单的信条: 最小化占用的内存空间 以使程序更快。

  • 在过去的十年里, 计算机设计存储器技术 的进步 大大降低了 少占内存容量在大多数应用中的重要性,除了嵌入式计算系统中的应用。

  • 对性能感兴趣的程序员现在需要理解已经 取代 20 世纪 60 年代 简单内存模型 的事物:处理器的并行特性内存的层次特性(★)

  • 此外,当今的程序员需要考虑运行在 PMD 或云上的程序的 能耗效率 (energy efficiency)(见 1.7 节),这就要求他们了解自己 代码之下 的许多细节。

因此,程序员为了构建 具有竞争力 的软件版本,必须增加他们对 计算机组成 的认识。

我们很荣幸有机会为你解释,这台革命性的机器,计算机的 内部结构 ,解开 程序之下的软件 以及 计算机外壳之下的硬件

  • We are honored to have the opportunity to explain what’s inside this revolutionary machine,
  • unraveling the software below your program and the hardware under the covers of your computer.
当你读完这本书的时候,我们相信你能回答以下问题。
Question Explanation
How are programs written in a high-level language , such as C or Java, translated into the language of the hardware , and how does the hardware execute the resulting program? Comprehending these concepts forms the basis of understanding the aspects of both the hardware and software that affect program performance .
What is the interface between the software and the hardware, and how does software instruct the hardware to perform needed functions? These concepts are vital to understanding how to write many kinds of software.
What determines the performance of a program , and how can a programmer improve the performance? As we will see, this depends on the original program , the software translation of that program into the computer’s language, and the effectiveness of the hardware in executing the program.
What techniques can be used by hardware designers to improve performance? This book will introduce the basic concepts of modern computer design. The interested reader will find much more material on this topic in our advanced book, Computer Architecture: A Quantitative Approach .
What techniques can be used by hardware designers to improve energy efficiency? What can the programmer do to help or hinder energy efficiency?
What are the reasons for and the consequences of the recent switch from sequential processing to parallel processing ? This book gives the motivation , describes the current hardware mechanisms to support parallelism, and surveys the new generation of “multicore” microprocessors (see Chapter 6).
Since the first commercial computer in 1951, what great ideas did computer architects come up with that lay the foundation of modern computing? (Margin, explain the line above) multicore microprocessor : A microprocessor containing multiple processors (“cores”) in a single integrated circuit.
  • Without understanding the answers to these questions, improving the performance of your program on a modern computer or evaluating what features might make one computer better than another for a particular application will be a complex process of trial and error, rather than a scientific procedure driven by insight and analysis.

# 理解程序的性能

Understanding Program Performance

The performance of a program depends on a combination of

  • the effectiveness of the algorithms used in the program,
  • the software systems used to create and translate the program into machine instructions , and
  • the effectiveness of the computer in executing those instructions, which may include input/output (I/O) operations .

This table summarizes how the hardware and software affect performance.

Hardware or software component How this component affects performance Where is this topic covered?
Algorithm Determines both the number of source-level statements and the number of I/O operations executed Other books!
Programming language, compiler, and architecture Determines the number of computer instructions for each source-level statement Chapters 2 and 3
Processor and memory system Determines how fast instructions can be executed Chapters 4, 5, and 6
I/O system (hardware and operating system) Determines how fast I/O operations may be executed Chapters 4, 5, and 6

# 贯穿本书的程序实例

a C program: multiplies a matrix times a vector

To demonstrate the impact of the ideas in this book, we improve the performance of a C program that multiplies a matrix times a vector in a sequence of chapters. Each step leverages understanding how the underlying hardware really works in a modern microprocessor to improve performance by a factor of 200!

Where? Category Idea Factor
Chapter 3 data level parallelism use subword parallelism via C intrinsics 3.8
Chapter 4 instruction level parallelism use loop unrolling to exploit multiple instruction issue and out-of-order execution hardware 2.3
Chapter 5 memory hierarchy optimization use cache blocking to increase performance on large matrices 2.5
Chapter 6 thread level parallelism use parallel for loops in OpenMP to exploit multicore hardware 14

# 计算机体系结构中的八个伟大思想

Civilization advances by extending the number of important operations which we can perform without thinking about them .

  • 不关注具体过程 的情况下完成 更多的 重要操作,这种方法促进了文明的进步。—— Alfred North Whitehead, An Introduction to Mathematics, 1911

现在我们介绍 计算机架构师 (computer architects) 在过去 60 年的计算机设计中提出的 8 个 伟大思想 (great ideas)

  • 这些思想是如此强大,以至于在首台应用它们的计算机出现之后的很长时间里,新的架构师们通过 模仿他们的前辈 来表达钦佩之情。
  • 这些伟大思想将是我们将在本章和后续章节中穿插的主题。为了指出它们的影响,在本节中,我们将介绍代表伟大思想的图标和突出显示的术语,并使用它们来指出这本书中近 100 个以使用这些伟大思想为特色的小节。
Great idea Description of the Great idea Description of the icon icon
面向摩尔定律设计(Design for Moore’s Law) 计算机设计者面临的一个永恒的问题就是主要由 摩尔定律 (Moore’s Law) 所驱动的快速变化。摩尔定律指出,单芯片上的集成度每 18-24 个月翻一番。摩尔定律源于 Intel 创始人之一 Gordon Moore 在 1965 年对集成电路集成度的增长做出的预测。由于计算机设计可能需要数年时间,因此在项目结束时,单芯片的集成度相对于设计开始时很容易翻一番甚至翻两番。就像双向飞碟射击者一样,计算机架构师们必须预测其设计完成时的工艺水平,而不是设计开始时的。 我们使用 “向上和向右” 的摩尔定律图来代表面向快速变化的设计。 Untitled_2
使用抽象简化设计(Use Abstraction to Simplify Design) 计算机架构师和程序员都必须发明技术来提高自己的工作效率,否则根据摩尔定律,设计时间会像资源增长一样急剧延长。硬件和软件的主要生产力技术是使用 抽象 来表示不同层次的设计隐藏较低层次的细节,以便在较高层次上提供更简单的模型。 我们将使用抽象绘画图标来表示第二个伟大的想法。 Untitled_3
使得常见情况快速处理(Make the Common Case Fast) 使得 常见情况 快速处理比优化罕见情况更能提高性能。具有讽刺意味的是,常见的情况通常比罕见的情况更简单,因此通常更容易增强。这个常识性建议意味着你知道常见的情况是什么,这只有通过仔细的实验和测量才能实现(见第 1.6 节)。 我们用一辆跑车作为使得常见情况快速处理的图标,因为最常见的旅行有一到两个乘客,当然,制造一辆快速的跑车比一辆快速的小型货车更容易! Untitled_4
通过并行提高性能(Performance via Parallelism) 自从计算机出现以来,计算机架构师们已经提供了通过并行执行操作 (performing operations in parallel) 来获得更高性能的设计。在这本书中,我们会看到许多并行的例子。 我们使用一架飞机的多个喷气发动机作为 并行性能 的图标。 Untitled_5
通过流水线提高性能(Performance via Pipelining) 在计算机体系结构中,有一种特殊的并行模式如此流行,以至于它值得拥有自己的名字: 流水线 (pipelining) 。例如许多西部片中,一些坏人在制造火灾,在消防车出现之前会有一个 “救火队列” 负责灭火:村民们组成一个人链来携带水源至火场,因为他们可以更快地沿着链上移动水桶,而不是每个人都在来回奔跑。 我们的流水线图标是一个管道序列,每个部分代表流水线的一个阶段。 Untitled_6
通过预测提高性能(Performance via Prediction) 正如谚语 “求人准许不如求人原谅” 所说,最后一个伟大的想法是 预测 :在某些情况下,假设从错误预测中恢复的机制代价并不太高,并且你的预测相对准确,那么猜测并开始工作等到确定之后再进行工作要快得多。 我们用算命师的水晶球作为我们预测的图标。 Untitled_7
存储器的层次结构(Hierarchy of Memories) 程序员希望内存快、大、便宜,因为内存速度通常决定性能,容量限制了可以解决的问题的大小,而内存的成本通常是计算机成本的主要部分。架构师发现,他们可以通过 存储器的层次结构 来解决这些冲突的需求,在层次结构的顶部使用最快、最小和每比特价格最昂贵的存储器,而在底层使用最慢、最大和每比特价格最便宜的存储器。正如我们将在第 5 章中看到的,高速缓存 (caches) 给程序员一种错觉,即主存几乎和层次结构顶部的存储器一样快,并和层次结构底部的存储器一样大,一样便宜。 我们使用一个分层的三角形图标来表示存储器的层次结构。形状表示着速度,成本和大小:越接近顶部的,是更快和每比特价格更昂贵的存储器;底部越宽,存储器越大。 Untitled_8
通过冗余提高可靠性(Dependability via Redundancy) 计算机不仅需要速度快,还需要工作可靠。由于任何物理设备都可能发生故障,因此我们通过 包含冗余组件 来确保系统的可靠性,这些冗余组件可以在故障发生时替代失效部件,并可以帮助检测故障 我们使用牵引车作为我们的图标,因为它的后轴两侧各有两个轮胎,即使一个轮胎坏了,卡车也可以继续行驶。(据推测,卡车司机会立即前往维修厂修理漏气的轮胎,从而恢复冗余!) Untitled_9

# 程序之下的软件(Below Your Program)

一个典型的 应用程序 (如字处理程序、大型数据库系统)可以由 数百万行代码 构成,并依赖于实现复杂功能的 软件库 (software libraries) 来支持应用程序。

  • 正如我们将看到的,计算机中的 硬件 只能执行极其简单的低级指令 (low-level instructions)
  • 复杂的应用程序简单的指令 ,需要调用 几个层次的软件 来将这些高级操作 (high-level operations)解释 (interpret)翻译 (translate) 为简单的计算机指令。而这是 伟大思想 中的 抽象 的一个的例子。Abstraction
  1. 如图所示,这些 软件层 主要以 分层的方式 组织,其中 应用程序 (applications) 位于最外层的环,而各种 系统软件 (systems software) 则位于 硬件应用软件 之间。

    Untitled_10

    systems software: Software that provides services that are commonly useful , including operating systems , compilers , loaders , and assemblers

    • 系统软件:提供 常用服务 的软件,包括 操作系统编译器加载器汇编器
  2. 有许多类型的 系统软件 ,但其中有两种类型的系统软件是当今每个 计算机系统的中心操作系统编译器

    1. 操作系统 (operating system):是 用户程序硬件 之间的接口,提供各种 服务监控功能 (supervisory functions) 。其中最重要的功能是:

      • 处理基本的输入和输出操作
      • 分配存储和内存
      • 在同时使用计算机的多个应用程序之间提供受保护的计算机共享资源

      当前我们使用的操作系统的例子有 Linux、iOS 和 Windows。

      operating system: Supervising program that manages the resources of a computer for the benefit of the programs that run on that computer.

      • 操作系统:为使计算机上运行的程序受益而管理 计算机资源监督程序
    2. 编译器 (compilers):执行另一个重要的功能:将用 高级语言 (如 C、C++ 或 Java)编写的程序,翻译成硬件可以执行的 指令

      • 由于 现代编程语言 的复杂性和 硬件所执行的指令 的简单性,从高级语言程序到硬件指令的转换是复杂的。
      • 我们在这里简要概述这个过程,然后在第二章和附录 A 中进行更深入的讨论。

      compiler: A program that translates high-level language statements into assembly language statements .

      • 编译器:把 高级语言语句 翻译成 汇编语言语句 的程序。

# 从高级语言到硬件语言

# 位和指令

想要真正地与 电子硬件 (electronic hardware) 对话,你需要发送 电子信号 (electrical signals)

  • 计算机最容易理解的信号是 开和关 (on and off) ,所以 计算机的字母表 只有 两个字母
  • 就像 英语字母表 中的 26 个字母并不限制我们可以写多少一样,计算机字母表中的两个字母也不限制 计算机能够做什么
  1. 两个字母 的两个符号表示是数字 01

    • 我们通常将 计算机语言 (computer language) 认为是 以 2 为基数的数字 (numbers in base 2),或称 二进制数 (binary numbers)
    • 我们把每个 “字母” (letter) 称为一个 二进制数字 (binary digit)位 (bit)

    binary digit: Also called a bit . One of the two numbers in base 2 (0 or 1) that are the components of information .

    • 二进制数字:也称一个以 2 为基数 (0 或 1) 的两个数字之一,它们是构成信息的组件
  2. 计算机是我们的命令的奴隶 (slaves to our commands),这些命令被称为 指令 (instructions)

    • 这些指令,也不过是 位的集合体 (collections of bits),由计算机所理解和遵守,可以被认为是 数字 (numbers) 。例如,位的集合

      1000110010100000

      让一台计算机将两个数字相加。

    • 在第二章中,我们将解释为什么使用 数字 来表示 指令数据 。我们不想抢了这一章的风头,但指令和数据 “都使用数字表示” 是计算的基础。

    instruction: A command that computer hardware understands and obeys.

    • 指令:计算机硬件 所理解和遵守的 命令

# 汇编语言

最初的第一批程序员用 二进制数 与计算机交流,但这太乏味了。于是他们很快发明了 更接近人类思维方式 的新 符号

  • 起初,这些符号是手工转换成二进制的,但是这个过程仍然很累人。
  • 于是,先驱们利用计算机帮助编写计算机程序,发明了将 符号表示法 转换成 二进制 的一些 程序
  1. 这些程序中的第一个被称为 汇编器 (assembler)。这个程序将 指令符号版本 转换成 二进制版本 。例如,程序员会写

    add A,B

    而汇编器会把这个符号转换成

    1000110010100000

    这条指令告诉计算机将两个数字 A 和 B 相加。

    assembler : A program that translates a symbolic version of instructions into the binary version .

    • 汇编器:把 指令符号版本 转换成 二进制版本 的程序。
  2. 为这种 符号语言 (symbolic language) 创造的名字至今仍在使用,也就是 汇编语言 (assembly language)

    • 相应的,机器所能理解的 二进制语言 (binary language) 就是 机器语言 (machine language)

    assembly language : A symbolic representation of machine instructions.

    • 汇编语言:机器指令的 符号表示

    machine language : A binary representation of machine instructions.

    • 机器语言:机器指令的 二进制表示

# 高级语言

虽然这是一个巨大的进步,但 汇编语言 与科学家可能喜欢用来模拟流体流动或会计可能用来平衡账簿的符号仍然相距甚远。

  • 汇编语言要求程序员为计算机执行的 每条指令 写一行代码,这迫使程序员 像计算机一样思考
  • 人们认识到,可以编写一个 程序 ,将 更强大的语言 翻译成计算机指令,这是计算机早期的重大突破之一。
  1. 今天的程序员把重获他们的生产力(以及他们的理智)归功于 高级编程语言编译器 的创造,编译器将这些高级语言编写的程序翻译成指令。

  2. 编译器 使程序员能够编写这样的 高级语言 表达式:

    A + B

    编译器会把它 编译 (compile) 成下面这个 汇编语言 语句:

    add A,B

    如之前所述,汇编器 将这条语句转换成 二进制指令 ,告诉计算机将 A 和 B 这两个数字相加。

    high-level programming language : A portable language such as C, C++, Java, or Visual Basic that is composed of words and algebraic notation that can be translated by a compiler into assembly language .

    • 高级编程语言:一种可移植语言,如 C、C++、Java 或 Visual Basic,由单词代数符号组成,可由编译器翻译成汇编语言
  3. 高级编程语言 提供了以下几个重要的好处:

    1. 首先,这些高级编程语言允许程序员使用 更自然的语言 进行思考,使用英语单词和代数符号,从而使程序看起来更像 文本 (text) ,而不是神秘符号表。

      此外,高级编程语言允许 根据语言的预期用途 来设计语言。

      • 因此,Fortran 是为科学计算而设计的,Cobol 是为业务数据处理而设计的,Lisp 是为符号操作而设计的,等等。
      • 还有一些特定于领域的语言,甚至适用于更小的用户群体,例如那些对模拟流体感兴趣的用户。
    2. 高级编程语言的第二个优势是提高了程序员的生产力

      在软件开发中,少数几个被广泛认可的领域之一是,如果用需要 更少的行 来表达一个想法的语言来编写程序,那么开发程序所需的时间就会更少。

      • 简明 是高级语言相对于 汇编语言 的明显优势。
    3. 最后一个优点是高级编程语言允许程序 独立于编写它们的计算机 ,因为 编译器汇编器 可以将高级语言程序翻译成 任何计算机的二进制指令

    这三个优势是如此强大,以至于今天 很少有编程 是用 汇编语言 完成的。

# 完整示例:编译程序和语言之间的关系

  1. The following shows the relationships among these programs and languages , which are more examples of the power of abstraction .

    下面展示了这些 程序 (编译器、汇编器)语言 之间的关系,它们是 抽象 力量的更多例子。Abstraction

    1. High-level language program (in C)

      swap(int v[], int k) {
          int temp;
          temp = v[k];
          v[k] = v[k+1];
          v[k+1] = temp;
      }

      编译器 将高级语言 编译 (compiled) 成汇编语言。

    2. Assembly language program (for MIPS)

      swap:
          multi   $2, $5,4
          add     $2, $4,$2
          lw      $15, 0($2)
          lw      $16, 4($2)
          sw      $16, 0($2)
          sw      $15, 4($2)
          jr      $31

      汇编器 将汇编语言 汇编 (assembled) 成二进制机器语言。

    3. Binary machine language program (for MIPS)

      00000000101000100000000100011000
      00000000100000100001000000100001
      10001101111000100000000000000000
      10001110000100100000000000000100
      10101110000100100000000000000000
      10101101111000100000000000000100
      00000011111000000000000000001000
  2. Although the translation from high-level language to binary machine language is shown in two steps , some compilers cut out the middleman and produce binary machine language directly . These languages and this program are examined in more detail in Chapter 2.

    • 虽然从高级语言二进制机器语言的转换在这里是分 两个步骤 进行的,但有些编译器却 去掉了中间环节直接生成 二进制机器语言。这些语言和这个程序将在第二章中详细讨论。

# 外壳之下的硬件(Under the Covers)

现在我们已经揭示了你的 程序之下底层软件,让我们打开你的 计算机的外壳 来了解 底层硬件

  1. 任何计算机 的底层硬件都执行 相同的基本功能

    1. 输入数据 (inputting data)
    2. 输出数据 (outputting data)
    3. 处理数据 (processing data)
    4. 存储数据 (storing data)

    如何执行这些功能是本书的主要主题,后面的章节将讨论这四个任务的不同部分。

    当我们谈到这本书中一个 重要的观点 ,一个我们希望你 永远记住它 的非常重要的观点时,我们通过将它视为 Big Picture 来强调它。

    • 在这本书中,我们有十几张 Big Picture,第一张是计算机执行 “输入、输出、处理和存储数据” 任务的五个组成部分,如下所示。
  2. 计算机典型的 五个组成部分 如下,后两者有时结合起来称为 处理器 (processor)The BIG Picture

    1. 输入 (input)
    2. 输出 (output)
    3. 存储器 (memory)
    4. 数据通路 (datapath)
    5. 控制器 (control)

    PS: 中译版称, 数据通路 (datapath) 在计算机中也称 运算器

    Untitled_12

    如图所示,图 1.5 展示了 标准的计算机的组成 ,典型的五个组成部分。

    • 处理器存储器 中获取指令和数据。
    • 输入存储器 写入数据,输出存储器 读取数据。
    • 控制器 发送决定 数据通路存储器输入输出 操作的 信号

    这个组成是 独立于硬件技术 的:你可以把 任何计算机 中的 任何部件 ,无论是过去的和现在的,放在这 五个类别 (categories) 之一。

# 输入 / 输出设备

计算机的两个关键部件是 输入设备 (input devices)(如麦克风)和 输出设备 (output devices)(如扬声器)。

  • 顾名思义, 输入 (input) 是向计算机输入的东西,而 输出 (output) 是发送给用户的计算结果。

    As the names suggest, input feeds the computer, and output is the result of computation sent to the user.

  • 有些设备,如 无线网络 (wireless networks) ,既向计算机提供输入,也向计算机提供输出。

    input device: A mechanism through which the computer is fed information , such as a keyboard.

    • 输入设备:向计算机 输入信息 的装置,如键盘。

    output device: A mechanism that conveys the result of a computation to a user, such as a display, or to another computer.

    • 输出设备:一种把 计算结果 传送给用户(如通过显示器),或传送给另一台计算机的装置。

# 显示器 *

最吸引人的 I/O 设备可能是 图形显示,大多数个人移动设备使用 液晶显示器 (LCD) 来获得轻薄而低功耗的显示。

  1. 液晶屏不是光源,相反,它 控制着光的传输 :典型的液晶显示器包含液体中的 棒状分子 ,这些分子形成 扭曲的螺旋 ,使进入显示器的 光线弯曲 ,光线来自显示器后面的光源,少量来自于反射光。当 电流施加 时,棒状分子就会变直,不再弯曲光线。

    • 由于液晶材料是在两个 90 度偏振 的光屏之间,光不能通过,除非光被弯曲。

      liquid crystal display: A display technology using a thin layer of liquid polymers that can be used to transmit or block light according to whether a charge is applied.

      • 液晶显示器 (LCD):一种显示技术,使用一层薄薄的 液体聚合物 ,可以根据是否带电来 传输遮挡 光线。
    • 如今,大多数 LCD 显示器使用一个 有源矩阵 (active matrix) ,每个像素上都有一个微小的 晶体管开关 ,以精确控制电流并产生更清晰的图像。与显示器上的每个点相关联的 红 - 绿 - 蓝遮罩 (red-green-blue mask) 决定了最终图像中三种颜色分量的强度;在彩色有源矩阵液晶显示器中,每一点有三个晶体管开关。

      active matrix display: A liquid crystal display using a transistor to control the transmission of light at each individual pixel .

      • 有源矩阵显示器:一种液晶显示器,使用一个 晶体管 来控制光在每个单独的 像素 中的传输。
  2. 图像是一个由图像元素或称 像素 (pixels) 组成的 矩阵 ,可以表示为一个由 组成的矩阵,称为 位图 (bit map) 。根据 屏幕的尺寸分辨率 (ppi) ,显示矩阵有着不同的大小(如 1024 * 768)。彩色显示器可以为三种颜色(红、蓝、绿)中的每一种使用 8 位,即为每像素 24 位,从而允许显示数百万种不同的颜色。

    pixel: The smallest individual picture element . Screens are composed of hundreds of thousands to millions of pixels, organized in a matrix .

    • 像素:最小的单个 图像元素 。屏幕是由数十万到数百万个像素组成的,组织在一个 矩阵 中。
  3. 计算机硬件 对图形的支持主要包括一个 光栅刷新缓冲区 (raster refresh buffer) ,或 帧缓冲区 (frame buffer) ,以存储位图。要在屏幕上显示的图像存储在帧缓冲区中,每个像素的位模式以 刷新率 (refresh rate) 读取到图形显示器上。图 1.6 显示了一个简化设计的帧缓冲区,每像素只有 4 位。左边的帧缓冲区中的每个坐标,决定了右边的光栅扫描 CRT 显示屏对应坐标的深浅。

    Untitled_13

    • 位图的目标是如实地显示屏幕上的内容。图形系统面临的挑战在于,人类的眼睛能够很好地探测到屏幕上哪怕是细微的变化。

# 触摸屏

  1. 个人电脑使用 LCD 显示器,但后 PC 时代的 平板电脑智能手机 已经用 触控式显示器 (touch sensitive displays) 取代了键盘和鼠标。

    • 触控式显示器具有美妙的用户界面优势:用户直接指向他们感兴趣的东西,而不是通过鼠标间接指向他们感兴趣的东西。
  2. 虽然触摸屏的实现方式多种多样,但如今许多平板电脑都采用 电容传感技术 (capacitive sensing)

    由于人是电导体,如果像玻璃这样的绝缘体被 透明导体 覆盖,触摸将使得屏幕的 静电场扭曲 ,从而导致 电容的变化

    • 这项技术允许同时进行多次触摸,这使得可以在触摸屏上使用 手势 (gestures) ,从而有更具吸引力的用户界面。

# 集成电路:计算机的外壳之下

如下所示,图 1.7 展示了 Apple iPad 2 平板电脑的 内部结构

Untitled_14

  1. 不出所料,在计算机典型的 五个组成部分 中, I/O 主导着这种阅读设备。 数据通路控制器存储器 只是这些组件的一小部分。

    • 这些 I/O 设备包括电容式多点触控液晶显示器前置摄像头后置摄像头麦克风耳机插孔扬声器加速计陀螺仪Wi-Fi 网络蓝牙网络
  2. 环绕在中间的 金属表壳周围 的小部件就是我们所说的 计算机 ;它们通常是 L 型 的,可以紧挨着电池放在表壳里。

    如下所示,图 1.8 为 金属表壳左下方 的 L 型板的特写,这是包含 处理器存储器 的逻辑印刷电路板。这张照片突出显示了 5 个集成电路

    Untitled_15

    1. 中间的大型集成电路是苹果公司的 A5 芯片,该芯片中包含了运行频率为 1GHz 的 ARM 双核处理器 和 512MB 的 主存 (main memory)

    2. (右侧的)与左边类似大小的芯片是用于 非易失性存储 的 32GB 闪存 (flash memory) 芯片。

      两个芯片之间有一个空白的空间,可以安装第二个闪存芯片,使 iPad 的存储容量增加一倍。

    3. A5 左边的芯片包括 电源控制器I/O 控制器 芯片。

  3. 图 1.8 中的这些小矩形包含了驱动我们 不断进步的技术 的设备,称为 集成电路 (integrated circuits),昵称 芯片 (chips)

    integrated circuit: Also called a chip . A device combining dozens to millions of transistors .

    • 集成电路:也称 芯片,一种由几十个到数百万个 晶体管 组成的设备。
    • 图 1.8 中所示的 A5 芯片中,包含两个时钟速率为 1GHz 的 ARM 处理器。

      The processor is the active part of the computer, following the instructions of a program to the letter. It adds numbers, tests numbers, signals I/O devices to activate, and so on.

      • 处理器是计算机中 最活动的部分 。它严格按照 程序中的指令 运行,将数字相加,测试结果,并按结果发出控制信号使 I/O 设备做出动作,等等。
    • 有时,人们称处理器为 CPU,以表示听起来更官僚的 中央处理单元 (central processor unit)

# 中央处理器 CPU

  1. 为进一步理解硬件,图 1.9 展示了一款 微处理器 (microprocessor) 的内部细节。

    Untitled_16

    A5 芯片内部的 处理器 集成电路。芯片的尺寸为 12.1mm × 10.1mm,最初是用 45nm 工艺 制造的 (见 1.5 节)。

    • 左半部分靠中间的位置是两个相同的 ARM 处理器
    • 左上角的四分之一部分是具有 4 条 数据通路图形处理单元 (graphical processor unit, GPU)
    • 左下角和底部是与 主存 (main memory) (DRAM) 的接口。
  2. 处理器 逻辑上 包括两个主要组件: 数据通路控制器 ,分别相当于处理器的 肌肉大脑

    1. 数据通路 (datapath):处理器中执行 算数运算 (arithmetic operations) 的部件。

    2. 控制器 (control):处理器中 根据程序的指令 指挥数据通路、存储器和 I/O 设备的部件。

# 内存 Memory

图 1.8 中的 A5 芯片中还有两个 存储器芯片 (memory chips) ,每个芯片的容量为 2 gibibits,共 512 MiB

  1. 内存 (memory)程序 运行时存放的地方,它同时还包含程序运行时所需的 数据

    memory: The storage area in which programs are kept when they are running and that contains the data needed by the running programs.

    • 内存:程序运行时的存储区域,同时也用于存放程序运行时所需要的数据
  2. 内存是用 DRAM 芯片制造的,DRAM 表示 动态随机存取存储器 (dynamic random access memory)

    1. 内存由 多片 DRAM 芯片 组成,用来承载程序的 指令和数据

      dynamic random access memory (DRAM): Memory built as an integrated circuit ; it provides random access to any location.

      • 动态随机存取存储器 (DRAM): 集成电路 形式的存储器,它提供对任何位置的 随机存取
    2. 与磁带等 顺序存取存储器 (sequential access memories) 相比,DRAM 术语中的 RAM 部分 意味着:

      • 无论 读取存储器的 哪一部分 ,访问存储器 所花的时间 基本上是 相同的

# 高速缓存 Cache

进一步深入了解任何一个硬件部件会加深对计算机的理解。在 处理器的内部 使用的是 另一种类型 的存储器 —— 高速缓存。

  1. 高速缓存 (Cache memory) 由一种 小而快的存储器 组成,一般作为 DRAM 的 缓冲 (buffer)

    cache memory: A small, fast memory that acts as a buffer for a slower, larger memory.

    • 高速缓存:一种 小而快 的存储器,它作为一个 慢而大 的存储器的 缓冲
  2. 高速缓存是使用另一种存储器技术制造的,称为静态随机访问存储器 (static random access memory, SRAM)

    static random access memory (SRAM): Also memory built as an integrated circuit , but faster and less dense than DRAM.

    • 静态随机存取存储器 (SRAM):也是一种 集成电路 形式的存储器,但 比 DRAM 更快 ,集成度更低。
    • SRAM 比 DRAM 更快,但 密集度更低 ,因此 更昂贵 。SRAM 和 DRAM 是 存储器层次结构 中的两层。Hierarchy

# 计算机体系结构

如之前所述,改进设计的其中一个 伟大思想 是抽象。最重要的 抽象 之一是 硬件 (hardware)底层软件 (lowest-level software) 之间的 接口

  • 由于该 抽象 的重要性,它被赋予了一个 特殊的名称 :计算机的 指令集体系结构 (instruction set architecture),或简称 体系结构 (architecture)
  1. 计算机体系结构包括 程序员 为了使二进制 机器语言程序 能够 正确工作 所需知道的所有信息,包括指令、I/O 设备,等等。

    1. 通常, 操作系统 将会封装 I/O操作内存分配 和其他 低级的系统功能 的细节,从而使 应用程序员 无需在这些细节上分心。

      instruction set architecture: Also called architecture. An abstract interface between the hardware and the lowest-level software that encompasses all the information necessary to write a machine language program that will run correctly, including instructions, registers, memory access, I/O, and so on.

      • 指令集体系结构:也称体系结构,是 硬件低层次软件 之间的一种 抽象接口,它包含了编写能够正确运行的 机器语言程序 所必需的所有信息,包括指令寄存器存储器访问、I/O 等。
    2. 提供给应用程序员的 基本指令集操作系统接口 合称为 应用程序二进制接口 (application binary interface, ABI)

      application binary interface (ABI): The user portion of the instruction set plus the operating system interfaces used by application programmers. It defines a standard for binary portability across computers.

      • 应用程序二进制接口 (ABI):指令集的用户部分加上应用程序员使用的操作系统接口。它定义了一个计算机间的二进制可移植性的标准。
  2. 计算机体系结构可以让 计算机设计者 独立地讨论 功能,而不必考虑执行这些功能的 具体硬件

    1. 例如,我们可以在讨论 数字时钟的功能 (如计时、显示时间、设置闹钟)时,不涉及 时钟的硬件 (如石英晶体,LED 显示屏,塑料按钮)。

      implementation: Hardware that obeys the architecture abstraction .

      • (体系结构的)实现:符合 体系结构抽象硬件
    2. 计算机设计者将 体系结构体系结构的实现 区分开来的思路是一样的:体系结构的实现是 符合体系结构抽象 的硬件。The BIG Picture

      这些想法带给了我们另一个 BIG picture

      • Both hardware and software consist of hierarchical layers using abstraction , with each lower layer hiding details from the level above.

        • 无论硬件还是软件都可以使用 抽象 分成 多个层次,每个较低的层次把 细节对上层隐藏 起来。
      • One key interface between the levels of abstraction is the instruction set architecture —the interface between the hardware and low-level software. This abstract interface enables many implementations of varying cost and performance to run identical software .

        • 抽象层次中的一个 关键接口指令集体系结构 —— 硬件和底层软件之间的接口。这个抽象接口使得 同一软件 可以由成本和性能不同的 许多实现 来完成。

# 辅助存储:存储数据的安全的地方

  1. 目前为止,我们已经理解了如何输入数据,如何使用这些数据进行计算,以及如何显示结果。

    1. 然而,一旦关掉电源,所有数据就丢失了,因为计算机中的 内存易失性存储器 (volatile memory)

      volatile memory: Storage, such as DRAM , that retains data only if it is receiving power .

      • 易失性存储器:类似 DRAM 的存储器,仅在 加电时 保持数据。
    2. 与之不同的是,如果关掉 DVD 机 的电源,所记录的内容将不会丢失,因为 DVD 采用的是 非易失性存储器 (nonvolatile memory)

      nonvolatile memory: A form of memory that retains data even in the absence of a power source and that is used to store programs between runs. A DVD disk is nonvolatile.

      • 非易失性存储器:在掉电时仍可保持数据的存储器,用于存储两次运行之间的程序,例如 DVD。
  2. 为了区分 易失性存储器非易失性存储器 ,我们将前者称为 主存储器 (main memory 或 primary memory),将后者称为 二级存储器 (secondary memory)

    • 二级存储器形成了 存储器层次 中下面更低的一层。Hierarchy

      main memory: Also called primary memory . Memory used to hold programs while they are running; typically consists of DRAM in today’s computers.

      • 主存储器:也称主要存储器。这个存储器用来保持运行中的程序,在现代计算机中一般由 DRAM 组成

      secondary memory: Nonvolatile memory used to store programs and data between runs ; typically consists of flash memory in PMDs and magnetic disks in servers.

      • 二级存储器:非易失性存储器,用来保存两次运行之间的程序和数据。在个人移动设备中一般由 闪存 组成,在服务器中由 磁盘 组成。
    1. DRAM 自 1975 年起在 主存储器 中占主导地位,而 磁盘 (magnetic disk)二级存储器 中占主导地位的时间更早。

      magnetic disk: Also called hard disk . A form of nonvolatile secondary memory composed of rotating platters coated with a magnetic recording material. Because they are rotating mechanical devices, access times are about 5 to 20 milliseconds.

      • 磁盘:也叫硬盘 (hard disk),是使用涂有磁性记录材料旋转盘片为基础构成的非易失性二级存储设备。因为是旋转的机械设备,所以磁盘的访问时间大约是 5~20 毫秒。
    2. 由于器件尺寸和前面所述的特点,非易失性 半导体 存储器 —— 闪存 (flash memory)个人移动设备 中替代了磁盘。图 1.8 所示的 iPad 2 中的芯片上包含了闪存。

      • 除了非易失性外,闪存 比 DRAM 慢 ,但却 便宜很多 。虽然每位的 价格高于磁盘 ,但是闪存在体积、电容、可靠性和能耗方面都优于磁盘。因此闪存是 PMD 的二级存储器的标准。

      • 遗憾的是,与硬盘和 DRAM 不同的是,闪存具有写 100,000 ~ 1,000,000 次后 老化或损坏 的弱点。因此,文件系统必须记录写操作的数目,而且具备避免存储器损坏的策略,例如,避免移动经常使用的数据。

      flash memory: A nonvolatile semiconductor memory. It is cheaper and slower than DRAM but more expensive per bit and faster than magnetic disks. Access times are about 5 to 50 microseconds.

      • 闪存:一种非易失性半导体存储器,单位价格和速度均低于 DRAM,但单位价格比磁盘高,速度比磁盘快。其访问时间大约为 5~50 毫秒。

# 集成电路的制造技术

处理器存储器 正在以难以置信的速度进步,因为计算机设计者一直采用 最新的电子技术 进行设计,以期在竞争中取得优势。

  • 图 1.10 描述了一段时间以来计算机所使用的不断进步的技术,以及每种技术的 每单位成本 下的 相对性能

    Untitled_17

  • 这些技术确定了 计算机能够做什么 ,以及 以多快的速度 发展变化。我们相信,所有计算机专业人员都应该熟悉 集成电路 的基础知识。

# 晶体管与集成电路

晶体管 (transistor) 仅仅是一种受电流控制的 开关 ,而 集成电路 (integrated circuit, IC) 则是由 成千上万个晶体管 组成的芯片。

  • 当戈登・摩尔预测 资源持续翻番 时,他是在预测 单芯片晶体管数量 的增长速度。为了描述这些晶体管从几百个增长到成千上万的情形,形容词 “超大规模” 被添加到术语中,简写为 VLSI超大规模集成电路 (very large-scale integrated circuit)

    very large-scale integrated (VLSI) circuit: A device containing hundreds of thousands to millions of transistors.

    • 超大规模集成电路:由 数十万数百万 晶体管组成的电路。
  • 集成度 (integration) 的增长率是 相当稳定 的。图 1.11 表示自 1977 年以来 DRAM 容量 的发展情况。近 20 多年以来,每隔 3 年 DRAM 的容量就增长 4 倍,累积增长已超过 16000 倍。

    Untitled_18

# 集成电路的制造过程

为了理解 集成电路 的制造过程,我们从头开始介绍。芯片的制造从 硅 (silicon) 开始,硅是沙子中的一种物质。因为硅的 导电能力不强 ,因此称为 半导体

  1. 通过一种特殊的化学工艺,人们可以在硅中 添加某些材料 ,把其 微小的区域 转变为以下三种类型之一:

    1. 优良的 导电体 (conductor) (使用微小的铜线或铝线)
    2. 优良的 电绝缘体 (insulator) (类似于塑料外壳或玻璃)
    3. 特殊条件下 可以导电或绝缘的区域(类似 开关

    晶体管 属于第三种。VLSI 电路,则是由数亿个上述 三种材料组合 起来并封装在一起所制成的。


  2. 集成电路的 制造过程芯片的价格 非常关键,因此对计算机设计者十分重要。图 1.12 表示了集成电路制造的整个过程。

    Untitled_19

    FIGURE 1.12 The chip manufacturing process.

    芯片制造的全过程如下:

    • 硅锭 切下来之后, 空白的晶圆 经过大约 20~40 步的加工,产生 图样化的晶圆 (见图 1.13)。

      • 这些图样化的晶圆由 晶圆测试器 进行测试,测试后生成一张图,表明哪些部分是合格的。
    • 之后,这些 晶圆 被进一步切成 芯片 (见图 1.9)。在本图中,一个晶圆能生产 20 个芯片,其中有 17 个通过测试。( × 意味着这个芯片是坏的)

      • 本例中芯片的良率(又称成品率)是 17/20,也就是 85%。
    • 这些 合格芯片封装 起来,并且在发布给用户之前经过多次测试。不合格的封装会在最终测试中被发现。

    1. 集成电路的制造是从 晶体硅锭 (silicon crystal ingot) 开始的,它像一根巨大的香肠。目前使用的硅锭直径约 8-12 英寸,长度约 12-24 英寸。

      silicon crystal ingot: A rod composed of a silicon crystal that is between 8 and 12 inches in diameter and about 12 to 24 inches long.

      • 晶体硅锭:一块由 硅晶体 组成的 。直径大约在 8-12 英寸,长度约 12-24 英寸。
    2. 硅锭经切片机 切成 厚度不超过 0.1 英寸的许多 晶圆 (wafer)

      wafer: A slice from a silicon ingot no more than 0.1 inches thick, used to create chips .

      • 晶圆:从 硅锭 上切下的不超过 0.1 英寸厚的 薄片,用于制造 芯片
      • 这些晶圆经过一系列的加工步骤,在此过程中, 化学物质的图案 被放置在每个晶圆上,形成前面讨论过的 晶体管导体绝缘体

      • 如今的集成电路只包含 一层晶体管 ,但是可能具有多个 绝缘层 间隔的 2~8 层 金属导体

    3. 晶圆片本身或图样化的几十个步骤中的一个 微小缺陷 都可能导致该晶圆片 失效 。这些所谓的 瑕疵 (defect) 使得制造出完美的晶圆实际上是 不可能 的。

      defect: A microscopic flaw in a wafer or in patterning steps that can result in the failure of the die containing that defect.

      • 瑕疵:晶圆或图样化工序上的 微小缺陷,它会导致含有该缺陷的 芯片失效

      Untitled_20

      1. 解决这一问题的最简单的方法是把 晶圆切分 成许多 独立的部分 ,也就是现在所称的 芯核 (die) ,更正式的叫法是 芯片 (chip) 。图 1.13 显示了微处理器被切丁之前的晶圆的照片,前面的图 1.9 则显示了单个微处理器芯片。

        die: The individual rectangular sections that are cut from a wafer , more informally known as chips .

        • 芯核:从 晶圆 上切下的单个 矩形部分,更通俗地称为 芯片
      2. 通过切分,可以只淘汰那些 有瑕疵的芯片 ,而不必淘汰整个晶圆。对这一过程的量化描述可以用 成品率 (yield) 来表示,其定义为晶圆片上的合格芯片数占总芯片数的百分比。

      3. 芯片尺寸增大 时,集成电路的价格会 快速上升 ,因为 成品率晶圆中芯片的总数 都下降了。为了降低成本,使用 下一代工艺 可以缩小晶体管和电线的尺寸,从而缩小了一个大的芯片,这改进了每晶圆的芯片数和成品率。2012 年的典型工艺尺寸为 32nm,这意味着芯片上的 最小特征尺寸 是 32nm。

    4. 合格芯片要连接到 I/O 引脚 上,这一过程称为 封装 。在封装之后,必须进行最后一次测试,因为封装过程也可能出错。最后芯片被交付给用户。

# 计算机的性能

对计算机的性能进行评价是 富有挑战性 的。由于 现代软件系统 的规模及其复杂性,加上 硬件设计者 采用了大量先进的 性能改进技术 ,使性能评价极为困难。

  1. 在不同的计算机中挑选合适的产品时, 性能 是一个重要的因素。 准确地测量和比较 不同的计算机对购买者而言是至关重要的,因此对计算机设计者也是如此,销售电脑的人也知道这一点。

    1. 通常,销售人员会希望用户看到他们的计算机 表现最好的一面 ,无论这一面是否准确地反映了购买者的应用需求。

    2. 因此,在选择计算机时,了解 如何最好地度量性能性能度量的局限性 是很重要的。

  2. 本节将首先介绍性能评价的不同方法,然后分别从 计算机用户计算机设计者 的角度描述性能测量的度量标准,最后还要分析这些 度量标准之间 有什么联系,并提出经典的 处理器性能方程式 ,我们在全书中都要使用它进行性能分析。

# 性能的定义

如果我们要指出 两台计算机 中哪台的性能更好,那么我们首先要对 性能 进行定义。

如果考虑 不同的性能度量 ,那么性能更好的计算机是不同的。我们可以用若干 不同的方法 定义计算机的性能。

  1. 如果你在两台不同的 桌面计算机 (desktop computer) 上运行同一个程序,那么你可以说 首先完成作业 的那台计算机更快。

    • 个人计算机用户会对降低 晌应时间 (response time) 感兴趣,响应时间是指从 开始一个任务 到该任务 完成 的时间,又称为 执行时间 (execution time)

      response time: Also called execution time . The total time required for the computer to complete a task , including disk accesses, memory accesses, I/O activities, operating system overhead, CPU execution time, and so on.

      • 响应时间:也叫执行时间,是计算机完成某任务所需的总时间,包括硬盘访问内存访问I/O 活动操作系统开销CPU 执行时间 等。
  2. 如果你运行的是一个 数据中心 (data center) ,它有好几台服务器供很多用户投放作业,那么你会说在一天之内 完成作业最多 的那台计算机更快。

    • 数据中心的管理员所感兴趣的常常是提高 吞吐率 (throughput) 或称 带宽 (bandwidth),它指的是在 给定的时间 内所 完成的工作总量

      throughput: Also called bandwidth . Another measure of performance, it is the number of tasks completed per unit time .

      • 吞吐率:也叫 带宽,性能的另一种度量参数,表示 单位时间完成的任务数量

    因此,在大多数情况下,我们需要使用 不同的性能指标不同的应用程序集 来对个人移动设备和服务器进行 基准测试 (benchmark) ,前者更关注响应时间,而后者更关注吞吐率。

    Throughput and Response Time

    EXAMPLE Do the following changes to a computer system increase throughput , decrease response time , or both?

    • Replacing the processor in a computer with a faster version

    • Adding additional processors to a system that uses multiple processors for separate tasks—for example, searching the web


    ANSWER Decreasing response time almost always improves throughput .

    • Hence, in case 1, both response time and throughput are improved.

    • In case 2, no one task gets work done faster, so only throughput increases.

    If, however, the demand for processing in the second case was almost as large as the throughput , the system might force requests to queue up .

    • In this case, increasing the throughput could also improve response time , since it would reduce the waiting time in the queue.

    • Thus, in many real computer systems, changing either execution time or throughput often affects the other.


  3. 在讨论计算机的性能时,本书前几章将主要考虑 响应时间 方面。为了使 性能最大化 ,我们希望将任务的响应时间最小化,也即 执行时间最小化

    1. 因此,对于某个计算机 X ,我们可以将计算机的 性能执行时间 联系起来:

       Performance X=1 Execution time X\text { Performance }_{\mathrm{X}}=\frac{1}{\text { Execution time }_{\mathrm{X}}}

      这意味着对于两台计算机 XY ,如果 X 的性能大于 Y 的性能,我们有

       Performance X> Performance Y\text { Performance }_{\mathrm{X}}>\text { Performance }_{\mathrm{Y}}

      1 Execution time X>1 Execution time Y\frac{1}{\text { Execution time }_{X}}>\frac{1}{\text { Execution time }_{Y}}

      从而得出

       Execution time Y> Execution time X\text { Execution time }_{\mathrm{Y}}>\text { Execution time }_{\mathrm{X}}

      也就是说,如果 XY 快,那么在 Y 上的执行时间比在 X 上的长。


    2. 在讨论 计算机设计 时,我们经常想把两台计算机的性能 定量地联系起来 。我们会用短语 “ XY 快 n 倍” 来表示:

       Performance X Performance Y=n\frac{\text { Performance }_{\mathrm{X}}}{\text { Performance }_{\mathrm{Y}}}=n

      如果 XY 快 n 倍,那么在 Y 上的执行时间是在 X 上的执行时间的 n 倍,即

       Performance X Performance Y= Execution time Y Execution time X=n\frac{\text { Performance }_{\mathrm{X}}}{\text { Performance }_{\mathrm{Y}}}=\frac{\text { Execution time }_{\mathrm{Y}}}{\text { Execution time }_{\mathrm{X}}}=n

      Relative Performance

      EXAMPLE If computer A runs a program in 10 seconds and computer B runs the same program in 15 seconds, how much faster is A than B?


      ANSWER We know that A is n times as fast as B if

       Performance A Performance B= Execution time B Execution time A=n\frac{\text { Performance }_{\mathrm{A}}}{\text { Performance }_{\mathrm{B}}}=\frac{\text { Execution time }_{\mathrm{B}}}{\text { Execution time }_{\mathrm{A}}}=n

      Thus the performance ratio is

      1510=1.5\frac{15}{10}=1.5

      and A is therefore 1.5 times as fast as B .

      在以上的例子中,我们可以说,计算机 B 比计算机 A 慢 (slower than) 1.5 倍,因为

       Performance A Performance B=1.5\frac{\text { Performance }_{\mathrm{A}}}{\text { Performance }_{\mathrm{B}}}=1.5

      这意味着

       Performance A1.5= Performance B\frac{\text { Performance }_{\mathrm{A}}}{1.5}=\text { Performance }_{\mathrm{B}}

      为了简单起见,当我们试图将计算机的比较结果量化时,我们通常使用术语 “比什么快 (as fast as)”

      • 因为 性能执行时间倒数关系 ,提高性能就需要减少执行时间。
      • 为了避免对术语 “增加 “和 “降低 “潜在的误解,当我们想说 ”增加性能” 或者 “降低执行时间” 的时候,我们通常会说 “改善性能”“改善执行时间”

# 性能的度量

时间 (time) 是衡量 计算机性能 的标准:在 最短时间 内完成 相同工作量 的计算机是最快的。

  • 程序的 执行时间 (execution time) 一般以秒为单位。然而,时间可以用不同的方式定义,这取决与我们的 计算中所包含的内容

# 时间的不同定义

  1. 对时间最直接的定义是 墙上时钟时间 (wall clock time),也叫 响应时间 (response time)消逝时间 (elapsed time) 等。( 通常意义上的宏观的时间 )

    这些术语均表示 完成一个任务 所需的 总时间 ,包括了硬盘访问内存访问I/O 操作操作系统开销一切时间

  2. 然而,计算机通常是 共享的 (shared) ,一个处理器需要 同时运行几个程序 。在这种情况下,系统可能更侧重于优化吞吐率,而不是最小化一个程序的消逝时间

    Hence, we often want to distinguish between the elapsed time and the time over which the processor is working on our behalf .

    • 因此,我们往往要把运行我们 自己的任务 的时间与一般的 消逝时间 区别开来。
    1. 我们可以使用 CPU 执行时间 (CPU execution time),简称 CPU 时间 (CPU time),来进行区分 (★),它指的是 CPU 为计算 这个任务 所花费的时间,不包括 等待 I/O运行其他程序 所花费的时间。(但是,需要注意的是, 用户 感受到的 响应时间 将是程序的 消逝时间 ,而不是 CPU 时间

      CPU execution time: Also called CPU time . The actual time the CPU spends computing for a specific task .

      • CPU 执行时间:简称 CPU 时间,执行 某一任务 而在 CPU 上所实际花费的时间。
    2. CPU 时间还可以进一步划分为在 程序 中花费的 CPU 时间,称为 用户 CPU 时间 (user CPU time),和在 操作系统为该程序而执行的一些任务 所花费的 CPU 时间,称为 系统 CPU 时间 (system CPU time)

      • 要精确区分这两种 CPU 时间是 困难的 ,因为通常难以分清哪些 操作系统活动 是属于哪个 用户程序 的,而且操作系统之间的功能也存在差异。

        Wikipedia: CPU time

        CPU time or CPU usage can be reported either for each thread , for each process or for the entire system . Moreover, depending on what exactly the CPU was doing, the reported values can be subdivided in:

        • User time is the amount of time the CPU was busy executing code in user space .

        • System time is the amount of time the CPU was busy executing code in kernel space .

          If this value is reported for a thread or process , then it represents the amount of time the kernel was doing work on behalf of the executing context , for example, after a thread issued a system call .

        • Idle time (for the whole system only) is the amount of time the CPU was not busy , or, otherwise, the amount of time it executed the System Idle process. Idle time actually measures unused CPU capacity .

        • Steal time (for the whole system only), on virtualized hardware , is the amount of time the operating system wanted to execute, but was not allowed to by the hypervisor . This can happen if the physical hardware runs multiple guest operating system and the hypervisor chose to allocate a CPU time slot to another one.

        user CPU time: The CPU time spent in a program itself .

        • 用户 CPU 时间:在 程序本身 所花费的 CPU 时间。

        system CPU time: The CPU time spent in the operating system performing tasks on behalf of the program .

        • 系统 CPU 时间:为执行程序 而花费在 操作系统 上的时间。
  3. 为了一致性,我们保持基于 消逝时间 的性能和基于 CPU 执行时间 的性能之间的差异。

    • 我们使用术语 系统性能 (system performance) 表示一个 空载系统 上的 消逝时间 ,并用术语 CPU 性能 (CPU performance) 表示 用户 CPU 时间

    • 在本章中,我们将重点放在 CPU 性能 上,尽管我们对如何总结性能的讨论既适用于 消逝时间 的度量(系统性能),也适用于 CPU 时间 的度量。

# 时钟周期

虽然作为 计算机用户 我们关心的是 时间 ,但当我们深入研究计算机的细节时,使用 其他的度量 可能更为方便。

  1. 计算机设计者 来说,他们需要考虑如何度量 计算机硬件 完成 基本功能 的速度。

    Almost all computers are constructed using a clock that determines when events take place in the hardware.

    • 几乎所有计算机都是用一个 时钟 (clock) 来决定硬件中的各种事件 何时发生
  2. 这些离散的 时间间隔 称为 时钟周期 (clock cycle)。也可用它的 倒数 来描述,称为 时钟频率 (clock rate)

    • 例如,时钟周期为 250ps,对应的时钟频率为 4GHz。

    clock cycle: Also called tick, clock tick, clock period, clock, or cycle. The time for one clock period , usually of the processor clock , which runs at a constant rate .

    • 时钟周期:计算机 一个时钟周期 的时间,通常是 处理器时钟,一般为 常数

    clock period: The length of each clock cycle .

    • 时钟长度:每个 时钟周期 持续的时间长度。

    在下一节(CPU 性能及其影响因素),我们将形式化地定义 硬件设计者时钟周期计算机使用者 所指的 之间的关系。

# CPU 性能及其影响因素

计算机用户计算机设计者 往往使用 不同的指标 来度量性能。如果我们能将这些不同的指标 联系起来 ,我们就能确定 计算机设计的改变用户所体验到的性能 的影响。

  1. 由于我们在这里仅限于关注 CPU 性能 ,所以性能度量实际上针对的是 CPU 执行时间


    下面一个简单的公式把最基本的指标( 时钟周期数 (clock cycles)时钟周期时间 (clock cycle time) )和 CPU 时间 联系起来:

     CPU execution time        for a program = CPU clock cycles        for a program × Clock cycle time \begin{array}{l} \text { CPU execution time } \\ \quad \ \ \ \ \ \ \text { for a program } \end{array} = \begin{array}{l} \text { CPU clock cycles } \\ \ \ \ \ \ \ \text { for a program } \end{array} \times \text { Clock cycle time }

    或者,由于时钟频率和时钟周期时间 互为倒数 ,故

     CPU execution time        for a program = CPU clock cycles for a program  Clock rate \begin{array}{l} \text { CPU execution time } \\ \quad \ \ \ \ \ \ \text { for a program } \end{array} = \frac{\text { CPU clock cycles for a program }}{\text { Clock rate }}

    这个公式(上面的式子)清楚地表明,硬件设计者可以通过减少 一个程序所需的时钟周期数时钟周期的长度 来提高性能。


  2. 正如我们将在后面的章节中看到的, 计算机设计者 经常面临这两个因素之间的 权衡 。许多技术在 减少时钟周期数 的同时也会引起 时钟周期时间的增加

    Improving Performance

    EXAMPLE Our favorite program runs in 10 seconds on computer A , which has a 2 GHz clock. We are trying to help a computer designer build a computer, B , which will run this program in 6 seconds .

    • The designer has determined that a substantial increase in the clock rate is possible, but this increase will affect the rest of the CPU design , causing computer B to require 1.2 times as many clock cycles as computer A for this program. What clock rate should we tell the designer to target?

    ANSWER Let’s first find the number of clock cycles required for the program on A :

    CPU timeA=CPU clock cycles A Clock rate A\mathrm{CPU} \ \mathrm{time}_{\mathrm{A}}=\frac{\mathrm{CPU} \text { clock cycles }_{\mathrm{A}}}{\text { Clock rate }_{\mathrm{A}}}

    10 seconds=CPU clock cycles A2×109 cycles / second \mathrm{10 \ seconds}=\frac{\mathrm{CPU} \text { clock cycles }_{\mathrm{A}}}{2 \times 10^{9} \text { cycles } / \text { second }}

     CPU clock cycles A=10 seconds ×2×109 cycles / second =20×109 cycles \text { CPU clock cycles }{ }_{\mathrm{A}}=10 \text { seconds } \times 2 \times 10^{9} \text { cycles } / \text { second }=20 \times 10^{9} \text { cycles }

    CPU time for B can be found using this equation:

    CPU timeB=1.2×CPU clock cycles A Clock rate B\mathrm{CPU} \ \mathrm{time}_{\mathrm{B}}=\frac{1.2 \times \mathrm{CPU} \text { clock cycles }_{\mathrm{A}}}{\text { Clock rate }_{\mathrm{B}}}

    6 seconds=1.2×20×109 cycles  Clock rate B\mathrm{6 \ seconds}=\frac{1.2 \times 20 \times 10^{9} \text { cycles }}{\text { Clock rate }_{\mathrm{B}}}

     Clock rate B=1.2×20×109 cycles 6 seconds =0.2×20×109 cycles / second =4×109 cycles / second =4 GHz\text { Clock rate }_{\mathrm{B}}=\frac{1.2 \times 20 \times 10^{9} \text { cycles }}{6 \text { seconds }}=0.2 \times 20 \times 10^{9} \text { cycles } / \text { second }=4 \times 10^{9} \text { cycles } / \text { second }=4 \ \mathrm{GHz}

    To run the program in 6 seconds, B must have twice the clock rate of A .

# 指令的性能

上述性能公式没有涉及程序所需的 指令的数量

 CPU execution time        for a program = CPU clock cycles        for a program × Clock cycle time \begin{array}{l} \text { CPU execution time } \\ \quad \ \ \ \ \ \ \text { for a program } \end{array} = \begin{array}{l} \text { CPU clock cycles } \\ \ \ \ \ \ \ \text { for a program } \end{array} \times \text { Clock cycle time }

  • 然而,由于 编译器 明确地生成了要执行的指令,而计算机是通过 执行这些指令 来运行程序的,因此 执行时间 一定依赖于程序中 指令的数量
  1. 一种考虑 执行时间 的方法是,执行时间等于 执行的指令数 乘以 每条指令的平均时间 。所以,一个程序需要的 时钟周期数 可写为

     CPU clock cycles = Instructions for a program × Average clock cycles  per instruction \text { CPU clock cycles }=\text { Instructions for a program } \times \begin{gathered} \text { Average clock cycles } \\ \text { per instruction } \end{gathered}

  2. 我们通常使用术语 CPI (clock cycles per instruction) 来表示 执行每条指令 所需的 时钟周期数平均值

    • 由于 不同的指令 执行 不同的操作 ,可能需要花费不同的时间,因此 CPI 是程序中执行的 所有指令的平均值

    • CPI 提供了一种比较相同 指令集体系结构 的两种 不同实现 的方法,因为一个程序执行的 指令数 在这种情况下是一样的。

    clock cycles per instruction (CPI): Average number of clock cycles per instruction for a program or program fragment.

    • CPI:每条指令的时钟周期数,表示执行某个程序或者程序片段时 每条指令 所需的 时钟周期平均数
    Using the Performance Equation

    EXAMPLE Suppose we have two implementations of the same instruction set architecture.

    • Computer A has a clock cycle time of 250 ps and a CPI of 2.0 for some program, and
    • Computer B has a clock cycle time of 500 ps and a CPI of 1.2 for the same program.

    Which computer is faster for this program and by how much?


    ANSWER We know that each computer executes the same number of instructions for the program; let’s call this number I .

    • First, find the number of processor clock cycles for each computer:

       CPU clock cycles A=I×2.0\text { CPU clock cycles }{ }_{\mathrm{A}}=I \times 2.0

       CPU clock cycles B=I×1.2\text { CPU clock cycles }{ }_{\mathrm{B}}=I \times 1.2

    • Now we can compute the CPU time for each computer:

      \begin{eqnarray} \label{eq} \text { CPU time }{ }_{\mathrm{A}}&=&\text { CPU clock cycles }{ }_{\mathrm{A}} \times \text { CPU clock time }{ }_{\mathrm{A}} \nonumber \\ \\ ~&=&I \times 2.0 \times 250 \ \mathrm{ps}=500 \times I \ \mathrm{ps} \end{eqnarray}

      Likewise, for B :

       CPU time B=I×1.2×500 ps=600×I ps\text { CPU time }{ }_{\mathrm{B}}=I \times 1.2 \times 500 \ \mathrm{ps}=600 \times I \ \mathrm{ps}

      Clearly, computer A is faster.


    • The amount faster is given by the ratio of the execution times :

       CPU performance A CPU performance B= Execution time B Execution time A=600×I ps500×I ps=1.2\frac{\text { CPU performance }_{\mathrm{A}}}{\text { CPU performance }_{\mathrm{B}}}=\frac{\text { Execution time }_{\mathrm{B}}}{\text { Execution time }_{\mathrm{A}}}=\frac{600 \times I \ \mathrm{ps}}{500 \times I \ \mathrm{ps}}=1.2

    We can conclude that computer A is 1.2 times as fast as computer B for this program.

# 经典的 CPU 性能公式

  1. 现在我们可以用 指令数 (instruction count)CPI时钟周期时间 来写出基本的 性能公式

    CPU time = Instruction count ×CPI× Clock cycle time \mathrm{CPU} \text { time }=\text { Instruction count } \times \mathrm{CPI} \times \text { Clock cycle time }

    或者,由于 时钟频率时钟周期时间 的倒数:

    CPU time = Instruction count ×CPI Clock rate \mathrm{CPU} \text { time }=\frac{\text { Instruction count } \times \mathrm{CPI}}{\text { Clock rate }}

    instruction count: The number of instructions executed by the program.

    • 指令数:一个程序所执行的 指令的数量
  2. 这两个公式特别有用,因为它们分离了 影响性能三个关键因素

    • 我们可以使用这个公式来比较两个 不同的实现 ,或者
    • 评估一个 设计方案 ,如果我们知道该设计方案对这 三个参数 的影响。
Comparing Code Segments

EXAMPLE A compiler designer is trying to decide between two code sequences for a particular computer .

The hardware designers have supplied the following facts ( CPI for each instruction class):

Untitled_21

For a particular high-level language statement , the compiler writer is considering two code sequences that require the following instruction counts :

Untitled_22

  • Which code sequence executes the most instructions ? Which will be faster ?
  • What is the CPI for each sequence?

ANSWER Sequence 1 executes 2+1+2=52 + 1 + 2 = 5 instructions. Sequence 2 executes 4+1+1=64 + 1 + 1 = 6 instructions.

  • Therefore, sequence 1 executes fewer instructions .


    We can use the equation for CPU clock cycles based on instruction count and CPI to find the total number of clock cycles for each sequence:

    CPU clock cycles =i=1n(CPIi×Ci)\mathrm{CPU} \text { clock cycles }=\sum_{i=1}^{n}\left(\mathrm{CPI}_{i} \times \mathrm{C}_{i}\right)

    注:与之前定义的 时钟周期数的平均值 的 CPI 不同,此处的 CPI 精确到 每一种指令

    This yields

    \begin{align*} & \text { CPI }{ }_{1} = (2 \times 1) + (1 \times 2) + (2 \times 3) = 2 + 2 + 6 = 10 \ \mathrm{cycles}\\ & \\ & \text { CPI }{ }_{2} = (4 \times 1) + (1 \times 2) + (1 \times 3) = 4 + 2 + 3 = 9 \ \mathrm{cycles} \end{align*}

    So code sequence 2 is faster , even though it executes one extra instruction.


  • Since code sequence 2 takes fewer overall clock cycles but has more instructions , it must have a lower CPI . The CPI values can be computed by

    CPI=CPU clock cycles  Instruction count \mathrm{CPI}=\frac{\mathrm{CPU} \text { clock cycles }}{\text { Instruction count }}

    This yields

    \begin{align*} & \text { CPI }{ }_{1}=\frac{\text { CPU clock cycles }{ }_{1}}{\text { Instruction count }{ }_{1}}=\frac{10}{5}=2.0\\ & \\ & \text { CPI }{ }_{2}=\frac{\text { CPU clock cycles }{ }_{2}}{\text { Instruction count }{ }_{2}}=\frac{9}{6}=1.5 \end{align*}
The Big Picture

[ FIGURE 1.15 ] The basic components of performance and how each is measured:

Components of performance Units of measure
CPU execution time for a program Seconds for the program
Instruction count Instructions executed for the program
Clock cycles per instruction (CPI) Average number of clock cycles per instruction
Clock cycle time Seconds per clock cycle

Figure 1.15 shows the basic measurements at different levels in the computer and what is being measured in each case. We can see how these factors are combined to yield execution time measured in seconds per program :

Remember that

CPU time = Instruction count ×CPI× Clock cycle time \mathrm{CPU} \text { time }=\text { Instruction count } \times \mathrm{CPI} \times \text { Clock cycle time }

Thus,

 Time = Seconds / Program = Instructions  Program × Clock cycles  Instruction × Seconds  Clock cycle \text { Time }=\text { Seconds } / \text { Program }=\frac{\text { Instructions }}{\text { Program }} \times \frac{\text { Clock cycles }}{\text { Instruction }} \times \frac{\text { Seconds }}{\text { Clock cycle }}

Always bear in mind that the only complete and reliable measure of computer performance is time . (★)

  • For example, changing the instruction set to lower the instruction count may lead to an organization with a slower clock cycle time or higher CPI that offsets the improvement in instruction count.
  • Similarly, because CPI depends on type of instructions executed, the code that executes the fewest number of instructions may not be the fastest.