计算机组成

cpu

PC
Program Counter,程序运行的时候,需要指令和数据,而一个复杂的程序有很多指令,那么每一步执行哪一条指令,就从内存里取出来放到PC了里,记住这个指令在内存里位置,从而知道下一个指令从内存的哪里取。
Registers
寄存器,一颗cpu里有很多寄存器,有的写,有的读,还有其他的作用,程序运行时的数据就放到寄存器里。
ALU
Arithmetic & Logic Unit,计算和逻辑单元,比如计算2+3,从PC里拿+指令,从register A里拿2,从register B里拿3,数据,运算后把结果再返回给register C,然后刷回内存。
cache
缓存,cpu里的io速度是内存里的100倍,如果每次都从内存里拿数据,会很慢,于是就有了缓存。结构如下:

cpu里的缓存分三级,各级的读取速度如下:

对于多核cpu,在各核里有各自的L1和L2缓存,在同一颗cpu里公用L3缓存,计算机读取IO是块读的,即每次读取一个缓存行(cache line)每次都是64K,那么假如2核cpu,同时需要读取了同一个缓存行,而核1改了该缓存行里的某些值,为了保证数据一致性,要通知核2这个缓存行里的值被改了,通过缓存一致性协议(MSI MESI(intel的) MOSI Synapse Firefly Dragon等)
为了避开缓存一致性协议,有一种变成叫做“缓存行对齐”编程,比如jdk7里有很多变量用7个long(8字节)填充,再声明变量,再用7个long填充,保证该变量在一个缓存行里,读取就快了。而jdk8有@Contended注解,在声明变量的时候,加上这个注解,jvm就保证这个变量单独放到一个缓存行里。jvm要加 -XX:-RestrictContended注解才起作用。
超线程CPU
我们的一个ALU一次只能执行一个线程,如果是单线程,cpu在运算时需要把数据和指令拿到Registers和PC里进行运算,那么其他的线程再运算时就需要清除数据和指令,把需要计算的拿进来计算,完成后再把原来的没计算完成的数据和指令再拿进来计算。就比较慢。比如四核八线程,就是一个ALU对应两组PC和registers,一次性把两个线程里的数据和指令拿到不同组的registers和PC里,cpu在计算的时候,ALU只需要在不同的组直接切换就能完成计算,就快得多。
电脑开机过程
电脑开机过程

NUMA
Non Uniform Memory Access的简称,对应的是UMA(Uniform Memory Access)。
UMA,一般的PC是CPU、内存插在主板上固定的地方,所有内核都去这个地方访问内存。
NUMA,有的服务器的架构,在硬件上分成某租CPU有物理上离他最近的内存,物理离得近就访问快,内核优先访问这部分内存,找不到对应的资源了再去其他的内存里访问。
乱序执行
cpu执行不同的指令的时间片消耗不同,为了提高执行效率,cpu会在某种规则上不按照代码的顺序执行。如果要顺序执行,cpu层面,intel有原语(Mfence->Mixd Fence->混合栅,IFence->Input Fence->读栅,SFence->Save Fence->写栅来锁定某块资源(比如内存)来保证不同指令对这块资源的顺序执行),很遗憾,jvm因为是跨硬件平台的,所以只能用跨平台的lock指令来实现,比如java的volatile关键字,是用四个内存屏障(LoadLoad,LoadStorage,StorageLoad,StorageStorage)来实现的。比如一个读和一个写的指令存在并发,jvm在这个内存前后加上两个内存屏障,保证如果写的执行在前,就一定保证写的指令执行完了后续的读写指令才能访问这块内存,从而保证内存可见性,也防止了乱序执行。
微内核
传统的PC即,内核程序需要管理硬件、内存、进程调度等,微内核就把传统的内核的这些工作分开,只关注与程序调度,效率高,可插拔,模块化,华为的HM就是这么干的。
用户态与内核态
在最原始的DOS系统的时候,内核和用户程序都可以访问计算机的资源,比如硬件的第一扇区(Master Boot Record,放内核程序的地方),用户程序可以改这个地方,电脑就被黑了,黑客盛行。现在的linux内核分为内核态和用户态,内核态管理硬件等,用户程序想要操作硬件,必须通过内核程序取访问,而有些敏感的资源用户程序是无法访问的,保证系统安全。
进程线程纤程
以a.exe程序执行为例,a这个程序是放在磁盘里的,双击后就load到内存里,操作系统分配了一个这个程序的资源空间,即开启了一个进程。再双击一次a,在a这个程序不要求一个操作系统只有一个程序的前提下,又分配给给a另外的资源,有开启一个进程。这两个进程有独立的内存空间。
a程序代码里不只一个线程,在cpu运算过程中,在这些线程之间切换,即线程调度,a程序里的多个线程共享a这个进程的内存空间。
多线程高并发的程序运行过程中,需要频繁的切换用户态和内核态,硬件上,单线程的cpu需要频繁的清除寄存器(Regiesters)和程序计数器(Process Counter),多线程的cpu需要在这些Registers和PC之间切换,大部分的时间小号在切换用户态和内核态。所以有了只在用户态运行的线程,即纤程,当然,不能切换成内核态,所以纤程适用于计算时间短但是cpu占用很高的运算。
开辟一个线程大概占1M内存,开辟一个纤程序占4K内存,开10万个线程电脑可能卡死,开10万个纤程电脑运行正常。
目前内置纤程序的语言:Kotlin、Scala、Go、引用了特定库的Python,jdk在实验阶段的有(openJdk+loom)。
中断
进程有实时进程和普通进程,实时进程(优先级1~99)的优先级永远比普通进程高(-20~19),进程调度的时候优先执行实时进程。
默认进程调度算法。CMS(Completely Fair Scheduler,按优先级分配cpu时间,记录每个进程的执行时间,如果一个进程的执行时间不到他应该分配的时间,在下一次调度时优先执行)绝对公平算法和RR(Round Robin,每个进程执行时间一样,轮换这执行)轮循算法,优先级有差异的用CMS,同样优先级的RR。
中断分为硬中断(来自硬件,比如键盘和网络)和软中断(来自程序内部,比如程序里调用read()指令),优先级高于除了内核不允许的某些实时进程之外的所有进程。是一个信号,在内核里就是int 0x80,所有的内核接口最多五个参数,通过ax寄存器传入中断调用好(比如一个read中断),bx、cx、dx、si、di传入参数,计算万了再把结果写回ax寄存器,一层一层返回给程序。
僵尸进程和孤儿进程
linux的进程标记是PCB,假如父进程fork了多个子进程,子进程的PCB由父进程管理,如果子进程退出了,系统回收了子进程的资源,但是父进程还运行,意味着子进程的PCB还在,ps命令能开到这些进程还在(被打了defunct的进程),这些子进程就叫做僵尸进程。不可以kill掉,但是可以kill掉父进程。假如父进程死了,子进程还在,那么父进程会把子进程的PCB交给他的父进程(所有进程的父进程id号是1,带图形界面的进程的父进程是14多少,但是这个14多少的父进程还是1),那么这些子进程就是孤儿进程。可以kill掉孤儿进程,
反正进程执行完了会被回收分配的资源,不影响性能,kill不kill的无所谓。

