乐趣区

关于java:java程序员需要知道的底层知识一修改

首先给本人一个介绍,自己是一个笨拙笨拙的女程序员,因为有一天忽然觉醒了,想在学习的过程中写一些笔记,以前始终不敢开始这个事件,因为我胆怯写错了,误导了他人,当初还是胆怯,如果真的误导了同行,你们也轻点喷我 哈哈哈
接下来进入正题,明天来记录一下我本人学到的货色,Java 相干的硬件常识,说到这个咱们先谈谈计算机的最重要的组成部分,跟咱们写程序分割比拟严密的局部:先来看看计算机的组成,如下图:

一、cpu(计算机的重要组成部分)

cpu 是计算机的外围组成部分,性能次要是解释计算机指令以及解决计算机软件中的数据,cpu 中有一个重要的部件,就是时钟发生器,他就像人的心脏,推动着 cpu 进行一步一步的计算,比方我计算 3 + 2 须要多少步骤,通过时钟发生器一直的通电断电给 cpu 信号,推动 cpu 进行计算(比拟粗略的了解)PC:Program Counter 程序计数器(每个线程公有) 记录以后指令的地址
Registers: 寄存器 临时存储 cpu 计算须要用到的数据
ALU:Arithmetic & Login Unit 逻辑运算单元
    ALU 逻辑运算单元,当一个线程取得执行工夫片开始执行,须要进行运算的时候,那么 ALU 从寄存器中取出某个线程的数据来进行运算,此处有一个知识点,就是当初说的超线程,比方两核四线程、四核八线程,是怎么实现的,比方原来的单核单线程,就是一个 cpu 的一个核外面只有一组 PC(程序计数器)和 Registers(寄存器),当一个线程取得执行工夫片时,须要将前一个线程的数据先保存起来,再将本人的数据放入 PC 和 Registers,而超线程的实现,就是 cpu 的一个核外面有两组 PC 和 Registers,当其中的一个线程取得执行的工夫片之后,ALU 能够间接去该线程对应的 PC 和 Registers 获得数据,节俭线程切换的耗费,达到晋升性能的目标,如下图:

CU:Control Unit 管制单元(自己还没了解透彻)

MMU:Memory Management Unit 内存治理单元(自己还没了解透彻)cache: 缓存
    cpu 和内存的速度比大略是 100:1,缓存就是为了解决 cpu 和内存的速度差别,缓存分为 L1、L2、L3,cpu 的每一个核都领有独立的 L1、L2 这两级缓存,L3 是所有核共享的,如下图:


上面咱们再介绍缓存行的概念,缓存行是 cpu 缓存零碎中的根本单位,当 cpu 从内存当中读取数据的时候,并不是你须要某个字节就只读取某个字节,而是将你须要的字节所在的内存块读取到缓存行,因为依据肯定的预测,可能须要的数据也不只是这一个字节,兴许四周的数据你也是须要的,这样的读取也能够提高效率

    到这里,再记录一个与缓存行无关的常识,MESI 协定,缓存一致性协定是指一个缓存行,在不同的 cpu 中被批改之后,要保证数据统一,每个缓存行都有额定的两个位来存储缓存行的状态(modified、exclusive、shared、invalid), 当处于同一个缓存行的数据,在 A(cpu 的内核)处被批改,那么 B 处的缓存即将变成生效状态,当 B 须要批改同一个缓存行的数据时,须要从新从内存中读取数据再进行批改,缓存一致性协定有 MSI,MESI(Intel)、synapse、Firely、Dragon 等,不同品牌的 cpu 应用不同的缓存一致性协定
    此处有一个问题叫伪共享,咱们以 Intel cpu 举例,当 cpu 的两个核别离批改了同一个缓存行中的独立变量时,实际上两个变量是互不影响的,然而因为他们在一个缓存行中,当 A 批改了 a,B 中的缓存行就会变成生效状态,这个时候如果 B 批改 b,就必须要先提交 A 中的缓存行,而后 B 再去内存当中读取这个缓存行进行批改,此操作应该是一个并行操作,然而因为缓存一致性,却变成了串行,反而升高了效率
    解决办法是, 缓存行对齐:对于一些特地敏感的数字,会存在线程高竞争的拜访,能够应用缓存行对齐的编程形式
JDK7 中,很多采纳 long padding 提高效率

JDK8,退出了 @Contended 注解
须要加上:JVM -XX:-RestrictContended

二、内存(计算机的重要组成部分)(下次钻研哈哈哈哈)

退出移动版