最早的时候,人们制造了一台计算用的集成电路(Circuit
,或者IC
) ,用树脂包起来,做成一个小片片(Chip
),把它装在电路板(PCB
)上,做成一台计算机(Computer
),他们把这个小片片和其它小片片做了区分,叫它中央处理器(CPU
),写软件的人简单叫它处理器(Processor
)。
这个阶段,不同的词,它们指的基本是同一个东西。
后来技术发展了,为了提供更强的能力,他们首先把多个Chip
装到同一个PCB
中,这样,就出现一台计算机,有多个Chip
的情况,他们把这个叫做Multi-Processor,MP
。如果这些Processor
可以一样对待,不需要每个特殊处理,就叫同构多处理(SMP
),否则就叫异步多处理(AMP
)。
MP
要把电路拉远,没有封装在一台计算机里面高效,所以又有人在一个Chip
里面,把计算的电路做了多份,每份叫一个“核心”或者你这里翻译为内核了(Core
),而仍把封装起来的整个Chip
叫一个CPU
。
但软件已经把一个执行的硬件单元叫CPU
了(也就是硬件认为的Core
),从这里开始,软件和硬件用的名字指的就不是一个东西了。而对中文来说,软件把操作系统用来管理所有资源的那个被保护的软件部件,也叫内核(Kernel
),而把每个被管理的软件部件,叫处理者(Process
,中文翻译为“进程”),这就更加容易引起人们的误会。实际上,无论Kernel
还是Process
,都是软件,是运行在CPU/Core
上的东西,只是软件内部的区分。就好比我们人的躯体和思考的关系一样,CPU
是躯体,软件是魂魄,Kernel
是魂,Process
是魄(当然我们不细究两者确切的语义)
Core
越来越多,一个电路已经很难制造了,他们开始分开造,再封装在一个Chip
里面,那个独立制造的电路,有人叫它一个DIE
,也有人叫它一个Cluster
。软件其实不关心,软件只关心一共有多少“CPU
”(芯片说的“Core
”),但CPU
们位置不一样,导致访问内存的速度不一样,所以软件会认为他们在不同的“区域”(zone
)上。
为了进一步优化Core
,设计师发现Core
的很多电路大部分时候都闲着,他们就让多个核复用这些电路。这样看起来一个硬件的Core
,提供了多个软件看到的CPU
,他们把这样的CPU
,叫“硬线程”(hyper-thread
)。
好了,不知道你作为软件工程师晕掉没有?软件工程师就要求:别那么多废话了,就说你有多少个“假CPU”吧,我都统一处理好了。
但硬件说,我有30
个A cpu
,10
个B CPU
,4
个C CPU
,15
个MPU
(微处理器,理解为更简单的CPU
吧),其中A CPU
里有2连个硬线程,三种连法,B有一个硬线程,四种配置…
软件说,打住打住……算了,这样吧,我们分开说,你CPU
都一样给我的,我们叫它SMP
(注意这个名字的意思已经和前面不同了),这种CPU
我统一用,内存也统一访问。如果你不是这样的,我叫它“非对称多处理”(AMP
),那个你再一个个跟我说怎么用好了。
读者晕掉没有?有没有都来让我来洗一下脑,都用我们服务器芯片上的定义吧:)
一个独立的硬件处理单元,被软件看做是“CPU
”的东西,我们叫Core
。但有例外:Core
可以有多个超线程(hyper-thread,HT
),如果有HT
,每个HT
就是一个软件看到的CPU
,但它并不具有所有计算资源。
多个共享一级cache
的Core
,我们叫一个Cluster
。
多个cluster
组合可以被自由组合封装的电路,我们叫一个超级 CPU CLUSTER(SCCL)
。我们还可以把网卡,sas
等东西封装成超级IO cluster(SICL)
,从而提供超过PCIE
速度的更接近CPU
的IO
设备(比如100G
的网口)。
把多个sccl和sicl
组合在一起,封在树脂里,我们称为一个chip
。
多个chip
放到一个电路板中,里面的core
作为SMP
使用,每个chip
称为一个Processor
,或者从PCB
的角度,又叫一个插槽(Socket
)。
电路板加上各种外网电路,封装成一台服务器,我们叫一台Machine
,多个Machine
组合成一个柜子,我们称为一个Rack
。对外做广告,我们称我们一个Rack
可以提供超过1万个,工作主频2.6G+
的Core
:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。