深入理解计算机CPU的参数: CPU主频、多个CPU、多核CPU、逻辑核(超线程)、 大小端

     原文发表于我的微信公众号"涛歌依旧",可以点击如下红色文字链接阅读:

  深入理解计算机CPU的参数: CPU主频、多个CPU、多核CPU、逻辑核(超线程)、 大小端 (链接)

 


 
      从微信公众号把原文直接复制过来,内容如下(图片和表格可能丢失,格式可能错乱,故建议直接点击上述红色链接阅读):

 

       对软件开发(尤其是后台服务开发)工程师来说,这几个概念几乎是必须要缕清的:CPU主频多个CPU、多核CPU、逻辑核(超线程)、大小端。本文我们会逐一来聊聊。

 

      在之前的文章中,我们见过古老的4004CPU,也分析过古老的8086CPU,并对它进行了汇编语言编程。它们都是单核的(每个CPU只有1个运算器&控制器)。

       那么,现代CPU长啥样子呢?来看下图的Intel CPU外形图:

 

       我们以"Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz"这款型号的CPU为例,最近价格大致是6300块人民币,挺贵的,来看下具体参数:

      

CPU主频(时钟频率) 

      这些参数中,人们最熟知的,是CPU主频(时钟频率)。买电脑时,肯定需要看CPU主频是多少。在前面的文章中,我们自制了一台简单的计算机,并且知道了:CPU时钟越快,产生上升沿/下降沿的速度就越快,就能更快地迫使其它器件工作。

      CPU的时钟,就好比龙舟比赛的击鼓人,击鼓频率越快,就迫使划船的人跟上节奏,龙舟也就越快,如下:

 

      另外,从上面的CPU参数中也可以看到,该CPU有12个物理核,每个物理核对应2个逻辑核(超线程技术),所以,从外部看, 该CPU有24个核(逻辑核)。 也就是说,该CPU有12个物理上的运算器&控制器,有24个逻辑上的运算器&控制器。

 

       服务器,是指配置比较高端的计算机。在我的一台服务器上,安装了2个如上型号的CPU,  总共12600块钱左右。

      我们用linux的lscpu命令,来查看服务器的CPU信息,并对相关参数给出解释:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Architecture:          x86_64              CPU架构CPU op-mode(s):        32-bit, 64-bitByte Order:            Little Endian       小端模式,程序员应该知道这点,本文最后会详细解析CPU(s):                48                  这里指逻辑核, 2个CPU的逻辑核数是48On-line CPU(s) list:   0-47                逻辑核的标号Thread(s) per core:    2                   每个物理核有2个逻辑核(超线程技术)Core(s) per socket:    12                  每个CPU有12个物理核Socket(s):             2                   计算机有2个插槽,插了2个CPUNUMA node(s):          2Vendor ID:             GenuineIntel        Intel公司CPU family:                6                   CPU家族编号为6Model:                 85Model name:            Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz       CPU型号Stepping:              4CPU MHz:               820.850CPU max MHz:           2101.0000           CPU上标注的2.1G,是最大频率,即超频CPU min MHz:           800.0000BogoMIPS:              4201.63Virtualization:        VT-xL1d cache:             32K                 L1数据缓存大小L1i cache:             32K                 L1指令缓存大小L2 cache:              1024K               L2缓存大小L3 cache:              16896K              L3缓存大小NUMA node0 CPU(s):     0-11,24-35NUMA node1 CPU(s):     12-23,36-47Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin mba tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts pku ospke      Flags是指令集

 

多个CPU           

        我们看lscpu的信息:

  •  
 Socket(s):             2

       可以看到,在这台服务器上,总共插了2个CPU,  这2个CPU是物理上的CPU, 人眼可以看到,手也可以触摸到:

 

多核CPU

       我们看lscpu的信息:

  •  
 Core(s) per socket:    12

       可以看到,针对每一个物理CPU而言,内部有12个物理核。也就是说,在一个物理CPU内,有12个物理层面的运算器&控制器,它们是实实在在存在的。很霸气的感觉,12个物理核如下图所示:

 

逻辑核(超线程)

        我们看lscpu的信息:

  •  

 

Thread(s) per core:    2

        由于Intel采用了超线程技术,所以每个物理核对应2个逻辑核:

 

       要注意,在物理上看来,只有一个核,但采用了超线程技术,在使用时,实际效果是2个核在同时并行(不是同步并发)工作,也即有2个逻辑核,如下图所示

 

         来看看超线程的介绍:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Hyper Threading technology was developed by Intel for their processors and appeared in the year 2002 and become visible in Pentium 4 Processors first.
