作者:Randal E. Bryant,David R. O'Hallaron

来源:华章计算机(hzbook_jsj)

计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的,它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件

处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在内存、I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分成层次结构——CPU寄存器在顶部,接着是多层的硬件高速缓存存储器DRAM主存磁盘存储器。在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特造价也更高。层次结构中较高层次的存储设备可以作为较低层次设备的高速缓存。通过理解和运用这种存储层次结构的知识,程序员可以优化C程序的性能。

操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象:1)文件是对I/O设备的抽象;2)虚拟内存是对主存和磁盘的抽象;3)进程是处理器、主存和I/O设备的抽象。

最后,网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种I/O设备

重要主题:系统不仅仅只是硬件。系统是硬件和系统软件互相交织的集合体,它们必须共同协作以达到运行应用程序的最终目的。本书的余下部分会讲述硬件和软件的详细内容,通过了解这些详细内容,你可以写出更快速、更可靠和更安全的程序。

我们在此强调几个贯穿计算机系统所有方面的重要概念。我们会在本文多处讨论这些概念的重要性。

01

Amdahl

Gene Amdahl,计算领域的早期先锋之一,对提升系统某一部分性能所带来的效果做出了简单却有见地的观察。这个观察被称为Amdahl定律(Amdahl’s law)。该定律的主要思想是,当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。若系统执行某应用程序需要时间为Told。假设系统某部分所需执行时间与该时间的比例为α,而该部分性能提升比例为k。即该部分初始所需时间为αTold,现在所需时间为(αTold)/k。因此,总的执行时间应为

Tnew=(1-α)Told+(αTold)/k=Told[(1-α)+α/k]

由此,可以计算加速比S=Told/Tnew为

举个例子,考虑这样一种情况,系统的某个部分初始耗时比例为60%(α=0.6),其加速比例因子为3(k=3)。则我们可以获得的加速比为1/[0.4+0.6/3]=1.67倍。虽然我们对系统的一个主要部分做出了重大改进,但是获得的系统加速比却明显小于这部分的加速比。这就是Amdahl定律的主要观点——要想显著加速整个系统,必须提升全系统中相当大的部分的速度。

表示相对性能

性能提升最好的表示方法就是用比例的形式Told/Tnew,其中,Told为原始系统所需时间,Tnew为修改后的系统所需时间。如果有所改进,则比值应大于1。我们用后缀“×”来表示比例,因此,“2.2×”读作“2.2倍”。

表示相对变化更传统的方法是用百分比,这种方法适用于变化小的情况,但其定义是模糊的。应该等于100·(Told-Tnew)/Tnew,还是100·(Told-Tnew)/Told,还是其他的值?此外,它对较大的变化也没有太大意义。与简单地说性能提升2.2×相比,“性能提升了120%”更难理解。

Amdahl定律一个有趣的特殊情况是考虑k趋向于∞时的效果。这就意味着,我们可以取系统的某一部分将其加速到一个点,在这个点上,这部分花费的时间可以忽略不计。于是我们得到

举个例子,如果60%的系统能够加速到不花时间的程度,我们获得的净加速比将仍只有1/0.4=2.5×。

Amdahl定律描述了改善任何过程的一般原则。除了可以用在加速计算机系统方面之外,它还可以用在公司试图降低刀片制造成本,或学生想要提高自己的绩点平均值等方面。也许它在计算机世界里是最有意义的,在这里我们常常把性能提升2倍或更高的比例因子。这么高的比例因子只有通过优化系统的大部分组件才能获得。

02

并行和并发

数字计算机的整个历史中,有两个需求是驱动进步的持续动力:一个是我们想要计算机做得更多,另一个是我们想要计算机运行得更快。当处理器能够同时做更多的事情时,这两个因素都会改进。我们用的术语并发(concurrency)是一个通用的概念,指一个同时具有多个活动的系统;而术语并行(parallelism)指的是用并发来使一个系统运行得更快。并行可以在计算机系统的多个抽象层次上运用。在此,我们按照系统层次结构中由高到低的顺序重点强调三个层次。

1 线程级并发

