当我们试着通过 Linux 命令 nproc 和 lscpu 了解一台计算机 CPU 级的架构和性能时,我们总会发现无法正确地理解相应的结果,因为我们会被好几个术语搞混淆:物理 CPU、逻辑 CPU、虚拟 CPU、核心、线程和 Socket 等等。如果我们又增加了超线程(不同于多线程),我们就会开始不知道计算机里面到底有多少核心,我们搞不明白为什么像 htop 这样的命令会在我们认为买的是一台单核计算机上返回拥有 8 个 CPU 的结果。这样的情况一片混乱。

起源:单核CPU和超线程

在诸如多核、虚拟 CPU 和逻辑 CPU 这样的概念诞生前,在奔腾系列处理器的年代,大部分计算机在它们的主板上装备了一块不大不小的芯片,我们把它叫做微处理器、处理器或直接叫 CPU。只有很少数需要更强处理能力的企业能够负担得起同一块主板上安装 2 块以上的处理器的费用:这些就是多处理器系统。这些处理器与主板上其它元件的通信通过一个连接器或 Socket 来完成。那我们很容易能计算得到一块主板上有多少连接器或 Socket,那么这块主板上最多就能有相同数量的 CPU。如果你需要更多的计算能力,你只需要寻找一块能够支持更多处理器的主板即可。

但是后来 Intel 意识到多处理器系统里,处理器之间通过系统总线进行通信是非常低效的,因为总线传输速度较慢。这样就会经常发生的性能瓶颈,无法最大化利用 CPU 的计算能力。

为了改善这个处境于是诞生了超线程技术。超线程的大意是复制一些 CPU 单元到同一块芯片上,比如寄存器或者一级缓存,这样可以在两个执行线程里共享这些数据,而无需经由系统总线和避免因为访问速度导致的性能下降问题。超线程还带来另外一个好处是可以当一个进程在等待中断的时候,另一进程仍然可以使用同一个 CPU 进行执行而且无需停止。

这种方式可以加速多个被处理的进程,比传统的单个核心(未开启超线程)提供更高的整体性能。操作系统有点像被欺骗的意思,因为它被提供了两个虚拟 CPU或者逻辑 CPU 并且可以“同时”执行两个进程。但是要非常注意的是,它并不能带来两倍的处理能力,也不提供完全并行计算能力。

这样, 从 Linux 或者其他操作系统的视角来看,一个单核 CPU 计算机通过超线程技术呈现出双核 CPU 的效果,但两个逻辑 CPU 实际上在同一个物理 CPU 中执行。

又一点复杂:多核架构的出现

正如我在前面部分所说的,尽管开启了超线程的 CPU 能够提供更强的计算能力,但并不能提供 2 倍的处理能力和 2 个独立的 CPU,所以我打算进一步缩小 CPU 元件的视角,并且把它们都安装到统一块芯片上。如此一来每个被压缩的处理器都叫做核心,并且允许使用同一块硅晶的内部共享总线进行更快的通信。从那一刻开始再也不需要较慢的系统总线了。

不同于超线程技术,我们现在拥有多个完全独立的 CPU 服务于任何任务,每个任务可以分配一个核心。确实,从性能的角度来看,拥有单个多核芯片要比同一个主板上拥有多个单核芯片提供更好的性能。当然,拥有一个双数核心要比单数核心更好。

在操作系统层,一个物理的四核处理器可以看做是四个 CPU。但这些可能是四个逻辑 CPU 或者非物理的 LCPU。如果处理器还提供了超线程支持,那么像htop 和 nproc 的命令会看到系统里有八个 CPU,但是可能在一个八核 CPU上看到少于八核的结果。

1LCPU = 1线程

最后我们通常发现支持四线程的处理器,每个核心两个线程这样,这仅仅表示同时可以执行任务的线程,并且与一个 LCPU 能够提供的处理能力等价。如果一个处理器每个核心能够支持两个线程说明它启用了超线程,否则正常来说线程数与核心数一致。

逻辑CPU vs 虚拟CPU

虚拟 CPU 这个术语通常会被与逻辑 CPU 进行比较,但是有一点细微的差别:虚拟CPU 更加被局限在计算虚拟化的领域里,它表示那些与从底层硬件(可以是物理CPU 也可以是逻辑 CPU、开启超线程与否)映射到虚拟机的处理器。一般情况下,宿主机上一个逻辑 CPU 映射到虚拟机里的一个虚拟 CPU,所以它们可以看做是相同含义的术语。

