作者:小牛呼噜噜 | https://xiaoniuhululu.com

计算机内功、JAVA底层、面试、职业成长相关资料等更多精彩文章在公众号「小牛呼噜噜

大家好,我是呼噜噜,在计算机的早期,Intel奔腾处理器时代,他们的主板上的单个处理器CPU是相当大的。为了提升计算机的整体运算处理能力,一般是在主板上安装更多这样的处理器,这样就可以轻松突破晶体管限制。

物理CPU

物理CPU,是硬件上的CPU, 也是主板上CPU的插槽个数,是计算机上实际配置的CPU个数

我们在linux下可以通过指令 cat /proc/cpuinfo | grep 'physical id'| sort| uniq |wc -l 来查看我们计算机的物理CPU个数

在windows下,我们可以在cmd命令中输入systeminfo,查看CPU个数

物理CPU通过连接器或插槽与其他主板元件通信,通过系统总线完成与系统的不同处理器之间的通信,但是系统总线的传输速度比起CPU的速度来说,是非常慢的通常导致出现瓶颈,使得无法充分利用每个CPU提供的计算能力。

所以工程师想 能不能让处理器中的核心组件小型化,并将它们封装在单个芯片中,这些就是物理内核,可以看作是计算单元

CPU核数

CPU核数,物理上真实的cpu核,有独立的电路元件以及L1,L2缓存,可以独立地执行指令。 通常每个CPU下的核数都是固定的,如果我们的计算机有两个物理CPU,每个CPU是双核的,那么计算机总共就是四核的

在linux下,我们可以通过指令cat /proc/cpuinfo | grep "cpu cores" | wc -l来统计CPU核数。

在windows下,可以通过任务管理器查看:

我们分别看下,单核CPU和多核CPU的架构图:

  1. 多个物理CPU,CPU通过系统总线进行通信,效率比较低。
  2. 多核CPU,不同的核通过L3 cache和片内总线进行通信,主存和外设通过总线与CPU通信

为了弥补 CPU 与内存两者之间的性能差异,就在 CPU 内部引入了 CPU Cache,也称高速缓存

CPU Cache用的是 SRAM(Static Random-Access Memory)的芯片,也叫静态随机存储器。其只要有电,数据就可以保持存在,而一旦断电,数据就会丢失。

CPU Cache 通常分为大小不等的三级缓存,分别是 L1 CacheL2 CacheL3 Cache

部件 CPU访问所需时间 备注
L1 高速缓存 2~4 个时钟周期 每个 CPU 核心都有一块属于自己的 L1 高速缓存,L1 高速缓存通常分成指令缓存数据缓存
L2 高速缓存 10~20 个时钟周期 L2 高速缓存同样是每个 CPU 核心都有的
L3 高速缓存 20~60个时钟周期 L3 高速缓存是多个 CPU 核心共用

我们可以发现越靠近 CPU 核心的缓存其访问速度越快,容量也越来越小缓存读取数据过程。就像数据库缓存一样,首先在最快的缓存中找数据,如果缓存没有命中(Cache miss) 则往下一级找, 直到三级缓存都找不到时,最后会去内存找数据。

逻辑CPU

在历史上,为了提升CPU的性能,引入超标量、乱序运行、大量的寄存器及寄存器重命名、多指令解码器、预测运行、高速缓存等特性,这些特性从而让CPU拥有大量资源,并且CPU还能智能的预测执行指令。这就导致实际上CPU在大多数时间上,其资源是被闲置的,浪费是可耻的,为了进一步压榨CPU的性能,工程师发现,完全可以通过复制一些CPU内部组件,例如寄存器或一级缓存,来运行第二个线程,让这些闲置资源运行在另一个线程上。虽然只有一个物理CPU,但操作系统被提供了两个"逻辑CPU" ,而不是单个CPU,这样就成功使得操作系统被"欺骗"了。

逻辑CPU是什么?

操作系统可以使用逻辑CPU来模拟出真实CPU的效果。在从前没有多核处理器的时候,一个物理CPU只有一个物理内核,而现在有了多核技术,让物理核通过高速运算,让应用程序以为有两个CPU在运算,这样就可以把一个物理CPU当作多个"CPU"使用,即逻辑CPU

一般情况下,逻辑CPU=物理CPU个数*每颗核数,如果我们的电脑CPU支持超线程技术且开启的话,逻辑CPU的个数是核数的2倍逻辑CPU=物理CPU个数*每颗核数*2,超线程技术可以使得 处理器中的1 颗内核在操作系统中,如同2 颗内核那样发挥作用。

CPU的线程数?

还有一个我们需要知道:逻辑处理器个数 = CPU的线程数,也就是说有多少个逻辑处理器,就可以开多少个线程。对于一个CPU,线程数总是大于或等于核心数的。一个核心最少对应一个线程,但通过超线程技术,一个核心可以对应两个线程,也就是说它可以同时运行两个线程。

