资讯详情

资讯详情

JAVA EE:1.计算机是如何工作的

【前言】本章并不详细介绍关于计算机底层的东西由于Java开发岗并不和硬件等底层的东西打交道所以这里仅讲解部分Java中能用到的知识点至于更深的东西有兴趣者可自行学习1.硬件物理连接全景图此图中CPU边界以上是为CPU的核CPU中有多个核这些核结构相同与外部的连接也相同。此处仅列举出一个核做演示。2.CPU执行你Java字节码的“大脑”CPU是电脑里真正干活的部件。它内部有核心干活的人、寄存器手边的小抽屉、缓存桌上的资料夹。2.1 CPU内部结构组件作用对Java开发的意义运算器 (ALU)执行加减乘除、位运算i、a b最终在这里执行控制器 (CU)取指令、译码、控制执行流程决定程序执行顺序分支预测失败会拖慢速度寄存器CPU内部最快存储容量极小变量最终被加载到这里参与运算JIT会尽量把热变量放寄存器L1缓存每核私有32-64KB存放最近执行的指令和数据L2缓存每核私有256KB-1MBL1未命中时查L2L3缓存多核共享8-32MB多线程共享数据伪共享发生在这里内存控制器管理内存读写决定内存带宽和延迟PCIe控制器连接网卡、硬盘决定外设吞吐2.2 核心、线程与超线程物理核心是真正独立干活的单元。超线程是让一个物理核心“假装”成两个让两个线程交替使用核心的运算资源提升利用率但不会翻倍。线程线程就是一段代码的执行流可以理解为“拿着指令的工人”最终每个线程会被分配给逻辑处理器。成千上万的线程就是操作系统分配给这些个逻辑处理器的。物理核心独立运算单元。超线程一个物理核模拟两个逻辑处理器这样的核我们称之为“大核”“小核”就是一个内核对应一个逻辑处理器不同cpu厂商对于大小核的制造不同共享ALU和L1/L2但有独立寄存器组。2.3 CPU缓存行 (Cache Line)CPU读内存不是一个个字节读而是一口气读64字节一个缓存行。这就带来一个坑两个线程改同一行里的不同变量会互相干扰叫“伪共享”。缓存行CPU缓存读写的最小单位通常64字节。伪共享 (False Sharing)两个线程分别修改同一缓存行里的不同变量导致缓存行在两个核心间来回失效同步性能骤降2.4 上下文切换操作系统从一个线程切到另一个线程要保存当前寄存器状态、加载新线程状态这个搬运过程就是上下文切换它不干业务活纯开销。一次切换约几微秒几千到上万CPU周期。每秒几万次切换CPU大量时间花在切换上。3.CPU寄存器组详解 and 指令加载实例寄存器是CPU手边的小抽屉分好几组各管一摊。下面用一条加法指令让你看到数据怎么从内存“爬”到寄存器里算完再爬回去。3.1 寄存器分组了解即可不需要记忆组别名称作用Java对应通用寄存器RAX, RBX, RCX, RDX累加、基址、计数、数据局部变量、返回值、中间结果指针寄存器RSP, RBP栈指针、基址指针指向当前线程栈帧变址寄存器RSI, RDI源/目的变址字符串操作、数组遍历索引指令指针RIP指向下一条指令地址最关键决定程序执行到哪标志寄存器RFLAGS记录运算状态零、溢出、进位if判断依赖它3.2 实例int c a b 的硬件执行过程这里不进行具体的寄存器的介绍这不是我们需要过度关注的。我们采取更为通俗一点的方法介绍让大家有所体会。4.内存DRAMJava对象的家这里说的内存和硬盘的速度主要指的是IO的速度也就是input输入 /output输出 的速度4.1 内存是什么1. 它是 CPU 的“工作台”CPU 算得极快1 秒能算几十亿次但硬盘太慢了。CPU 不可能直接去硬盘里翻数据。所以程序要运行必须先把数据从硬盘搬到“内存”里CPU 直接跟内存打交道。2. 它是你 Java 对象的“家”你在代码里 new 出来的每一个对象以及方法里的局部变量等等运行时都实实在在住在这块物理内存条上。3. 它的致命弱点断电就死它靠电来维持数据电容、所以叫“动态”只要一停电或者重启里面的东西瞬间灰飞烟灭4.2 内存和硬盘的区别1. 容量和价格硬盘SSD/机械硬盘通常是几百 G 到几 T便宜且量大内存通常是 8G、16G、32G服务器可能 128G贵且量小。2. 速度天壤之别如果内存读一次数据需要 100 纳秒硬盘读一次可能需要 10 毫秒甚至几十毫秒。硬盘比内存慢了大概十万倍。5.磁盘SSD/HDD持久化与I/O瓶颈磁盘是数据最终落地的仓库也是后端性能的重灾区。核心要记住顺序I/O远快于随机I/O。HDD vs SSD了解即可特性HDD机械硬盘SSD固态硬盘原理磁头旋转盘片NAND闪存电子读写随机I/O极慢毫秒级寻道快微秒级顺序I/O100-200MB/s500MB/s-数GB/s对Java的意义数据库/日志绝不放HDD数据库/日志/类文件都放SSD机械硬盘固态硬盘6.网卡NIC网卡是请求的入口和出口。一个网络包到达你的Java代码要经历“网卡收信号→DMA写内存→中断CPU→内核协议栈解包→唤醒Java线程→拷贝到用户空间”这一长串。高性能的秘密就藏在减少搬运和减少中断里。7.总线连接一切的“高速公路”总线就是主板上的数据公路。CPU到内存有内存总线CPU到网卡/SSD有PCIe总线多路CPU之间有QPI/UPI。路宽带宽和路况延迟决定整体性能上限。总线连接特点内存总线CPU↔DRAM极快几十GB/sPCIe总线CPU↔网卡/SSD/GPU串行点对点PCIe 4.0 x16约32GB/sQPI/UPICPU↔CPU多路处理器互联NUMA基础DMICPU↔芯片组南桥连USB、SATA等低速外设8.完整链路回顾int c a b 在硬件上发生了什么1. RIP指向指令地址 → 从“L1指令缓存”取指令。2. 译码 → 需读变量a、b。3. a、b从“DRAM”可能已缓存在L3/L2/L1加载到“RAX等寄存器”。4. “ALU”执行加法结果写回寄存器。5. 结果写回内存栈。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →