在这篇文章中我会主要介绍CPU相关的一些重要概念和技术。如果你想更好地了解操作系统,那就从本文开始吧。
在我们了解其它概念之前,我们应该首先了解一下什么是CPU,它是做什么的,它的主要组件以及相应的作用都是什么?
简单点说,CPU其实就是计算机内部的一个电子电路。根据一些具体的指令它可以执行基本的运算,逻辑,控制和IO操作等。CPU的主要组件包括:
当今大多数地CPU都是微处理器,即它们被包含在单个集成电路芯片(integrated circuit chip)中。一个包含CPU的集成电路可能也包含内存,外围接口和其它的一些计算机组件。这样的集成设备叫做微控制器(microcontrollers)或者芯片上的系统(SoC)。一些计算机采用多核处理器,即单个芯片中包含2个或更多的CPU(也被叫做“cores”); 在这种情况下,单个芯片有时也被称作"sockets".
下图表示的是CPU与主存和IO之间的交互。
上图来源:“Computer Systems - A Programmers Perspective” 一书
贯穿这个数字计算机的历史,我们一直以来的目标就是想要计算机可以做更多的事情,并且做的更快。因此在hyper-threading 和 multi-core CPUs出现之前,人们想到通过增加CPU的数量来增加计算机的计算机能力和速度,但是这样的方法并没有在个人PC中得到普及,我们只会在一些超级计算机或者一些服务器上会看到这个多个CPU的计算机。因为多个CPU会需要主板有多个CPU socket - 多个CPU被插入到不同的socket中。同时主板也需要额外的硬件去连接这些CPU socket到RAM和一些其它的资源。如果CPU之间需要彼此通信,多个CPU的系统会有很大地开销。
由于多个CPU上面存在的缺点,因此它并没有进入普通大众的电脑中,因此消费者电脑的计算始终没有达到并行的状态,电脑的速度也一直没有加快。直到多核处理器和Hyper-Threading技术的出现,才改变了这一点。Hyper-threading这个概念是Intel提出的,这家伟大的公司想把计算机并行计算的能力带入到个人PC中,它第一次进入大众PC的产品是2002年的Pentium 4 HT,最初的这款处理器仅有单个CPU核心,因此它一次只能做一件事情。但是Hyper-threading技术的出现弥补了这个不足。
Hyperthreading 有时叫做 simultaneous multi-threading,它可以使我们的单核CPU执行多个控制流程。这个技术会涉及到备份一些CPU硬件的一些信息,比如程序计数器和寄存器文件等,而对于比如执行浮点运算的单元它只有一个备份,可以被共享。一个传统的处理器在线程之间切换大约需要20000时钟周期,而一个具有Hyperthreading技术的处理器只需要1个时钟周期,因此这大大减小了线程之间切换的成本。hyperthreading技术的关键点就是:当我们在处理器中执行代码时,很多时候处理器并不会使用到全部的计算能力,部分计算能力会处于空闲状态,而hyperthreading技术会更大程度地“压榨”处理器。举个例子,如果一个线程必须要等到一些数据加载到缓存中以后才能继续执行,此时CPU可以切换到另一个线程去执行,而不用去处于空闲状态,等待当前线程的IO执行完毕。
Hyper-threading 使操作系统认为处理器的核心数是实际核心数的2倍,因此如果有4个核心的处理器,操作系统会认为处理器有8个核心。这项技术通常会对程序有一个性能的提升,通常提升的范围大约在15%-30%之间,对于一些程序来说它的性能甚至会小于20%, 其实性能是否提升这完全取决于具体的程序。比如,这2个逻辑核心都需要用到处理器的同一个组件,那么一个线程必须要等待。因此,Hyper-threading只是一种“欺骗”手段,对于一些程序来说,它可以更有效地利用CPU的计算能力,但是它的性能远没有真正有2个核心的处理器性能好,因此它不能替代真正有2个核心的处理器。但是同样都是2核的处理器,一个有hyper-threading技术而另一个没有,那么有这项技术的处理器在大部分情况下都要比没有的好。
相比于多个处理器而言,多核处理器把多个CPU(核心)集成到单个集成电路芯片(integrated circuit chip)中,因此主板的单个socket也可以适应这样的CPU,不需要去更更改一些硬件结构。一个双核的CPU有2个中央处理单元,因此不像上面我介绍的hyper-threading技术那样,操作系统看到的只是一种假象,这回操作系统看到的是真正的2个核心,所以2个不同的进程可以分别在不同的核心中同时执行,这大大加快了系统的速度。由于2个核心都在一个芯片上,因此它们之间的通信也要更快,系统也会有更小地延迟。
下图展示了一个Intel Core i7处理器的一个组织结构,这个微处理器芯片中有4个CPU核,每个核中都有它自己的L1和L2缓存。
上图来源:“Computer Systems - A Programmers Perspective” 一书
引用Rob Pike的一句话:
“Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.”
Vicky Katara已经在Quora上把它们之间的区别写的很好了,这里我就不去翻译了。What is the difference between concurrency and parallelism
Central processing unit
CPU Basics: Multiple CPUs, Cores, and Hyper-Threading Explained
What is hyper-threading and how does it work?
Hyper-Threading and Dual-Core, What’s the Difference?
What is the difference between multithreading and hyperthreading?
What is the difference between concurrency and parallelism?
Forcing multiple threads to use multiple CPUs when they are available