In general, what is Hyper Threading Technology can be explained as, technology which allows each core of the processor to work on two different tasks at the same time and it is termed as multi tasking processing.
This technology works only when two processors with high processing requirement are running, such as a video editing tools and an antivirus.
This technology is also available for desktop replacement notebooks, in the mobile Pentium 4 Processor. In addition, the software is written for multi processor computers are capable with this Hyper Threading technology.
There is no single reason for the goodness of Hyper Threading but here we listed most important key factors of Hyper Threading technology.1. Improved application performance.2. Improved multitasking capabilities and lag free multitasking.3. Better graphics output in gaming and multimedia editing.4. Saves your much time because tasks are completing faster.
Hyper Threading is a new revolution for future computing because it is not only creating new targets for us but also makes our dream bigger.


       在上面这台服务器中,有多少个逻辑核呢?

      来算一下,服务器中插有2个物理CPU, 每个物理CPU有12个物理核,每个物理核又有2个逻辑核,所以,总共是48个逻辑核。

 

       因此,当操作系统俯视CPU硬件时,它看到的是,在计算机中,有48个核,即有48个运算器&控制器。对于操作系统而言,它可以认为有48个CPU核在同时并行(不是同步并发)为它提供服务,且看lscpu中的信息:

  •  
 CPU(s):                48

      这里的48个CPU(s), 其实就是48个逻辑核。有时,我们也可以说,这台服务器有48个核。

      这台服务器有2个CPU, 针对其中一个CPU,我们也可以说,它是"12核24线程"。

 

多核CPU和多个CPU

       来看下这个问题:多核CPU和多个CPU有何区别?

       

lscpu从哪里获取信息?

       那么,lscpu命令是从哪里读取信息的呢?且看:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

 

LSCPU(1) User Commands LSCPU(1)
NAME lscpu - display information about the CPU architecture
DESCRIPTION lscpu gathers CPU architecture information from sysfs and /proc/cpuinfo. The command output can be optimized for parsing or for easy readability by humans. The information includes, for example, the number of CPUs, threads, cores, sockets, and Non-Uniform Memory Access (NUMA) nodes. There is also information about the CPU caches and cache sharing, family, model, bogoMIPS, byte order, and stepping.

      因此,可以从/proc/cpuinfo中直接读取相关信息,如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
taoge:~$ cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l2     计算机上有两个物理CPU
taoge:~$ cat /proc/cpuinfo | grep "cpu cores" | sort | uniqcpu cores       : 12      每个物理CPU有12个物理核
taoge:~$ cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l48    计算机共有48个逻辑核

         

      我看了一下lscpu的源码,挺简单的,无非就是读取/proc/cpuinfo信息,然后解析并组装而已。有兴趣的朋友,可以去看看lscpu的源码:

https://github.com/karelzak/util-linux/blob/master/sys-utils/lscpu.c

 

/proc/cpuinfo的信息从何而来?

      既然lscpu从/proc/cpuinfo中获取信息,那么,我们自然要继续问:/proc/cpuinfo的信息从何而来?

      必然是在CPU内部存储了这些基本的信息啊。从这个意义上讲,CPU的指令集确实也存放在CPU中(在之前的文章中,我只说指令集存放在CPU使用手册中)。

      要注意,虽然CPU的指令集也存放在CPU中,但它仅仅是一个文本式的字符串信息而已,如下是lscpu获取的指令集信息:

  •  
Flags:  fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin mba tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts pku ospke

     

      来看看/proc/cpuinfo的信息,摘取部分,如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
processor       : 47      总共48个逻辑核,编号是0-47vendor_id       : GenuineIntelcpu family      : 6model           : 85model name      : Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHzstepping        : 4microcode       : 0x200004dcpu MHz         : 912.130cache size      : 16896 KBphysical id     : 1siblings        : 24core id         : 13cpu cores       : 12      1个物理CPU有12个物理核apicid          : 59initial apicid  : 59fpu             : yesfpu_exception   : yescpuid level     : 22wp              : yesflags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin mba tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts pku ospkebugs            : cpu_meltdown spectre_v1 spectre_v2bogomips        : 4201.63clflush size    : 64cache_alignment : 64address sizes   : 46 bits physical, 48 bits virtualpower management:

       

