首先给本人一个介绍,自己是一个笨拙笨拙的女程序员,因为有一天忽然觉醒了,想在学习的过程中写一些笔记,以前始终不敢开始这个事件,因为我胆怯写错了,误导了他人,当初还是胆怯,如果真的误导了同行,你们也轻点喷我 哈哈哈接下来进入正题,明天来记录一下我本人学到的货色,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

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