文档章节

Java底层知识总结

 李向1994
发布于 02/14 21:44
字数 1695
阅读 158
收藏 0

CPU缓存

 

我们搞java的,平时写业务代码,会很少涉及到这方面的知识。但是如果要写出高性能的java代码,对于CPU Cache一块还是要有所了解的。

首先来讲寄存器为什么会比内存快

寄存器是在CPU内部的,当然读起来会更加快一点。以3GHz(Hz是每秒的周期次数)的CPU为例,电流每秒钟可以震荡30亿次。1秒=10亿纳秒,每次耗时大约为10/30纳秒,也就是0.33纳秒。光速是每秒300000000米,也就是说光在1纳秒可以前进30cm,在cpu的一个时钟周期内,光可以前进10cm。(理想状态下,真实情况下还要考虑到能量损失等等很多因素),如果内存距离CPU超过5cm,就不可以在一个时钟周期内完成数据的读取。

内存在硬件设计上,每个位就是一个电容和一个晶体管,而寄存器的晶体管一直有电,而内存的晶体管只有用到的才有电,没有用到就没有电,这样有利于省电。

寄存器和内存的工作方式不太相同。

寄存器的工作方式

1.找到相关的位
2.读取这些位

内存的工作方式

1.找到数据的指针。(指针可能会存放在寄存器中,所以这一步就已经包括寄存器的全部工作了)
2.将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址转换成实际的物理地址。
3.物理地址送往内存控制器(Memory Controller)。由内存控制器找出该地址在哪一根内存插槽上。
4.确认数据在哪一个内存块上,从该块读取数据
5.数据先送回内存控制器,再送回CPU,然后开始使用。

现在的CPU一般有3级缓存架构(后面会讲到),为什么需要CPU Cache呢?因为CPU震荡的频率太快了,快到主存跟不上了。这样在处理器时钟周期内,CPU常常要等待主存,浪费资源。所以Cache的出现,是为了缓解CPU和内存之间速度的匹配问题

带有CPU Cache的CPU执行计算的流程:

1.将程序和数据加载到主内存中。
2.将指令和数据加载到CPU Cache。
3.CPU执行指令,将结果写到CPU Cache。
4.CPU Cache写回到主内存中。

CPU Cache的意义在何处?

1.时间局部性:如果某个数据被访问,那么在不久的将来它很可能被再次访问。
2.空间局部性:如果某个数据被访问,那么与它相邻的数据很快也可能会被访问。

在CPU访问存储设备时,无论是存取数据或者是存取指令,都趋于聚集在一片连续的区域中,被称为局部性原理。

说到这里,我要说一个协议,CPU多级缓存一致性协议(MESI)。这个协议用于保证多个CPU Cache之间缓存共享数据的一致性。我的电脑就有CPU三级缓存,后面会详细介绍CPU三级缓存。

在CPU里面,缓存是以缓存行(Cache line)的形式存在。Cache line缓存存储数据的单元,每个Cache line有4种状态,分别是Modified(修改)、Exclusive(独占)、Shared(共享)、Invaild(无效)。一个Cache line有64Byte(字节,一个字节等于8bit)


4种状态详细说明如下

对于M和E状态而言总是精确的,它们和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个缓存将处于S状态的Cache line作废了,而另一个缓存实际上独享了该Cache line,但该缓存却不会将该Cache line设置为E状态。

这是因为其他缓存不会广播它们作废该Cache line的通知,同样由于缓存并没有保存该Cache line的Copy数量,即便有这种通知也无法确定自己是否已经独享了该缓存行。

可以看出E状态是一种投机性优化。如果一个CPU想修改一个处于S状态的Cache line,总线事务需要将所有Cache line的Copy变成Invalid状态,而修改E状态的缓存不需要使用到总线事务。

 

关于CPU的计算机基础知识

存储单元是以字节为单位的,1B=8b 1KB=1024B 1MB=1024KB 1GB=1024MB
2^32 = 4GB 2^64=1800万TB