java需要知道的计算机底层相关推荐

  1. 简单计算机java程序_JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单...

    JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单 JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单制作 汇编实现引导程序 ; 文件名 boot.asm org 7c ...

  2. Java(计算机底层——二进制到汇编)(先导课)

    Java(计算机底层--二进制到汇编)(先导课) 参考视频:最通俗易懂的计算机底层教学,二进制到汇编学习!(狂神) 1. 概述 语言 进制 进制如何运算 二进制 数据宽度 有符号数和无符号数 原码反码 ...

  3. 一网打尽:Java 程序员必须了解的计算机底层知识!

    公众号后台回复"面试",获取精品学习资料 扫描下方海报了解专栏详情 本文来自公众号读者cxuan的投稿 我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以 ...

  4. [转]从根上理解高性能、高并发:深入计算机底层,理解线程与线程池

    系列 <从根上理解高性能.高并发(一):深入计算机底层,理解线程与线程池> <从根上理解高性能.高并发(二):深入操作系统,理解I/O与零拷贝技术> <从根上理解高性能. ...

  5. 15 计算机底层——二进制到汇编学习

    计算机底层--二进制到汇编学习 1.概述 语言 机制 进制如何计算 二进制 数据宽度 有符号和无符号数 原码和反码 位运算 位运算计算 汇编 寄存器 内存 汇编指令 内存复制 堆栈的指令 汇编如何写函 ...

  6. 从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池

    本文原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.有少许改动. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关 ...

  7. 计算机底层知识之二进制

    ❝ 巴西作家保罗·科埃略的一句话:「如果你想成功,你必须遵守一条规则:永远不要对自己撒谎.」 ❞ 大家好,我是「柒八九」. 今天,我们继续「计算机底层知识」的探索.我们来谈谈关于「二进制」的相关知识点 ...

  8. 计算机底层原理——汇编语言

    文章目录 前言 1.机器语言 2.进制思想本质 3.二进制 4.数据宽度 5.有符号数和无符号数 6.原码反码补码 7.位运算 8.位运算的加减乘除 9.汇编语言环境说明 10.寄存器的理解 11.内 ...

  9. 生猛!这篇万字长文,一下子把计算机底层知识说明白了!

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

最新文章

  1. msbuild 语法_用于删除文件的MSBuild Task语法
  2. 百度地图 app 点击事件无效、不触发 解决方案
  3. String Typing CodeForces - 954B
  4. Java Socket网络编程常见异常(转)
  5. Notification通知栏
  6. 增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志
  7. MATLAB读写Excel数据
  8. Linux IO复用区别与epoll详解
  9. db2 导出换行_数据库 db2 换行符
  10. html css字幕滚动代码,纯CSS实现滚动3D字幕
  11. Winpcap笔记4之不用回调函数捕获数据包
  12. 微信小程序点击激活类
  13. android传感器type_orientation,android – 已弃用的Sensor.TYPE_ORIENTATION的等效替换
  14. 指尖轻舞桌面:Slide On Desk - 主题风格制作指南
  15. ESN学习笔记——echotorch(1)介绍
  16. 转载:Ceph论文译文
  17. 成都启之航电商:抖音小店使用效果+性价比产品+直播
  18. 51单片机密码锁(含确认键、清零键、删除键)
  19. CSS样式怎样修改滚动条的样式
  20. Microbiome杂志和主编介绍

热门文章

  1. sql server 链接服务器 改访问接口_跨服务器链接数据库?其实很简单!(上)
  2. table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
  3. binaryreader java,C# 二进制文件的读写 | 菜鸟教程
  4. 程序员的弓箭知识涉猎
  5. 爬数据html解析,jsoup网络爬取数据HTML解析
  6. 放在每个定义前的html语言,html基础
  7. opencv三维重建_使用iPhone相机和OpenCV来完成3D重建(第一部分)
  8. 手机耗电统计app_教你 6 招,解决 iOS13 耗电问题
  9. 期末考试前的预习,科目:化工设备与反应器(5)
  10. 机器学习之决策树(下)