构建在进程这个抽象之上,我们能够设计出同时有多个程序执行的系统,这就导致了并发。使用线程,我们甚至能够在一个进程中执行多个控制流。自20世纪60年代初期出现时间共享以来,计算机系统中就开始有了对并发执行的支持。传统意义上,这种并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的,就好像一个杂耍艺人保持多个球在空中飞舞一样。这种并发形式允许多个用户同时与系统交互,例如,当许多人想要从一个Web服务器获取页面时。它还允许一个用户同时从事多个任务,例如,在一个窗口中开启Web浏览器,在另一窗口中运行字处理器,同时又播放音乐。在以前,即使处理器必须在多个任务间切换,大多数实际的计算也都是由一个处理器来完成的。这种配置称为单处理器系统。

当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。其实从20世纪80年代开始,在大规模的计算中就有了这种系统,但是直到最近,随着多核处理器和超线程(hyperthreading)的出现,这种系统才变得常见。图1给出了这些不同处理器类型的分类。

图1 不同的处理器配置分类。

随着多核处理器和超线程的出现,多处理器变得普遍了

多核处理器是将多个CPU(称为“核”)集成到一个集成电路芯片上。图2描述的是一个典型多核处理器的组织结构,其中微处理器芯片有4个CPU核,每个核都有自己的L1和L2高速缓存,其中的L1高速缓存分为两个部分——一个保存最近取到的指令,另一个存放数据。这些核共享更高层次的高速缓存,以及到主存的接口。工业界的专家预言他们能够将几十个、最终会是上百个核做到一个芯片上。

图2 多核处理器的组织结构。

4个处理器核集成在一个芯片上

超线程,有时称为同时多线程(simultaneous multi-threading),是一项允许一个CPU执行多个控制流的技术。它涉及CPU某些硬件有多个备份,比如程序计数器和寄存器文件,而其他的硬件部分只有一份,比如执行浮点算术运算的单元。常规的处理器需要大约20000个时钟周期做不同线程间的转换,而超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。这使得CPU能够更好地利用它的处理资源。比如,假设一个线程必须等到某些数据被装载到高速缓存中,那CPU就可以继续去执行另一个线程。举例来说,Intel Core i7处理器可以让每个核执行两个线程,所以一个4核的系统实际上可以并行地执行8个线程。

多处理器的使用可以从两方面提高系统性能。首先,它减少了在执行多个任务时模拟并发的需要。正如前面提到的,即使是只有一个用户使用的个人计算机也需要并发地执行多个活动。其次,它可以使应用程序运行得更快,当然,这必须要求程序是以多线程方式来书写的,这些线程可以并行地高效执行。因此,虽然并发原理的形成和研究已经超过50年的时间了,但是多核和超线程系统的出现才极大地激发了一种愿望,即找到书写应用程序的方法利用硬件开发线程级并行性。

2 指令级并行

在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。早期的微处理器,如1978年的Intel 8086,需要多个(通常是3~10个)时钟周期来执行一条指令。最近的处理器可以保持每个时钟周期2~4条指令的执行速率。其实每条指令从开始到结束需要长得多的时间,大约20个或者更多周期,但是处理器使用了非常多的聪明技巧来同时处理多达100条指令。

如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量(superscalar)处理器。大多数现代处理器都支持超标量操作。

3 单指令、多数据并行

在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式称为单指令多数据,即SIMD并行。例如,较新几代的Intel和AMD处理器都具有并行地对8对单精度浮点数(C数据类型float)做加法的指令。

提供这些SIMD指令多是为了提高处理影像、声音和视频数据应用的执行速度。虽然有些编译器会试图从C程序中自动抽取SIMD并行性,但是更可靠的方法是用编译器支持的特殊的向量数据类型来写程序,比如GCC就支持向量数据类型。

03

计算机系统中抽象的重要性

抽象的使用是计算机科学中最为重要的概念之一。例如,为一组函数规定一个简单的应用程序接口(API)就是一个很好的编程习惯,程序员无须了解它内部的工作便可以使用这些代码。不同的编程语言提供不同形式和等级的抽象支持,例如Java类的声明和C语言的函数原型。