操作系统对核的分配     

       需要注意的是,如上的服务器有2个CPU,  每个CPU有12物理核,每个物理核有2个逻辑核, 这仅仅是针对特定服务器和CPU的。其他计算机或者CPU, 就不一定如此了。

      来看我的另外一台云服务器,其配置就比较寒酸了:总共只有1个CPU, 1个物理核,1个逻辑核:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
ubuntu@VM-0-15-ubuntu:~$ lscpuArchitecture:          x86_64CPU op-mode(s):        32-bit, 64-bitByte Order:            Little EndianCPU(s):                1On-line CPU(s) list:   0Thread(s) per core:    1Core(s) per socket:    1Socket(s):             1NUMA node(s):          1Vendor ID:             GenuineIntelCPU family:            6Model:                 79Model name:            Intel(R) Xeon(R) CPU E5-26xx v4Stepping:              1CPU MHz:               2394.446BogoMIPS:              4788.89Hypervisor vendor:     KVMVirtualization type:   fullL1d cache:             32KL1i cache:             32KL2 cache:              4096KNUMA node0 CPU(s):     0Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch bmi1 avx2 bmi2 rdseed adx xsaveoptubuntu@VM-0-15-ubuntu:~$

                 

       如果在这个单核服务器上,运行如下的死循环程序,会如何呢?

  •  
  •  
  •  
  •  
  •  
  •  
  •  

 

#include <stdio.h>
int main(){ while(1); // 死循环 return 0;}

        

      来看下top命令给出的结果,可以看到,1个进程就消耗了大约99.0%的CPU,整个CPU的使用率达到99.7%:

        

      那么,如果开启2个进程并发执行呢?可以看到,每个进程几乎都是占用49.x%的CPU,整个CPU的使用率达到99.7%:

 

      那么,如果开启3个进程并发执行呢?可以看到,每个进程几乎都是占用32.x%的CPU,整个CPU的使用率达到98.7%:

      可以看到,整个CPU几乎被瓜分殆尽。这种调度和分配,是由操作系统linux完成的。

 

      好的,我们再看在多核CPU上的情况。我找了另外一台服务器,用lscpu查看其CPU配置如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

 

hadoop:~$ lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 32On-line CPU(s) list: 0-31Thread(s) per core: 2Core(s) per socket: 8Socket(s): 2NUMA node(s): 2Vendor ID: GenuineIntelCPU family: 6Model: 79Model name: Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHzStepping: 1CPU MHz: 1198.750CPU max MHz: 3000.0000CPU min MHz: 1200.0000BogoMIPS: 4196.50Virtualization: VT-xL1d cache: 32KL1i cache: 32KL2 cache: 256KL3 cache: 20480KNUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts

       可以看到,这个服务器有32个逻辑核,简称32个核。

 

       好的,我们来运行一下死循环进程,用top命令来分析,可以看到,1个进程占满1个核,使用率100%, 而服务器32个核的使用率是3.6%:

 

      运行2个进程,可以看到,2个进程都占用99.7%的核,而服务器32个核的使用率是6.5%:

 

      运行3个进程,可以看到,3个进程都占用100%的核,而服务器32个核的使用率是9.8%  

 

      看到使用率为100%时,不要紧张,不要以为CPU就用完了,这台服务器有32个核呢(拥有3200%的能力)。

      来看下3个进程时,每个核的具体使用情况(3个进程,总共大概占用300%的核):

 

      这些值会动态地变化,而且不一定是消耗在某些固定的核上。核的调度和资源分配,由操作系统linux来完成:

      到此为止,我们对CPU逻辑核应该有了更深入的了解。

 

大小端模式

       最后,来看一个大小端的问题,看lscpu信息:

  •  

 

Byte Order: Little Endian

       它的含义是: CPU是小端模式。相信几乎所有的程序员都听说过这个概念,我们具体来测试一下:

      下面是在Intel CPU + Windows + VC++6.0上的测试结果,可以看到:低位的0x78存储在地址较小的位置(端模式):

 

      我找大端模式的CPU,  找了好久,终于找到了。下面是对8051单片机进行的仿真测试,可以看到:高位的0x12存储在地址较小的位置(大端模式):

 

 

       好了,至此为止,我们对CPU的基本参数,有了大致的了解。以后也可以谈笑风生地聊多个CPU、多核CPU、逻辑核和大小端模式了,装X吹水不成问题。

 

       先聊到这里,下次再见。

 

 

 

发布了2203 篇原创文章 · 获赞 4521 · 访问量 1971万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览