img

Name:表示物理CPU数

NumberOfCores:表示CPU核心数

NumberOfLogicalProcessors:表示CPU线程数

注释:VM虚拟机中的CPU选择的核心数实际是代表线程数。

CPU

CPU是指看得见的 芯片个数、也就是指主板上插CPU的插槽个数

核数 cpu cores

在每一个cpu上面,都可能有多个核(core),每一个核中都有独立的 一套ALU、FPU、Cache 组件。所以这个概念也被称之为物理核。总的CPU物理内核数=物理CPU数*每颗CPU的内核数

线程数 processor

这个主要得益于现在的超线程技术,可以让一个物理核模拟处多个逻辑核,processor。起作用也就是当我们有多个计算任务、或者处理逻辑的时候,可以让一个计算任务使用ALU的时候,另一个则取使用FPU。这样可以充分利用物理核的各个组件。使得同一个物理核当中也可以执行多个计算任务。

总的逻辑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,而他们之间通过板上的总线进行通信。(一致性问题)

假如在这样的架构上,我们要跑一个多线程的程序(常见典型情况),不考虑超线程,那么每一个线程就要跑在一个独立的CPU上,线程间的所有协作都要走总线,而共享的数据更是有可能要在好几个Cache里同时存在。这样的话,总线开销相比较而言是很大的,怎么办?那么多Cache,即使我们不心疼存储能力的浪费,一致性怎么保证?

多核单CPU,那么我们只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。在这样的架构上,如果我们跑一个多线程的程序,那么线程间通信将比上一种情形更快。

多个CPU常见于分布式系统,用于普通消费级市场的不多,多用于cluster,云计算平台什么的。多CPU架构最大的瓶颈就是I/O,尤其是各个CPU之间的通讯,低成本的都用100M以太网做,稍微好一点的用1000M以太网,再好的就用光纤等等,但无论如何速度和通量都比不上主板的主线。所以多CPU适用于大计算量,对速度(时间)不(太)敏感的任务,比如一些工程建模,或者像SATI找外星人这种极端的,跑上几千年都不着急的。而且多CPU架构更简单清晰,可以用消费级产品简单做数量堆叠,成本上有优势。而多核单CPU则适合对通讯I/O速度要求较快的应用,(相同核数量下)成本上也高一些,好像只有在超级计算机里会用到以万为单位的核心数,普通消费级产品也就是到16核封顶了,因为成本控制的原因。

实现16个逻辑CPU的原理图

image-20220418105948848

线程/进程/多核CPU

1
2
3
>>> from multiprocessing import cpu_count
>>> print(cpu_count())
12

在python中,使用上述代码可以获取当前系统的逻辑cpu个数,也就是支持并发的线程个数。

这里再区分一下进程,线程,多个CPU和单个多核CPU,多个多核CPU,这些概念区别。

image-20220418110135863

左图:多个物理CPU,CPU通过总线进行通信,效率比较低。

右图:多核CPU,不同的核通过L2 cache进行通信,存储和外设通过总线与CPU通信

进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,

线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

**联系:**线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

参考:

内核/逻辑处理器/线程/多线程/多CPU/多核CPU

CPU个数、CPU核心数、CPU线程数

CPU、核数、线程数扫盲