CPU | 物理 CPU vs 逻辑 CPU vs 核心 vs 线程 vs Socket的更多相关文章

  1. 查看数量linux下查看cpu物理个数和逻辑个数

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 hadoop@chw-desktop3:~$ cat /proc/cpuinfo processor : 0 vendor_id : Gen ...

  2. linux下查看cpu物理个数和逻辑个数 - chw1989的专栏 - 博客频道 - CSDN.NET

    body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLi ...

  3. linux下查看cpu物理个数和逻辑个数

    hadoop@chw-desktop3:~$ cat /proc/cpuinfo processor   : 0 vendor_id   : GenuineIntel cpu family  : 15 ...

  4. linux查询操作系统信息,CPU物理个数,CPU核心数,逻辑CPU数,内存信息查询,硬盘信息查询

    目录 一.前言 二.关于服务器基本配置 2.1 操作系统基本配置查询 2.2 CPU基本配置查询 2.3 内存基本配置查询 2.4 硬盘基本配置查询 一.前言 ​ 当我们接手了一台或者几台服务器的时候 ...

  5. 物理CPU,物理核,逻辑CPU,虚拟CPU(vCPU)区别 (转)

    在做虚拟化时候,遇到划分CPU的问题,因此考虑到CPU不知道具体怎么划分,查询一些资料后就写成本文. a. 物理CPU:物理CPU是相对于虚拟CPU而言的概念,指实际存在的处理器,就是我们可以看的见, ...

  6. cat /proc/cpuinfo 引发的思考--CPU 物理封装-物理核心-逻辑核心-超线程之间关系

    CPU的物理封装,一个物理封装使用独立的一个CPU物理插槽,共享电源和风扇: CPU物理核心:在一个物理封装中封装了多个独立CPU核心,每一个CPU核心都有自己独立的完整硬件单元. CPU逻辑核心:一 ...

  7. 物理CPU、物理核跟逻辑核的区分

    一般来说,物理CPU个数×每颗核数就应该等于逻辑CPU的个数,如果不相等的话,则表示服务器的CPU支持超线程技术 ,所以您的电脑是双核的. 一 概念① 物理CPU 实际Server中插槽上的CPU个数 ...

  8. Linux下区分物理CPU、逻辑CPU和CPU核数

    ㈠ 概念           ① 物理CPU                             实际Server中插槽上的CPU个数              物理cpu数量,可以数不重复的 p ...

  9. 物理CPU 逻辑CPU 核数

    一.概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量,可以数不重复的 physical id 有几个 ② 逻辑CPU ③ CPU核数  一块CPU上面能处理数据的芯片组的数量 ...

随机推荐

  1. 直接插入排序算法(java)

    直接插入排序是将未排序的数据插入至已排好序序列的合适位置. 具体流程如下: 1.首先比较数组的前两个数据,并排序: 2.比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置: 3.比较第四 ...

  2. C#开发Office程序

    标题:Office 解决方案开发概述 (VSTO) 地址:https://docs.microsoft.com/zh-cn/visualstudio/vsto/office-solutions-dev ...

  3. JDK源码那些事儿之PriorityBlockingQueue

    今天继续说一说阻塞队列的实现,今天的主角就是优先级阻塞队列PriorityBlockingQueue,从命名上看觉得应该是有序的,毕竟是优先级队列,那么实际上是什么情况,我们一起看下其内部实现,提前说 ...

  4. webpack 配置react脚手架(四):路由配置

    1. 由于 react-router 是集成了 react-router-dom 和 react-router-native的一起的,所以这里要使用的是 react-router-dom, 2. 安装 ...

  5. mysql双主模式方案

    MySQL双主(主主)架构方案   在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果 ...

  6. javaScript基础及初始面向对象

    对象是什么?对象是包含相关属性和方法的集合体属性方法什么是面向对象面向对象仅仅是一个概念或者编程思想通过一种叫做原型的方式来实现面向对象编程 创建对象自定义对象内置对象 自定义对象2-1基于Objec ...

  7. 如何在没有代理的情况下编译 tidb server

    这里主要介绍 tidb server 的编译, ti kv 和 ti pd 的编译不在本文范围内: go 语言 1.11 版本之后支持 go.mod,  依赖包在 go.mod 里生成, 如果 go. ...

  8. HttpURLConnection getInputStream 400异常的解决

    判断getResponseCode,当返回不是HttpURLConnection.HTTP_OK, HttpURLConnection.HTTP_CREATED, HttpURLConnection. ...

  9. elment-ui的validate

    https://blog.csdn.net/qq469234155/article/details/84034816 validate()时elment-ui封装好的用于对整个表单进行验证valida ...

  10. 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest

    目录 Contest Info Solutions B. Counting Inversion C. Divisors of the Divisors of An Integer E. Helping ...