CPU相关的知识
本文介绍多CPU、物理核、逻辑核、超线程、进程、线程、并发、并行,以及Linux查询CPU和核的信息的方法
易混淆概念
多处理器
认真辨别语境,一般是多CPU的意思;有时可能是多逻辑处理器即多核的意思,好像老外经常把一个CPU里有多个核心当成多个CPU来描述。
逻辑处理器
就是逻辑核
的意思,Windows 10的中文翻译了这个特别特别容易误解的词。
逻辑CPU
有些博客用了这个词表示逻辑核
的意思,个人怀疑其有没有这样的用法的根据,很容易导致误解,因为我会认为,核就是核,CPU就是CPU,为什么混为一谈,好像核就是CPU一样
CPU的一~四级缓存
CPU缓存(Cache Memory)的出现是弥补CPU和主存(主内存,即内存条的)的速度差太大,用于提高效率的,有时可能也叫高速缓存
。
高速缓存也分了很多层,一到四级,四级很少听但确实是有。一二级是各个核心独有的,三级缓存是所有核共享的,四级缓存似乎是为了解决CPU的集显和CPU的速度差问题(CPU内可以有显卡)。一般CPU商品中只标出了三级缓存,其他都不标注。如图所示
(这里看不到L4 Cache,可能是因为只有L1~L3才封装在CPU里)
同样的多个核之间的L1、L2也会有缓存一致性问题,类似多核CPU有一些协议保证多个CPU内部缓存之间一致性的协议,同一个CPU内部的多核内部的缓存的一致性问题应该也是有方案解决的。
物理核、逻辑核和超线程
-
物理核:是CPU里实实在在封装的物理硬件
-
逻辑核:利用超线程技术模拟出来的核,一般一个物理核可以虚拟出2个,就是CPU商品标出的
线程数
,有些资料也叫逻辑CPU数
-
超线程:HT,Hyper-Threading,超线程技术就是让一个核模拟出两个核的技术
-
物理CPU:即主板上插了多少个的CPU芯片
-
虚拟CPU:假的、虚拟的CPU,类似VMWare虚拟机中的CPU
疑惑:
逻辑核似乎有些时候被翻译成逻辑处理器
,而处理器
通常被我理解为CPU
,所以逻辑核,就是逻辑CPU
吗? 但这种翻译真的会有点模糊不清容易造成误解。
线程和核的关系
线程需要 核
执行,一个核
在同一时间只能执行一条线程,这里的核指逻辑核。
决定同时执行线程数的是逻辑核还是物理核
逻辑核心多少个,就可以 “同时” 执行多少线程。
n个物理核,一般有2n个逻辑核,如果只能同时运行物理核数个个线程(n),那超线程技术模拟出来的核有什么用? 况且很多CPU的商品也不标 “逻辑核数”,用的词是 “线程数”,意思应该就是逻辑核心多少个就能同时运行多少个线程(2n)。
x核y线程(y比x大)是什么意思
CPU商品说的2核4线程,指2个物理核,4个逻辑核。4线程就是4个逻辑核的意思。
进程和线程
- 进程是操作系统层面的概念,线程是CPU层面的东西,CPU真正执行的是线程而不是进程
- 进程是是静态的概念,是一些资源的集合,比如进程有自己的内存;而线程是动态的概念
- 进程可以有多个线程,这些线程共享同一份进程的资源
- 多进程,目前多核的情况下,可以做到多个进程同时执行;当然也就可以做到多个线程同时执行。但是单核的CPU无法做到 “同时”
- 进程是一定有端口号吗? 不一定,没网络暴露的就没有
并发和并行
并发(concurrency)和并行(parallelism)
参考这里
简单说,
-
并行是说物理上的 “同时” 被执行。
-
并发是一种程序设计,能够让多个任务在逻辑上交织执行。
并发设计的程序,可以启动n个线程,比如2个,然后交给2个核,这时两个线程就是并行执行的(“同时”);这两个线程也可以被1个核 “交替” 执行。
很多时候,会认为并行
就是真的同时执行,而并发
就是交替执行,这是一般的理解,但是并发
真正含义是指设计的程序允许同时 或 交替执行,是一种程序设计方案。
多CPU 和 单CPU多核
估计是提高计算能力的两个方案,最终选择单CPU多核
方案多一点。
多CPU
估计也有市场,也有些服务器是多CPU的。
不过作为程序员,公司买的服务器似乎真的见不到多CPU的。
为什么单CPU多核
方案更胜一筹,主要是这个方案更好,多个核心之间通信不需要走外部的总线,只需要走CPU内部总线,会快得多。另外单CPU多核
也成本较多CPU
低,只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。
多核CPU缓存一致性协议有MSI、MESI(Illinois Protocol)、MOSI、Synapse、Firefly及 Dragon Protocol等。
单CPU多核内部缓存一致性协议:暂不清楚,请自行搜索。
多CPU
的市场:多CPU适用于大计算量,对速度(时间)不(太)敏感的任务,比如一些工程建模,或者像SATI找外星人这种极端的,跑上几千年都不着急的。
单CPU单核
单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 : 4
physical id : 1 cpu cores : 4
二、列出物理CPU
及各自的逻辑核
数
cat /proc/cpuinfo | grep "physical id" | sort | uniq -c
假设输出如下,则表示有两个物理CPU,各自包含8个逻辑核
8 physical id : 0
8 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 : 4
physical id : 1 cpu cores : 4
和
8 physical id : 0
8 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像作坊(比喻成工厂也行,但是一般作坊的人数小一点,人数相当于物理核数,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里的多线程一样。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135322.html