CPU知识本文介绍了多CPU、物理核心、逻辑核心、超线程、进程、线程、并发、并行以及Linux如何查询CPU和核心信息
易混淆的概念多处理器会认真辨别上下文,一般来说,它可能是多CPU的意思,有时也可能是多逻辑处理器或多核的意思。 外国人似乎经常把一个CPU有多个内核描述为多个CPU。
逻辑处理器是逻辑核的意思,Windows 10的中文翻译了这个特别容易误解的词。
一些逻辑CPU的博客使用这个词是逻辑核心的意思。 我个人怀疑是否有使用这种用法的根据。 容易引起误解。 我是认为,核就是核,CPU就是CPU,为什么混为一谈,好像核就是CPU一样
CPU1~ 4级高速缓存CPU高速缓存(Cache Memory )的出现,是由于CPU和主存储器(主存储器)即记忆棒的速度差过大,从而提高效率的,有时也称为高速缓存
缓存也分为很多层,到了四级的话,四级我就不怎么问了,但确实有。 第一级和第二级是每个核心特有的,所有核心共享第三级缓存。 第4级高速缓存似乎是为了解决CPU集成和CPU速度差的问题。 (CPU中可以有显卡。 典型的CPU产品只显示三级高速缓存,其他情况下不显示。 如图所示
(这里看不到L4 Cache可能是因为只有L1~L3封装在CPU中。)
同一个多个核之间的L1、L2也存在缓存一致性问题。 就像多核CPU有一个协议可以确保多个CPU内部缓存之间的一致性协议一样,同一CPU内部的多核内部缓存一致性问题也应该可以解决。
物理核、逻辑核、超线程物理核:在CPU中实现的物理硬件
逻辑核心:利用超线程技术模拟的核心通常可以在一个物理核心中创建两个虚拟核心。 那是CPU商品上记载的线程数,有些资料也称为逻辑CPU数
超线程:超线程、超线程和超线程技术是指在一个内核中模拟两个内核的技术
物理CPU :即主板上连接了多少个CPU芯片
虚拟CPU :虚拟虚拟CPU,如VMware虚拟机的CPU
疑惑:
逻辑核心有时也翻译为逻辑处理器,因为处理器通常被理解为CPU,所以逻辑核心是指逻辑CPU吗? 但是,这个翻译真的很模糊,容易引起误解。
线程和内核的关系线程必须由内核执行,一个内核一次只能运行一个线程。 这里的内核指的是逻辑内核。
同时执行的线程数量取决于逻辑核还是物理核有多少逻辑核,以及可以“同时”执行多少线程。
n个物理核一般具有2n个逻辑核。 如果只能同时运行几个物理内核的线程(n ),超线程技术模拟的内核有什么用? 而且,很多CPU的商品都没有“逻辑核心数”的标记。 使用了“线程数”这个词。 我想是有多少个逻辑核可以同时执行多少个线程(2n )的意思。
核心y线程(y大于x )在CPU商品中指的双核四线程是指两个物理核、四个逻辑核。 4线程是4个逻辑核心的意思。
进程和线程进程是操作系统级别的概念,线程是CPU级别的。 CPU实际执行的是线程,不是进程进程而是静态的概念,是进程拥有独自的内存等资源的集合。 另一方面,在动态概念过程中线程可以具有多个线程,这些线程可以共享同一进程的资源多进程,在目前多核的情况下,多个进程可以同时执行; 当然,也可以同时运行多个线程。 但是,单核CPU无法进行“同时”进程的一定有端口号吗? 不一定没有网络露出的是同时并行(concurrency )和并行(parallelism )
参考这里
简而言之,
并行是指执行物理上的“同时”。
并发是一种可以在逻辑上交错执行多个任务的编程。
并行设计的程序可以启动n个线程,例如两个,并传递给两个核心。 此时,两个线程将并行执行(“同时”)。 也可以在一个核心上“交替”执行这两个线程。
一般的理解是,在大多数情况下,并行真的是同时执行,同时执行是指交替执行,但并行执行的真正含义是所设计的程序允许同时或交替执行,为程序设计方案。
估计多CPU和单CPU多核是提高计算能力的两种方案,最终选择多一点单CPU多核方案。
我觉得多CPU也有市场。 有些服务器有多个CPU。
但是,作为程序员,公司买的服务器似乎真的看不到多CPU的。
要说为什么单CPU多核方式更好,主要是这种方式更好。 多个核心之间的通信不需要使用外部总线,只需使用CPU内部总线就能快得多。 单CPU多核也成本高、CPU低,只需一套芯片组、存储器,多核之间通过芯片内部总线进行通信,共享内存。
多核CPU缓存一致性协议包括MSI、空闲协议(mesi )、MOSI、Synapse、Firefly和驱动协议。
单CPU多核内部缓存一致性协议:我还不知道。 请自己搜索。
多CPU市场:多CPU适用于某些工程建模和对计算量大、速度(时间)不太敏感的任务,例如SATI寻找外星人那样极端,跑了几千年也不着急。
单处理器单处理器
核 单CPU单核 跑多线程效率一定降低吗?不一定
降低:如果多线程跑的都是CPU密集型任务,有可能会降低效率,因为仅有的一个核被用满了还要被调度来调度去浪费时间提升:如果多线程跑的都是IO密集型任务,有可能会提高,因为IO比CPU运行慢得多,来回切换线程,让这个核物尽其用。其调度损耗是值得的。举个例子:我有两家店(两个任务),这两家店隔了一条街道,我招了一个工人(一个CPU核),如果打理一家店铺就很忙得不可开交,你还让他打理两家店,来回在两家店跑来跑去,这反而降低了效率。如果这两个店铺都是处理1小时事情之后闲3个小时的,显然让他来回在两家店跑能榨干他的价值,能提高效率
单CPU多核经常会听到 CPU都普及多核了,编程应该好好利用,其实确实是存在目前的编程没有充分利用多核CPU的性能,不过可能是因为多线程的编程比较复杂的原因。
单CPU多核,对于多线程确实提升作用大。不要钱的话肯定是多核比单核CPU好的呀。
Linux中查看CPU和核信息cat /proc/cpuinfo 得到的信息应该是以逻辑核为单位的列表信息。每个逻辑核的信息包括其归属的物理核ID(core id),以及其归属的物理CPU的ID(physical id)
一、列出物理CPU及各自的物理核数cat /proc/cpuinfo | grep -E "physical id|cpu cores" | sed 'N;s/n/ /' | sort | uniq
假设输出如下,则表示有2个物理CPU,第一个CPU有4个物理核,第二个CPU也是4个:physical id : 0 cpu cores : 4physical id : 1 cpu cores : 4 二、列出物理CPU及各自的逻辑核数cat /proc/cpuinfo | grep "physical id" | sort | uniq -c
假设输出如下,则表示有两个物理CPU,各自包含8个逻辑核8 physical id : 08 physical id : 1 三、查询CPU类型(虚拟、真实)cat /proc/cpuinfo后查看model name,
例如Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz 大概表示是真实CPU
或者QEMU Virtual CPU version (cpu64-rhel6) 表示虚拟CPU
四、查询CPU是否支持超线程按照上面两个结果
physical id : 0 cpu cores : 4physical id : 1 cpu cores : 4和8 physical id : 08 physical id : 1可以得出第一个CPU(physical id是0)支持,因为其物理核4个逻辑核却又8个,第二个CPU(id是1)同样也支持。如果物理核和逻辑核的数量不等,不代表不支持,可能没打开开关。 五、top命令显示的核数是?输入top按1可以展示出所有逻辑核,从Cpu0~CpuN,就是说有N+1个逻辑核。
是逻辑核数。
六、Java进程占用CPU超过100%top查看进程的%CPU值,为什么会CPU占用率超过100%
因为该进程占用超过一个核,占满2个核就是200%了。
七、/proc/cpuinfo文件解释 * model name:是CPU的型号主频一些信息,例如`Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz`或者`QEMU Virtual CPU version (cpu64-rhel6)`应该能大概看得出是虚拟CPU还是真实的CPU* processor:指逻辑核ID,比如0,表示第1个逻辑核,不是零个逻辑核意思* physical id:物理CPU的ID,0表示第一个* core id:物理核的ID,0表示第一个* cpu cores:该物理CPU有多少个物理核* siblings:该物理CPU有多少个逻辑核(跟cpu cores不一样表示开启了超线程技术,否则表示不支持该技术或者未开启) 八、其他补充其实有了上面的教程,就没必要看这个了,由于非常多其他博客也列出来了,这里也列出来。
1、物理CPU数cat /proc/cpuinfo | grep 'physical id' | uniq |wc -l
uniq是为了去掉多个逻辑核同属于一个物理CPU
2、物理核数(所有CPU)cat /proc/cpuinfo | grep 'core id' | uniq |wc -l
uniq为了去掉多个逻辑核属于同一个物理核
上述计算方式是计算所有CPU加起来有多少核,并不是计算某个CPU有多少核
3、物理核数(某个CPU)cat /proc/cpuinfo 后查看cpu cores,该值记录了对应的物理CPU(以该条目中的physical id标识)有多少个物理核。
4、逻辑核数(所有CPU)逻辑核数,有些地方会逻辑CPU数
cat /proc/cpuinfo | grep 'processor' | wc -l
5、逻辑核数(某个CPU)cat /proc/cpuinfo后查看siblings,该值记录了对应的物理CPU(以该条目中的physical id标识)有多少个逻辑核。
6、查看是否支持超线程cat /proc/cpuinfo后查看siblings和cpu cores不一致,说明该physical id的CPU支持超线程,如果一致,明不支持超线程,或者超线程未打开。
最后:补充关于超线程写这篇文章已经过了很久了,补充一点内容。
我们经常听到双核四线程、四核八线程等等概念,通常是n核2n线程这样通常是2倍的(我还没听过不是2倍的)
究竟超线程是什么呢? 这里我靠着之前看的资料的记忆,写一点。
比喻
cpu像作坊(比喻成工厂也行,但是一般作坊的人数lgdbb点,人数相当于物理核数,cpu的物理核数一般不会很多,所以作坊比较合适)
人就像物理核,每个工人有两条传送带,人在两条传送带上来回切换,将人的时间榨到最尽。两条传送带,意思就是2个物理核。4核八线程,意思就是作坊里有4个人,每个人有2条传送带,即总共8条传送带(线程)。
PS:传送带给传送的是待处理的零部件,相当于指令带上传送的指令。
进一步
对于4核4线程(A),和4核8线程(B),和8核8线程©,哪个效率更高? 肯定是C其次B最后A,毕竟真8核比 “假” 8核和真4核肯定是快的。但是你说哪个性价比最高? B最高。
超线程技术应该就是因特尔长期观察、总结的经验,即CPU的核心经常不能跑满,为了尽量榨干性能,所以模拟出了虚拟的核。
问题:你说4核8线程这种技术,真的能在同一时刻执行程序的8条线程吗? 我感觉似乎不行,毕竟是假的8核。就有点点像是Java里的多线程一样。