比如64位的操作系统只是字节的64位,数据总线是64根,真正决定内存大小的是地址总线的数目,即寻址空间。

数据总线:
1.是CPU与内存或者其他器件之间的数据传送的通道。
2.数据总线的宽度决定了CPU和外界的数据传送速度。
3.每条传输线一次只能传输1位二进制数据,比如32位操作系统,32根数据线一次可传送32位二进制数据,也就是4个字节。
4.数据总线是数据线数量之和。

地址总线:
1.CPU是通过地址总线来执行存储单元的。
2.地址总线决定了CPU所能访问的最大内存空间大小。比如32位操作系统有32根地址线,那么CPU就能访问2^32=4GB存储单元。
3.地址总线是地址线数量之和。

控制总线:
1.CPU通过控制总线对外部器件进行控制。
2.控制总线的宽度决定了CPU对外部器件中的控制能力。
3.控制总线是控制线数量之和。

来总结一波,每个CPU芯片都有很多管脚,这些管脚和总线相连。也就是说这些管脚引出总线。一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能。

  • 地址总线的宽度决定了CPU寻址能力。
  • 数据总线的宽度决定了CPU与其他器件进行数据传送时一次数据传送量。
  • 控制总线的宽度决定了CPU对系统中其他器件的控制能力。

 

© 著作权归作者所有

下一篇: 多线程系列一
粉丝 0
博文 6
码字总数 16016
作品 0
私信 提问
加载中

评论(0)

GitHub 上可供新手阅读和玩耍的 Java 项目有哪些?

1.JavaGuide star:62.4k Java学习+面试指南。涵盖了Java语言、操作系统、数据结果与算法、数据库、系统设计等大部分Java程序员所需要掌握的核心知识。 2.算法-Java star:19.8k 适合用Java编...

九章算法
2019/11/26
0
0
Java程序员该如何突破瓶颈!

一、源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂。 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。 我认为...

JAVA高级架构开发
2018/08/31
0
0
书单丨24岁的Java,到底有多美?

  Java诞生二十多年来尽管有坎坷有颠簸   但仍在计算核心层面占有重要地位   且多年来达成的辉煌仍无人能及   跟随本书单走进Java,一同领略Java之美   《码出高效:Java开发手册》...

java进阶架构师
2019/11/26
0
0
阿里巴巴、百度、腾讯都在用的Java架构师知识体系

源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂。 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。 我认为是阅读源码的最...

互联网架构师
2018/07/25
0
0
阿里、百度等多家公司Java面试记录与总结

算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验。 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向...

2018/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初学数据结构--堆和优先队列

初学数据结构--堆和优先队列 在之前的那两章详细的向各位介绍了二分搜索树这种数据结构,同时我们使用二分搜索树实现了集合和映射这两个相对来讲更加高层的数据结构。那么树,这种数据结构本...

loubobooo
11分钟前
43
0
Elasticsearch7.3.2下载安装

1. es镜像下载 https://thans.cn/mirror/elasticsearch.html 2. rz上传到/usr/local 3. 解压 tar -zxf elasticsearch-7.3.2-linux-x86_64.tar.gz 4. 配置elasticsearch.yml cd /usr/local......

joininjoy
13分钟前
34
0
iOS面试题--性能优化篇

1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积...

G_
21分钟前
44
0
第 430 期 Python 周刊

文章,教程和讲座 使你的 Python 程序运行快一点 链接: https://martinheinz.dev/blog/13 不喜欢 Python 语言的人总是说它的运行速度很慢。对于特定的程序(无论使用何种编程语言), 它的快慢...

iCodeBugs
31分钟前
75
0
Linux中修改环境变量及生效方法

Linux中修改环境变量及生效方法 方法一:   在/etc/profile文件中添加变量【对所有用户生效(永久的)】   用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且...

突突突酱
31分钟前
34
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部