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

作者: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版)》,经出版方授权发布。

延伸阅读《深入理解计算机系统(原书第3版)》

推荐语:被誉为“价值超过等重量黄金的无价资源宝库”理解计算机系统首选书目, 十余万程序员的共同选择。本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。卡内基-梅隆大学、北京大学、上海交大等国内外众多知名高校选用指定教材。

划重点????

干货直达????

  • Python高能小技巧:不要在for与while循环后面写else块

  • 终于有人把量化投资讲明白了

  • 人工智能时代都需要哪些数学知识?这些经典教材给你划重点

  • 4种数据分析基础方法,终于有人讲明白了

更多精彩????

在公众号对话框输入以下关键词

查看更多优质内容!

PPT | 读书 | 书单 | 硬核 | 干货 讲明白 | 神操作

大数据 | 云计算 | 数据库 | Python | 可视化

AI | 人工智能 | 机器学习 | 深度学习 | NLP

5G | 中台 | 用户画像 1024 | 数学 | 算法 数字孪生

据统计,99%的大咖都关注了这个公众号

????

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

  1. 什么是机器学习?有哪些应用?终于有人讲明白了

    导读:人工智能的快速发展,带动了相关技术的繁荣.近些年,国内外的科技公司对机器学习人才都有大量需求.怎样入行机器学习?本文带你从0开始学起. 作者:星环科技人工智能平台团队 来源:大数据DT(ID:h ...

  2. rds基于什么开发_IaaS、PaaS、SaaS、DaaS都是什么?现在怎么样了?终于有人讲明白了...

    导读:本文将详细科普云计算的概念.云服务的发展现状,并逐一介绍各种云服务模式(IaaS.PaaS.SaaS.DaaS),建议收藏! 01 云计算的概念 云是一种服务,可以像使用水.电.煤那样按需使用. ...

  3. 什么是HBase?它是怎样工作的?终于有人讲明白了

    导读:HBase是一个构建在HDFS之上的.分布式的.支持多版本的NoSQL数据库,它的出现补齐了大数据场景下快速查询数据能力的短板.它非常适用于对平台中的热数据进行存储并提供查询功能. 作者:朱凯 ...

  4. 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了

    导读:本文首先介绍何谓机器学习,以及与机器学习相关的基本概念,这是学习和理解机器学习的基础.按照学习方式的不同,机器学习可以分为不同类型,如监督学习.无监督学习.强化学习等,本文会详细介绍它们各自的特 ...

  5. 什么是架构?网络架构中都有什么?终于有人讲明白了

    导读:理解架构这个词的意思是十分重要的.它可能被过度使用,并且使用在各种环境中.如果缺少一致的理解,将会有交流失败的风险.那么架构这个词到底是什么意思呢? 作者:大卫·D.克拉克(David D. C ...

  6. 什么是云原生,跟云计算有什么关系?终于有人讲明白了

    导读:云原生到底是什么? 作者:阿里集团 阿里云智能事业群 云原生应用平台 来源:大数据DT(ID:hzdashuju) 云原生(Cloud Native)的概念,最早是由Pivotal于2015年提 ...

  7. Netflix正在搞的混沌工程到底是什么?终于有人讲明白了

    导读:与任何新概念一样,混沌工程时常被误解.本文会探讨混沌工程是什么以及不是什么. 作者:Casey Rosenthal, Nora Jones 来源:大数据DT(ID:hzdashuju) 在Net ...

  8. 什么是物联网?有哪些应用?终于有人讲明白了

    作者:佩里·利(Perry Lea) 来源:大数据DT(ID:hzdashuju) 我们将从连接设备的角度来研究物联网,这些设备之前未必相互连接或接入互联网.它们可能一直没有太多的计算或通信能力.我们 ...

  9. 6种数据分析实用方法,终于有人讲明白了

    导读:在<终于有人把AI.BI.大数据.数据科学讲明白了>中,我们讨论了分析以及相关的一些概念,如大数据和数据科学.现在我们将注意力转向分析中使用的实用方法,包括各种分析工具. 具体来说, ...

最新文章

  1. 正点原子探索者原理图_正点原子【STM32-F407探索者】第六章 跑马灯实验
  2. 文件读写以及数据处理
  3. Android性能优化之电量篇(四)
  4. 图解ARP协议分析实例
  5. 图文详解 Kubernetes,刺激…
  6. 在html页面中加入矢量图,HTML页面插入SVG的多种方式
  7. C++从0到1的入门级教学(十二)——运算符重载
  8. *【2019牛客暑期多校训练营(第三场)- G】Removing Stones(分治)
  9. 想捧金饭碗? 修炼这25项技能就够了!
  10. 两个有序链表序列的交集
  11. authentication method mysql 8.0查询_mysql 索引整理
  12. glusterfs的一些基本知识
  13. java引用复制_Java中引用的浅复制和深复制
  14. jsf面试题_JSF面试问答
  15. 自动化测试框架selenium+java+TestNG——配置篇
  16. 姜启源《数学建模》学习笔记 第一周
  17. iOS xcode 9 注释快捷键
  18. 在WinXP上编译Doom3源码提示
  19. [置顶] 得失寸心知
  20. 认识USB、Type-C、闪电、雷电接口

热门文章

  1. Qt creator5.7 OpenCV249之图片膨化(含源码下载)
  2. 用友php漏洞,用友CRM注入漏洞(无需登录通杀所有版本)
  3. post多个参数_如何使用Arjun v1.3挖掘HTTP参数
  4. 杭电1108java_按照这个步骤来刷题,迷茫的你两个月亦能成为王者
  5. 数字化改革看“浙”里 CDEC2021中国数字智能生态大会杭州站举行
  6. 网易易盾的“外挂对抗战”,游戏出海之路如何走得更安全?
  7. 互联网金融--支付结算平台的测试
  8. Linux系统编程2:基础篇之详解Linux中的权限问题
  9. epoll 系列系统调用
  10. C++11 并发指南五(std::condition_variable 详解)