一般来说,物理CPU个数×每颗核数应该等于逻辑CPU的个数,如果不相等的话,则表示windows电脑的CPU支持超线程技术

超线程技术

CPU的线程数概念仅仅只针对Intel的CPU , 对于AMD的CPU来说,只有核心数的概念,没有线程数的概念。因为其是通过Intel超线程技术来实现的,Intel早在2002年推出的Northwood奔腾4 HT处理器就把这一技术带入到消费级市场。

超线程技术(SMT),就是可以把一个物理线程模拟出两个线程来使用,使得单个核心用起来像两个核一样,以充分发挥CPU的性能。

我们需要先了解一下,线程和进程的概念

  1. 进程:

进程可以看作是程序的一次执行过程。一个程序的运行需要CPU时间、内存空间、文件以及I/O等资源。操作系统就是以进程为单位来分配这些资源的,所以说进程是操作系统中资源分配的基本单位进程之间的资源是独立隔离的,能很好的进行资源管理和保护。

进程也是一个动态的过程:有它自身的产生,存在和消亡的过程

  1. 线程:

线程是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程可以包含多个线程,至少包含一个线程,与进程不同的是多个线程之间资源数据是共享的。所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。为了提高系统的执行效率,减少处理器的空转时间和调度切换的时间,线程取代了进程调度资源的基本功能,所以线程是资源调度的基本单位

CPU之所以要增加线程数,是源于多任务处理的需要。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。

超线程的原理其实是:由于CPU和寄存器,缓存,主存、硬盘的读取速度的差异不是一个数量级的,CPU非常快

比如主频为3.0GHZ的CPU,一个时钟周期大约是0.3纳秒,内存访问大约需要120纳秒,固态硬盘访问大约需要50-150微秒,机械硬盘访问大约需要1-10毫秒,最后网络访问最慢,得几十毫秒左右。

如果我们把一个时钟周期如果按1秒算的话,内存访问大约就是6分钟 ,固态硬盘大约是2-6天 ,传统硬盘大约是1-12个月,网络访问就得几年了

这就给了我们超线程技术,将CPU内部暂时闲置处理资源充分“调动”起来,使得CPU中看起来同时有2个逻辑核,在同时工作的可能性。

我们知道CPU是采用指令流水线的方式来执行任务,在一个逻辑核等待指令执行的间隔(等待从cache或内存中获取下一条指令),把时间片分配到另一个逻辑核。物理CPU高速地在这两个逻辑核之间切换,让操作系统感知不到这个间隔,实现了“同时执行多个任务”

像奔腾4 HT处理器多加入了一个逻辑处理单元,这让CPU可以同时执行多个程序而共享一颗CPU内的资源,如:ALU、FPU、 缓存等,当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续,所以单个物理CPU开启超线程的性能并不能等于两颗CPU的处理能力

超线程技术只增加了5%的芯片面积,就可换来15%~30%的性能提升,而后来的Nehalem架构带来了全新的超线程技术,得益于指令集分制预测技术与较短的流水线,它拥有比奔腾4好得多的效能,再加上整合了内存控制器让其拥有更大的内存带宽,还有更大的缓存,这样就更能够有效的发挥超线程的作用,Nehalem的超线程可以在增加很少能耗的情况下,让性能提升20-30%,后续每一代虽然都有一些小修改,不过基本上都是Nehalem架构的延续。

虽然超线程能让计算机核数增加,但实际上计算机的核数翻倍并不能简单地认为着计算机的性能也翻倍了,计算机的性能还受CPU主频、机器字长、指令字长、存储字长、主存、I/O速度、硬盘速度等因素影响,也不意味着核数越多计算机性能会越来越好,因为超线程只是充分利用了CPU的空闲资源,提升了CPU利用率

如何查看逻辑CPU数

我们再举个例子来理解一下逻辑CPU的概念:假设计算机有一个物理CPU,是2核的,支持超线程。那么这台计算机就是2核4线程的(4线程中线程数量也对应着逻辑CPU的数量)。 所以两路(两路指的是有两个物理CPU)四核超线程就有2*4*2=16个逻辑CPU。有人也把它称之为16核,实际上在linux的/proc/cpuinfo中查看只有8核。

  1. 在linux的cpuinfo中逻辑CPU数就是processor的数量。我们可以使用指令

cat /proc/cpuinfo | grep "processor" | wc -l来查看逻辑CPU数。

  1. 在windows任务管理器中 逻辑处理器的数量,就是逻辑CPU数。

呼噜噜的2台电脑比较垃圾,没法把开超线程的图贴给大家看看,大家可以自己去试试

小结

  1. 一个物理CPU可以有1个或者多个物理内核
  2. 一个物理内核可以有1个或者2个逻辑CPU