我们已经介绍了计算机系统中使用的几个抽象,如图3所示。在处理器里,指令集架构提供了对实际处理器硬件的抽象。使用这个抽象,机器代码程序表现得就好像运行在一个一次只执行一条指令的处理器上。底层的硬件远比抽象描述的要复杂精细,它并行地执行多条指令,但又总是与那个简单有序的模型保持一致。只要执行模型一样,不同的处理器实现也能执行同样的机器代码,而又提供不同的开销和性能。

图3 计算机系统提供的一些抽象。计算机系统中的一个重大主题就是

提供不同层次的抽象表示,来隐藏实际实现的复杂性

在学习操作系统时,我们介绍了三个抽象:文件是对I/O设备的抽象虚拟内存是对程序存储器的抽象,而进程是对一个正在运行的程序的抽象。我们再增加一个新的抽象:虚拟机,它提供对整个计算机的抽象,包括操作系统、处理器和程序。虚拟机的思想是IBM在20世纪60年代提出来的,但是最近才显示出其管理计算机方式上的优势,因为一些计算机必须能够运行为不同的操作系统(例如,Microsoft Windows、MacOS和Linux)或同一操作系统的不同版本设计的程序。

计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件,它们又执行着相似的功能。一些程序员希望深入了解这些组件是如何工作的以及这些组件是如何影响程序的正确性和性能的,以此来提高自身的技能。本书便是为这些读者而写的。

现在就要开始一次有趣的漫游历程了。如果你全力投身学习这些概念,完全理解底层计算机系统以及它对应用程序的影响,那么你会步上成为为数不多的“大牛”的道路。

本文摘编自《深入理解计算机系统(原书第3版)》,经出版方授权发布。

作者[美] 兰德尔 E.布莱恩特(Randal E. Bryant)

