深入理解计算机系统--->并发与并行

来源:互联网 发布:用网络看电视直播 编辑:程序博客网 时间:2024/04/30 08:19

并发与并行

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


一、线程级并发

构建进程这个抽象,我们能够设计出同时执行多个程序的系统,这就导致了并发。使用线程,我们甚至能够在一个进程中执行多个控制流。传统意义上,这种并发执行只是模拟出来的,通过是一台计算机在它正在执行的进程间快速切换的方式实现的,就好像一个杂技演员保持多个球在空中飞舞一样。这种并发试下允许多个用户同时与系统交互,例如,我们可以一一边上网一边听歌,还能打字。在以前,即使处理器必须在多个任务间切换,大多是实际的计算也都是由一个处理器来完成的。这种配置称为单处理器系统。(上次有一个面试官问我,单核的CPU如何实现多线程,答案应该就是上面这样吧)。
当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。其实从20实际80年代开始,在大规模的计算中就采用这种系统,但是随着发展,随着多核处理器和超线程(hyperthreading)的出现,这种系统才变得常见。
这里写图片描述

多核处理器是将多个CPU(称为“核”)集成到一个集成电路芯片上。如下图Inter Core i7处理器的组成结构,其中微处理器芯片有4个CPU核,每个核都有自己的L1和L2告诉缓存。但是他们共享更高层次的告诉缓存以及到主存的接口。
这里写图片描述

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

多处理器的使用可以从两个方面提高系统性能。

  1. 首先,它减少了在执行多任务时模拟并发的需要。正如前面提到的,即使是只有一个用户使用的个人计算机也需要并发的执行多个活动。
  2. 其次,它可以使应用程序运行的更快。当然,这必须要求程序是以多线程的方式来书写的,这些线程可以并发的高效执行。

二、指令级并行

在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。早起的微处理器,如1978年的Intel 8086,需要多个(通常是3~10个)机器周期来执行一条指令。比较先进的处理器可以保持每个时钟周期2~4调指令的执行速度。其实每条指令从开始到结束需要长得多的时间,大约20个或者更多的周期,但是处理器使用了非常多的聪明技巧来同时处理多达100条指令。在流水线中,将执行一条指令所需要的活动划分为不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行的操作。用来处理不同指令的不同部分。通过一些简单的硬件设计,它能够达到接近一个时钟周期一条指令的执行速率。
如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量处理器。大多数现代处理器都支持超标量操作。


三、单指令、多数据并行

在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作。这种方式称为单指令、多数据,即SIMD并行。例如,较新的Intel和AMD处理器都具有并行执行对4对单精度浮点数做加法的指令。
提供这些SIMD指令多事为了提高处理影响、声音和视屏数据应用的执行速度。虽然有些编译器试图从C程序中自动抽取SIMD并行性,但是更可靠的方法是使用编译器支持的特殊向量数据类型来写程序。比如GCC就支持向量数据类型。

1 0