据说你只知内存,而不知缓存?CPU表示很伤心!

通常咱们的开发同窗们都知道本身机器的CPU是几核、内存是多大。可是对于CPU内部对程序性能影响较大的缓存倒是只知其一;不知其二。有些开发同窗都是计算机的缓存有L一、L二、L3,可是再详细一点的问题,可能就不多有同窗能答的完整了。若是下面这几个问题你能脱口而出,请跳过本节。例如:php

  • 缓存究竟在哪里?
  • L1有几种?
  • 你的缓存有几级,分别是多大?
  • 你的24核的机器,一二三级缓存分别有几个,存在共享的状况吗?

其实缓存对计算机程序运行性能影响极大,可是他们在开发同窗心目中的存在感却不如内存高。要知道CPU缓存以及缓存算法的设计是现代CPU设计的核心任务之一。飞哥以为缓存们必定感到很伤心。redis

Intel CPU体系结构

其实在286以前的时代的CPU本是没有缓存的,由于当时的CPU和内存速度差别没有如今这么大,CPU直接访问内存。可是到386时代,CPU和内存的速度不匹配了,第一次出现了缓存。并且最先的缓存并无放在CPU模块里,而是放在主板上的。再日后CPU愈来愈快,如今CPU的速度比内存要快百倍以上,因此就逐步演化出了L一、L二、L3三级缓存结构,并且都集成到的CPU芯片里,以进一步提升访问速度。算法

咱们来看下现代Intel的CPU架构的基本结构。windows

file

L1最接近于CPU,速度也最快,可是容量最小。通常现代CPU的L1会分红两个,一个用来cache data,一个用来cache code,这是由于code和data的更新策略并不相同,并且由于CISC的变长指令,code cache要作特殊优化。 通常每一个核都有本身独立的data L1和code L1。
越往下,速度越慢,容量越大。L2通常也能够作到每一个核一个独立的。可是L3通常就是整颗CPU共享的了。
UEFIBlog里提供了一个比较好的物理解剖图,比较好地展现了出来: 缓存

file

实际查看

上面介绍的只是笼统的概念。可是每一个CPU的缓存都是不同的,并且“纸上得来终觉浅”,我以为咱们仍是有必要进行下一步的实机勘探工做。架构

Linux的内核的开发者定义了一套框架模型来完成这一目的,它就是CPUFreq系统。
CPUFreq提供的sysfs接口,可让咱们看到比/proc/cpuinfo更为详细的CPU详细信息。框架

# cd /sys/devices/system/cpu/;ll
drwxr-xr-x 7 root root    0 Apr 15 15:29 cpu0  
drwxr-xr-x 7 root root    0 Apr 15 15:29 cpu1  
......
  • L1一级缓存查看:
# cat cpu0/cache/index0/level  
1  
# cat cpu0/cache/index0/size  
32K  
# cat cpu0/cache/index0/type  
Data  
# cat cpu0/cache/index0/shared_cpu_list  
0,12  
# cat cpu0/cache/index1/level  
1
# cat cpu0/cache/index1/size  
32K  
# cat cpu0/cache/index1/type  
Instruction  
# cat cpu0/cache/index1/shared_cpu_list  
0,12

从上面的level接口能够看出index0和index1都是一级缓存,只不过一个是Data数据缓存,一个是Instruction也就是代码缓存。
等等,上面提到的是每一个Core是独立的L1缓存,为何shared_cpu_list显示有共享?对了咱们这里看到的cpu0并非物理Core,而是逻辑核,都是超线程技术虚拟出来的。 实际上cpu0和cpu12是属于一个物理Core,因此每一个Data L1和Instruction是这两个逻辑核共享的。
个人这台电脑里,总共是有12个Data L1,12个Instrunction L1,大小都是32K。ide

  • L2二级缓存查看:
# cat cpu0/cache/index2/size  
256K  
# cat cpu0/cache/index2/type 
Unified  
# cat cpu0/cache/index2/shared_cpu_list  
0,12

二级缓存要比一级缓存大很多,有256K,可是不分Data和Instruction。另外L2和L1同样,也是总共有12个,每两个逻辑核共享一个L2。函数

  • L3三级缓存查看:
# cat cpu0/cache/index3/size  
12288K  
# cat cpu0/cache/index3/type  
Unified  
# cat cpu0/cache/index3/shared_cpu_list  
0-5,12-17  
#cat cpu6/cache/index3/shared_cpu_list  
6-11,18-23

L3达到了12M,你去买CPU的时候商品里能看到的缓存属性通常告诉你的就是这个L3属性。由于L3要比L2和L1看起来要大的多,能激发你购买的欲望。但实际上个人这台电脑里L3只有两个,每一个CPU各一个,不像是L二、L1有不少。第0-5,12-17号逻辑核共享一个L3,由于它们是在一个物理CPU上。6-11,18-23共享另外一个。 性能

另外,Linux上还有个dmidecode命令,也能查看到一些关于CPU缓存的信息,感兴趣的小伙伴们能够试试

# dmidecode -t cache

可能有的同窗会问了,我用的操做系统是windows啊,怎么看?打开cmd命令行,输入如下命令试试吧,飞哥在windows上知道的就这么多了,感兴趣的话你本身google上搜搜吧。

# wmic cpu get L2CacheSize,L3CacheSize

扩展知识

Cache Line:咱们前面只介绍了各个级别的缓存,可是这里面有个很重要的概念就是Cache Line,就是本级缓存向下一层取数据时的基本单位。能够经过以下方式查看:

# cd /sys/devices/system/cpu/;ll
# cat cpu0/cache/index0/coherency_line_size
64
# cat cpu0/cache/index1/coherency_line_size
64
# cat cpu0/cache/index2/coherency_line_size
64
# cat cpu0/cache/index3/coherency_line_size
64

能够看到L一、L二、L3的Cache Line大小都是64字节(注意是字节)。就是说每次cpu从内存获取数据的时候,都是以该单位来进行的,哪怕你只取一个bit,CPU也是给你取一个Cache Line而后放到各级缓存里存起来。请你们紧紧记住这个概念,之后的文章中咱们会用到。


file


开发内功修炼之CPU篇专辑:


个人公众号是「开发内功修炼」,在这里我不是单纯介绍技术理论,也不仅介绍实践经验。而是把理论与实践结合起来,用实践加深对理论的理解、用理论提升你的技术实践能力。欢迎你来关注个人公众号,也请分享给你的好友~~~

相关文章
相关标签/搜索