首先给自己一个介绍,本人是一个蠢笨蠢笨的女程序员,由于有一天突然觉悟了,想在学习的过程中写一些笔记,以前一直不敢开始这个事情,因为我害怕写错了,误导了别人,现在还是害怕,如果真的误导了同行,你们也轻点喷我 哈哈哈

接下来进入正题,今天来记录一下我自己学到的东西,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

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

Java需要掌握的底层知识_java程序员需要知道的底层知识(一)相关推荐

  1. java 与操作系统底层交互_java程序员需要知道的底层知识(四)

    笔记开始 1. 进程 进程:就是一个程序运行起来的状态,进程是操作系统用来分配资源的基本单位,分配资源指的是独立的内存空间 僵尸进程:当A进程fork(底层调的clone)了一个B进程,那么A叫做B的 ...

  2. Java需要掌握的底层知识_Java程序员应该掌握的底层知识

    缓存 缓存行: 缓存行越大,局部性空间效率越高,但读取时间慢 缓存行越小,局部性空间效率越低,但读取时间快 取一个折中值,目前多用: 64字节 public class CacheLinePaddin ...

  3. java 数学公式解析框架有哪些_java程序员该如何进阶?这份java中高级核心知识全面解析请收好...

    <Java中高级核心知识全面解析>是整理收录GitHub50K+Star以上的高质量学习文档,前前后后花了近半个月的时间,终于整理而成.包含了Java基础.网络.Linux.数据结构与算法 ...

  4. java必须掌握哪些知识_Java程序员必须掌握的知识

    1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项, ...

  5. java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...

    Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...

  6. java中10d是什么意思_java程序员面试自我介绍

    java程序员面试自我介绍 当面试考官随便地问你:"谈谈你自己的情况如何?"这是面试中的第一个问题.此刻,你应把在此之前所有紧张不安的情绪稳定下来.因为这个问题,应试者已经做了充分 ...

  7. java中级招聘要求怎么写_Java程序员如何进阶,一般招聘都有哪些要求?

    原标题:Java程序员如何进阶,一般招聘都有哪些要求? 作为当前市场上应用领域最广.人才需求最大的编程语言,Java一直是人们入行IT行业的选择.然而,随着大批量的人涌入Java开发行业,企业的招聘门 ...

  8. java相关的数学知识_程序员必备的一些数学基础知识

    作为一个标准的程序员,应该有一些基本的数学素养,尤其现在很多人在学习人工智能相关知识,想抓住一波人工智能的机会.很多程序员可能连这样一些基础的数学问题都回答不上来. 矩阵A(m,n)与矩阵B(n,k) ...

  9. java没有指针和析构所以_Java程序员学习C++之构造函数和析构函数调用的时机

    今天看书忽然对这个地方有点模糊,尤其是析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢.写段代码总结下 #include usingnamespacestd; classBox ...

最新文章

  1. 右键点“工作空间”窗口内空白部分,在弹出的菜单上勾选“Docking View / 停靠式”。然后双击程序窗口的窗棱,就是最上面那条蓝色边框
  2. fatal error C1189: #error : Building MFC application with /MD[d]
  3. Reachable Numbers
  4. 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联
  5. java for循环返回值_JAVA——for循环
  6. 查看linux cpu负载均衡,关于linux内核cpu进程的负载均衡
  7. java 排序方法详解_java中关于排序方式的实例讲解
  8. Echarts数据可视化series-effectscatter特效散点图,开发全解+完美注释
  9. C++开发语言的特点及工作原理
  10. vs运行c语言代码快捷键,VS2010快捷键
  11. JavaScript数据结构与算法 - 散列表
  12. 谈谈MATLAB大数据处理
  13. 数据库驱动程序是什么?
  14. led大屏按实际尺寸设计画面_微间距LED大屏幕拼接显示系统设计方案
  15. 大器晚成总比一事无成要强
  16. Licecap for Mac使用教程
  17. 切换电脑计算机名称软件,多电脑切换器
  18. 微信整人假红包图片_微信假红包图片生成器,假红包生成器微信(玩别人没商量)...
  19. 4月28日Java笔记109p
  20. ffmpeg 多视频 画中画

热门文章

  1. winform程序最大化时,页面显示不全的问题
  2. mfc中主窗体显示(任务栏上方显示)
  3. Android—内存泄漏、GC及LeakCanary源码解析
  4. java 连接 oracle 10_java-连接到oracle 10g数据库时,获得IOException“...
  5. pythonfor循环100次_【零基础学Python】For循环和RANGE()函数
  6. Retrofit网络请求参数注解,@Path、@Query、@Post、Body等总结(超级实用)以及以Json格式和form-data格式提交数据
  7. FloatingActionButton完美显示
  8. python中eps参数_2019-01-23 python PIL 编辑 EPS 文件调整大小并拼接-失败告终
  9. 人工蜂群算法python_人工蜂群算法-python实现
  10. 其他手机有机会用鸿蒙,即将发布的荣耀50系列手机可以有机会用鸿蒙系统吗?...