参考:

《深入理解计算机系统》

https://www.expreview.com/56674.html


本篇文章到这里就结束啦,很感谢你能看到最后,如果觉得文章对你有帮助,别忘记关注我!更多精彩的文章

计算机内功、JAVA源码、职业成长、项目实战、面试相关资料等更多精彩文章在公众号「小牛呼噜噜

聊聊CPU的发展历程之单核、多核、超线程的更多相关文章

  1. 不权威的国产CPU发展历程

    最近进行了一些国产化相关工作 趁着周末有时间,自己整理一下这段时间的学习内容. 毕竟不是处理器和芯片的业内人士,里面多有纰漏,请谅解. 希望可以作为入门学习的简单知识. 1.0 远古时代 unix 世 ...

  2. C#与C++的发展历程第二 - C#4.0再接再厉

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 开始本系列的第二篇,这篇文章中将介绍C#4.0中一些变化,如C++有类似功 ...

  3. mysql发展历程 各分支版本溯源

    首先为什么要了解mysql的历史,了解一个软件的前生后世有时候还是很有必要,特别是对于走在架构之路或者是想深入了解一个软件的时候,在不同版本中由于进行了很多的改进或者说加入了新的功能,也有可能是软件本 ...

  4. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  5. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

  6. 第一篇:GPU 编程技术的发展历程及现状

    前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构 ...

  7. 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS

    返回 自学工业控制网络之路 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS 工业控制系统是对诸如图像.语音信号等大数据量.高速率传输的要求,又催生了当前在商业领域风靡的以太网与 ...

  8. Web UI 技术发展历程

    本文内容 纯文本和静态 HTML 页面 服务器端技术 插件技术--ActiveX.Applet 和 Flash Ajax 异步时代和基于 JavaScript 的 UI 技术 RIA--Adobe F ...

  9. [Spark]-Spark发展历程与基本概念

    Hadoop十年 找了一张Hadoop十年的生态发展图: Spark概况: Apache Spark是一个开源簇运算框架,最初是由加州大学柏克莱分校AMPLab所开发.相对于Hadoop的MapRed ...

  10. docker发展历程

    docker发展历程 docker本身不是容器,它只是一个更加易用的前端管理器. 最早期的容器技术概念是用chroot来实现隔离,但是chroot只是提供了对进程文件目录虚拟化的功能,不能防止进程恶意 ...

随机推荐

  1. 3_JavaScript

    一. 介绍 JavaScript语言诞生主要是完成页面的数据验证, 因此它运行在客户端, 需要运行浏览器来解析执行JavaScript代码 JS是弱类型, Java是强类型 特点 交互性(它可以做的就 ...

  2. C++面向对象编程之虚指针、虚表

    1.当编译器看到一个函数调用,有2个考量:静态绑定or动态绑定 静态绑定是"call xxx",xxx 是表示地址,call 是汇编语言的一个动作,它一定会调用到某个地址: 当符合 ...

  3. HDU2586 How far away ? (树链剖分求LCA)

    用树链剖分求LCA的模板: 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const ...

  4. NOI2011阿狸的打字机

    题目链接 昨天晚上yy出了一个做法后,感觉...好难打啊...,于是先回去休息.今天来打时,还是感觉细节好多,于是就打了两个小时.打完过了编译后,居然过了样例,直接交,尼玛居然过了???......还 ...

  5. Windows7下驱动开发与调试体系构建——5.实战反调试标记位(NtGlobalFlag)

    目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html <加密与解密>P670中,介绍了检查程序是否被调试的第二种方法:查看进程 ...

  6. 来啦来啦|开源 * 安全 * 赋能 - .NET Conf China 2022

    大会介绍 .NET Conf China 2022 是面向开发人员的社区峰会,延续 .NET Conf 2022 的活动,庆祝 .NET 7 的发布和回顾过去一年来 .NET 在中国的发展成果,它是由 ...

  7. 优化if、elif过多

    优化if ,elif过多的场景 字典的成员运算,是判断字典的key 思路:把函数的内存地址存到字典当中 def login():    pass def scan(): pass def transf ...

  8. Go语言正/反向代理的姿势

    先重温一下什么叫反向代理,正向代理. 鹅厂二面,nginx回忆录 所谓正向,反向代理取决于代理的是出站请求,还是入站请求. 正向代理: 代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近. ...

  9. jvm调优思路及调优案例

    jvm调优思路及调优案例 ​ 我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代(Eden)里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时 ...

  10. 嵌入式-C语言基础:指针是存放变量的地址,那为什么要区分类型?

    指针是存放变量的地址,那为什么要区分类型?不能所有类型的变量都用一个类型吗?下面用一个例子来说明这个问题. #include<stdio.h> int main() { int a=0x1 ...