CPU、内核、线程:计算机硬件与操作系统的核心概念解析
CPU、内核、线程:计算机硬件与操作系统的核心概念解析
在计算机领域,CPU、内核和线程是三个核心概念,它们之间有着密切的联系。本文将深入浅出地解释这些概念,并探讨它们在实际应用中的关系。
基本概念
- Name:表示物理CPU数
- NumberOfCores:表示CPU核心数
- NumberOfLogicalProcessors:表示CPU线程数
注释:在VM虚拟机中选择的核心数实际上代表线程数。
CPU
CPU是指看得见的芯片个数,也就是主板上插CPU的插槽个数。
核数 (CPU cores)
在每一个CPU上面,都可能有多个核(core),每一个核中都有独立的一套ALU(算术逻辑单元)、FPU(浮点运算单元)、Cache(高速缓存)组件。这个概念也被称之为物理核。总的CPU物理内核数计算公式为:
总的CPU物理内核数 = 物理CPU数 * 每颗CPU的内核数
线程数 (processor)
得益于现在的超线程技术,可以让一个物理核模拟出多个逻辑核。其作用是在处理多个计算任务时,可以让一个计算任务使用ALU的同时,另一个使用FPU,从而充分利用物理核的各个组件。总的逻辑CPU数计算公式为:
总的逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数
总的逻辑CPU数 = 总的CPU物理内核数 * 超线程数
几核几线程
我们常说的“核”指的是内核个数。例如,6核12线程的配置,基于上面的逻辑核公式可以推算出每个内核可以运行2个线程数量。
在任务管理器中,看到的是6个内核,但是逻辑处理器是12个,有多少个逻辑处理器,就可以开多少个线程。
线程数 = 逻辑处理器个数
- 一个物理CPU可以有1个或者多个物理内核
- 一个物理内核可以作为1个或者2个逻辑CPU
操作系统可以使用逻辑CPU来模拟真实CPU。在没有多核处理器的时候,一个物理CPU只能有一个物理内核。有了多核技术,一个物理CPU可以有多个物理内核,可以把一个CPU当作多个CPU使用,即逻辑CPU。没有开启超线程时,逻辑CPU的个数就是总的CPU物理内核数。开启超线程后,逻辑CPU的个数就是总的CPU物理内核数的两倍。
逻辑处理器
逻辑处理器指的就是支持超线程技术的处理器在一个单核心的CPU内,利用其中空闲的执行单元,模拟出另外一个核心,使整个CPU有两个逻辑核心,从而提高整个CPU的工作效率。
注意:因为逻辑处理器是通过在一枚处理器上整合两个逻辑处理器单元,使得具有这种技术的新型CPU,有能同时执行多个线程的能力,这就是我们所说的“超线程”。
单核多CPU与多核单CPU
一台计算机的处理器部分的架构可以分为两种:
单核多CPU:每一个CPU都需要有较为独立的电路支持,有自己的Cache,而他们之间通过板上的总线进行通信。在这种架构上,线程间的所有协作都要走总线,而共享的数据更是有可能要在好几个Cache里同时存在。这样的话,总线开销相比较而言是很大的。
多核单CPU:只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。在这样的架构上,如果我们跑一个多线程的程序,那么线程间通信将比上一种情形更快。
多个CPU常见于分布式系统,用于普通消费级市场的不多,多用于cluster,云计算平台什么的。多CPU架构最大的瓶颈就是I/O,尤其是各个CPU之间的通讯,低成本的都用100M以太网做,稍微好一点的用1000M以太网,再好的就用光纤等等,但无论如何速度和通量都比不上主板的主线。所以多CPU适用于大计算量,对速度(时间)不(太)敏感的任务,比如一些工程建模,或者像SATI找外星人这种极端的,跑上几千年都不着急的。而且多CPU架构更简单清晰,可以用消费级产品简单做数量堆叠,成本上有优势。而多核单CPU则适合对通讯I/O速度要求较快的应用,(相同核数量下)成本上也高一些,好像只有在超级计算机里会用到以万为单位的核心数,普通消费级产品也就是到16核封顶了,因为成本控制的原因。
实现16个逻辑CPU的原理图
线程/进程/多核CPU
在Python中,可以使用以下代码获取当前系统的逻辑CPU个数:
from multiprocessing import cpu_count
print(cpu_count())
12
这里再区分一下进程、线程、多个CPU和单个多核CPU,多个多核CPU,这些概念区别。
- 左图:多个物理CPU,CPU通过总线进行通信,效率比较低。
- 右图:多核CPU,不同的核通过L2 cache进行通信,存储和外设通过总线与CPU通信
进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位。
线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
联系:线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。