大卫 R. 奥哈拉伦(David R. O'Hallaron)

译者:龚奕利 贺莲

被誉为“价值超过等重量黄金的无价资源宝库”理解计算机系统首选书目, 十余万程序员的共同选择。

本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。卡内基-梅隆大学、北京大学、上海交大等国内外众多知名高校选用指定教材。

本书的最大优点是为程序员描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为,以及造成效率低下的原因。

如何使用本书从程序员的角度来学习计算机系统是如何工作的会非常有趣。最理想的学习方法是在真正的系统上解决具体的问题,或是编写和运行程序。这个主题观念贯穿本书始终。因此我们建议你用如下方式学习这本书:

  • 学习一个新概念时,你应该立刻做一做紧随其后的一个或多个练习题来检验你的理解。这些练习题的解答在每章的末尾。要先尝试自己来解答每个问题,然后再查阅答案。

  • 每一章后都有一组难度不同的作业题,这些题目需要的时间从十几分钟到十几个小时,但建议你尝试完成这些作业题,完成之后你会发现对系统的理解更加深入。

  • 本书中有丰富的代码示例,鼓励你在系统上运行这些示例的源代码。

  • 向老师或他人请教和交流是很好的学习方式。欢迎加入本书的读者群,进群交流学习

扫码关注【图书小编辑】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 2月书讯 | 读新书,过新年。

资讯 | DB-Engines 2月数据库排名:三霸主集体“亮红灯”?小众数据库不可小觑

书单 | 股市绿油油,牛年基金热还会持续吗?不妨看书学习一下

干货 | 终于有人把智能语音处理讲明白了

收藏 | 你需要的Python编程宝典!教你写出Pythonic的代码

点击阅读全文购买

计算机系统漫游:贯穿计算机系统所有方面的重要概念相关推荐

  1. [CSAPP笔记][第一章计算机系统漫游]

    计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习-–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...

  2. 贯穿计算机系统所有方面的重要概念,终于有人讲明白了

    导读:我们在此强调几个贯穿计算机系统所有方面的重要概念.我们会在本文多处讨论这些概念的重要性. 作者:Randal E. Bryant,David R. O'Hallaron 来源:华章计算机(hzb ...

  3. 【深入理解计算机系统-学习笔记】第一章 计算机系统漫游

    第一章 计算机系统漫游 简介: 我们通过跟踪hello程序的生命周期来开始对系统的学习--从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止 我们将沿着这个程序的生命周期,简单得介绍一些逐 ...

  4. 【深入理解计算机系统 01】计算机系统漫游

    01计算机系统漫游 本书的主要作用:帮助我们了解当我们在系统上执行hello程序时,系统发生了什么以及为什么会这样 #include <stdio.h>int main() {printf ...

  5. 第1章 计算机系统漫游

    第1章 计算机系统漫游 1 信息就是位 + 上下文 2 程序被其他程序翻译成不同的格式 3 了解编译系统如何工作是大有益处的 4 处理器读并解释储存在内存中的指令 4.1 系统的硬件组成 4.2 运行 ...

  6. 深入理解计算机系统之旅(一)计算机系统漫游

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/songjinshi/article/details/27201063 1.计算机系统是什么? 我们直 ...

  7. 深入理解计算机系统(原书第三版)系列 第一章 计算机系统漫游

    大学学习 计算机操作系统,当时太年轻,没有重视起来,今天 重拾书本,来看看这本传说中的 豆瓣9.9的神书 ,夯实基础,基础是石,敲出希望之火. 第一章 计算机系统漫游

  8. 深入理解计算机系统1——计算机系统漫游

    计算机系统漫游 计算机系统=硬件+系统软件构成的. 它们共同工作来运行应用程序.系统的具体实现方式随时间变化,但是系统的内在概念却没有改变. 深入了解计算机系统的组件如何影响程序的正确性和性能. == ...

  9. 计算机漫游模式,深入理解操作系统之一 —— 计算机系统漫游

    这些内容都是摘自<深入理解操作系统>这本书,很多年前学习操作系统都是马马虎虎,突然感觉现在很需要再次深入了解操作系统,读了这本书感觉对自己有用的就记下来了,方面以后查阅. 计算机系统漫游这 ...

最新文章

  1. POJ 1006 Biorhythms 中国的法律来解决剩余的正式
  2. WMI-Win32_baseboard 主板参数
  3. 八、前端开发-JavaScript 客户端存储
  4. 怎么看python环境变量配置是否好了验证图片_简述验证Anaconda是否安装成功的两种方式和Anaconda环境变量配置过程...
  5. java scanner字符串_Java Scanner toString()用法及代码示例
  6. clientHeight,offsetHeight,scrollHeight迷一样的三个值
  7. 在C++中创建并使用Web服务
  8. 傅里叶变换对噪声进行频谱分析
  9. java array 元素的位置_208道高频 Java面试题答案2
  10. 《R语言编程艺术》——1.4 R语言中一些重要的数据结构
  11. 用计算机软件绘制思维导图和手绘思维导图,手绘思维导图与计算机思维导图的对比...
  12. Atitit.attilax重要案例 项目与解决方案与成果 v6 qa15
  13. 手机上php文件用什么打开方式,php是什么文件格式 php文件打开方法【图文】
  14. 对于【没有苹果开发账号,只有p12文件和mobileprovision文件进行打包】文章的补充
  15. PHP 7从零基础到项目实战,PHP 7从零基础到项目实战
  16. 研究生学历会是我职业生涯的遮羞布吗
  17. 文本分类上分利器: Bert微调trick大全
  18. .py文件应该怎样打开?
  19. uni-app - 设置最外层容器高度为100%
  20. 计算机图形学之绘制旗子

热门文章

  1. 乐教乐学各关的解(51-60)
  2. python try/except与try/finally使用
  3. java web课设
  4. 手撕线程池 ThreadPool
  5. Hadoop源代码分析(完整图文版) part 1
  6. 3.2 回溯法—N皇后问题
  7. 互联网日报 | 4月27日 星期二 | 美团回应被立案调查;滴滴开通老年人打车400热线;百度App月活跃用户数达5.58亿
  8. 7.买一件上衣45元,买一件裤子90元,如果成套买的话,一套120.假设我买了m个上衣和n个裤子,问需要花多少钱?
  9. CSUST 2007 我爱吃烧烤 (状压dp)
  10. 微信登录界面的那个男孩,他每天影响着11.51亿人