深入理解计算机系统 1.9 重要主题

这一节结束我们旋风般的系统之旅。一个重要的观点是,一个系统不仅仅是硬件。它是硬件和系统软件的集合,它们必须合作才能实现运行应用软件的目的。这本书剩余部分会讨论更多关于软件和硬件的细节,并展示如何通过理解这些概念让你写出更快、更可靠、更安全的程序。

为了结束这章,我们强调几个重要概念,这些概念横跨计算机系统的各个方面。我们将在这本书的很多地方讨论这些概念的重要性。

1.9.1 并发和并行

贯穿着数字计算机的历史,两个需求推动着计算机的发展:一个是,我们希望计算机做得更多;另一个是,我们希望计算机运行得更快。我们用术语并发(concurrency)来指一个系统在同一时刻做多见事情,用术语并行(parallelism)指使用并发使系统运行得更快。并行可以在一个系统的多个抽象层次被使用。我们这里强调三个层次,我们系统抽象的高层向底层讲。

线程级并发(Thread-Level Concurrency)

基于进程抽象,我们可以设计一个系统,在这个系统里,多个程序可以在同一时间执行,从而形成并发概念。通过线程,我们可以在一个进程里执行多个控制流。自从1960年分时系统的出现,计算机系统就有了对并发执行的支持。传统上,并发只是一种假象,只是快速地在各个进程间切换,就像杂技师同时拿着多个球,但是一些球飞在空中。这种并发允许多个用户在同一时间与系统交互,就和当许多人想从单个的web服务器上获得页面一样。它同样允许单个用户同时与多个应用交互,比如,同时使用浏览器、字处理器和播放音乐。直到最近,大多数计算都是被单个处理器完成的,也就是说,那个处理器必须在多个任务之间切换。这种系统被称为单处理器系统。

当我们构建一个包含多个处理器并且所有处理器都在一个操作系统内核的控制下时,我们便拥有了一个多处理器系统。这样的系统从1980开始对大规模计算变得可用,但是它们也是最近随着多核和超线程的出现才变得普及。Figure 1.16展示了这些不同处理器类型的一个分类。

多核处理器拥有多个CPU(这些CPU被称为核),这些CPU被集成在一个集成电路芯片上。Figure 1.17展示了Intel Core i7处理器的结构,这个微处理器芯片上拥有四个核,每一个核拥有自己的一级缓存和二级缓存,但是它们共享更高级别的缓存和与内存的接口。工业专家预言,单个芯片将会有上百个核。

超线程(Hyperthreading)有时也成为同时多线程,是一种技术,它允许单个CPU同时执行多个控制流。它是这样实现的,CPU的一些硬件有多个副本,比如程序计数器,寄存器文件,而CPU的其它部件只有单个副本,比如执行浮点运算的单元。传统的处理器在不同线程之间切换需要20000个时钟周期,而一个超线程处理器只需要一个时钟周期就能在它的线程间切换。它让CPU更好的利用它的处理资源。例如,如果一个线程必须等待一些数据被载入缓存,CPU这时可以执行不同的线程。作为一个例子,Intel Core i7处理器可以让每一个核同时执行两个线程,因此一个四核处理器可以并行执行八个线程。

多处理器的使用可以在两个方面提高系统的执行性能。首先,它减少了在执行多任务时模拟并发的需求。值得一提的是,即使是被单个人使用的个人电脑也被希望能同时执行多个任务。其次,它能够更快的运行单个应用程序,但是程序必须被以多线程表达并且每个线程能有效的并行执行。因此,尽管并发的原则被规划和研究了超过五十年了,多核和超线程的出现极大地刺激编写能应用线程级并行的运行程序的欲望。十二章将会更加深入的讨论并发,以及它被用于处理资源的共享和使在程序执行过程中存在更多并行。

指令集并行

在更低级的抽象,现代处理器能够在同一时刻执行多个指令,被称为指令集并行。例如,早年的处理器,例如,1978年老式的Intel 8086处理器需要多个时钟周期(一般是3到10个)去执行一条指令。最近的处理器能保持每个时钟周期执行2-4条指令。任何给定的指令都需要更长的时钟周期,也许20个,或者更多,但是处理器使用了许多聪明的技巧去同时处理差不多100个指令。第四章,我们将探讨管道的使用,通过管道,执行一条指令需要的动作被分为不同的步骤,处理器硬件也被组织为一系列车间,每个车间执行这些步骤中的一个。这些车间可以并行执行,指令的不同部分在不同的车间上完成。我们将看到,一个简单的硬件设计可以维持接近一个指令周期执行一条指令的执行率。

能够维持一个时钟周期执行超过一条指令的执行率的处理器成为超标量处理器。大部分现代处理器执行超标量操作。第五章,我们将描述这种处理器的更高级的模型。我们将会看到,应用程序员可以通过这种模型去理解它们程序的执行效率。他们能够写出程序以至于生成的代码可以实现更高级别的指令级并行从而运行得更快。

单指令多数据并行

在最低级别,许多现代处理器拥有特殊的硬件,它运行单个指令触发多个操作并行执行,这样的模型被称为单指令多数据或者SIMD并行。例如,最近的Intel和AMD处理器拥有这样的指令,能并行对四对单精度浮点型(C数据类型float)做加法。这些SIMD指令大部分被提供用来处理图片、音频和视频数据。尽管一些编译器尝试自动从C程序中抽取出SIMD并行,更可靠的方法是使用被编译器(比如GCC)支持的vector数据类型编写程序。我们将描述在web中这种风格的编程,作为对更加通用的编程优化的展示将在第五章中找到。

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

使用抽象是计算机科学中最重要的概念之一。例如,好的编程实践的一个方面是为一个函数集合规划一个简单的应用程序接口(API),这时应用程序接口使应用程序员能很好使用这些代码而不用关心接口的内部实习。不同的编程语言提供不同形式和级别的抽象,比如Java类声明和C函数原型。

我们已经介绍过计算机系统中的几个抽象,如Figure 1.18所示。对于处理器,指令集架构提供了对实际处理器指令硬件的抽象。通过这个抽象,一个机器码程序表现得好像它好像在一个同一时刻只执行一个指令的处理器上执行。底层的硬件是十分复杂的,它们并行执行多条指令,但是总是和简单的串行模型保持一致。通过保持相同的执行模型,不同的处理器实现可以执行相同的机器码,而这些实现提供不同的性能和代价。

对于操作系统,我们介绍了三个抽象:文件是I/O的抽象,虚拟内存是程序内存的抽象,进程是运行时程序的抽象。这里我们增加一个新的抽象:虚拟机,它是整个计算机的抽象,包括操作系统,处理器,程序。虚拟机的概念是IBM在二十世纪六十年代提出的,但是最近它变得更加出名了,因为它用于管理那些能够运行为不同操作系统或相同操作系统的不同版本设计的应用程序的计算机。

我们在这本书的剩余部分还会谈到这些抽象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值