【查漏补缺】01 java程序员必备底层基础知识篇

计算机的组成

计算机的组成

汇编语言

  • 本质
    机器语言的助记符,其实它就是机器语言

  • 执行过程
    计算机通电->CPU读取内存中程序(电信号输入)->时钟发生器不断震荡通断电->推动CPU内部一步一步执行(执行多少步取决于指令需要的时钟周期)->计算完成->写回(电信号)->写给显卡输出(sout,或者图形)

CPU

CPU 是什么

中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心和控制核心,它的功能主要是解释计算机指令,以及处理计算机软件中的数据

CPU 基本组成

  • PC
    Program Counter 程序计数器 ,记录当前指令地址,执行完后当前指令位数为几则加几执行下一条命令
  • Registers
    暂时存储CPU计算需要用到的数据
  • ALU
    Arithmetic & Logic Unit 运算单元
  • CU
    Control Unit 控制单元
  • MMU
    Memory Management Unit 内存管理单元
  • cache
    缓存,CPU三级缓存,单核CPU独有一级、二级缓存,单颗CPU共享第三级缓存

超线程

一个ALU对应多个PC | Registers

缓存

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

  • 缓存一致性
    MESI Cache 一致性协议,有些无法被缓存得数据或者跨越多个缓存行得数据,依然必须使用总线锁

  • 缓存行对齐
    对于有些特别敏感的数字,回存在线程高竞争的访问,为了保证不发生伪共享,可以使用缓存行对齐。
    使得数据不在同一缓存行中
    JDK7中,很多采用long padding 提高效率
    JDK8中,加入了@Contended 注解

乱序执行

  • 优点
    提高效率,原因:CPU 的指令重排
  • 禁止乱序
    (1) CPU层面
    内存屏障,对某部分内存做操作时中间添加屏障,屏障前后的操作不可乱序执行
    (2) JVM 层级
    8个 hanppens-before 原则,4个内存屏障(LL LS SL SS)
  • as if serial
    不管如何重排序,单线程执行结果不变

合并写

Write Combining Buffer,一般四个字节,由于 ALU 速度太快,所以在写入 L1 的同时,写入一个 WC Buffer,满了之后,直接更新到L2
Write Combining Buffer

NUMA

  • UMA – Uniform Memory Access
    多个CPU 共享一块内存
  • NUMA – Non Uniform Memory Access
    分配内存会优先分配该线程所在CPU的最近内存

操作系统(基于linux)

管理硬件、管理应用

内核

在这里插入图片描述

  • 宏内核

宏内核

  • 微内核
    分散、弹性部署,占用较小
    微内核

外核

为应用定制操作系统

CPU 指令级别

ring[0,1,2,3],内核态ring0,用户态ring3,对于系统的关键访问需要经过kernel的同意,保证系统健壮性

进程管理

  • 进程
    系统分配资源(独立的地址空间、内核数据结构、全局变量等)的基本单元

  • 线程
    普通的进程,和其他进程共享资源,一个进程中的不同执行路线

  • 纤程(Fiber)
    用户态的线程,线程中的线程,切换和调度都不需要经过OS
    (1) 优点
    1.占有资源很少 OS启动一个线程 1M ,启动一个纤程 4K
    2.切换比较简单
    3.可以启动很多个
    (2) 应用场景
    很短的计算任务,不需要和内核打交道,并发量高

  • 内核线程
    内核启动之后经常需要做一些后台操作,这些由内核线程来完成,只在内核空间运行

  • 进程的创建启动
    从进程A中fock进程B的话,A为B的父进程,系统函数fork()->创建,exec()->启动

  • 僵尸进程 – defunct
    父进程产生子进程后,会维护子进程的一个PCB(存放进程的管理和控制信息的数据结构)结构,子进程退出,有父进程释放,如果父进程没有释放则子进程成为僵尸进程

  • 孤儿进程
    子进程结束之前,父进程已经退出,孤儿进程会成为一个特殊进程(一般为1号进程)的孩子,由此特殊进程维护

  • 进程和线程有什么区别
    答案:进程就是一个程序运行起来的状态,线程是一个进程中的不同的执行路径。
    专业:进程是os分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)

  • 线程和纤程区别
    纤程在用户态,jvm自己管理自己切换,多个纤程对应一个线程

  • 进程调度
    (1) 进程类型
    IO 密集型 – 大部分时间用于等待IO
    CPU 密集型 – 大部分用于计算
    (2)进程优先级
    实时进程 > 普通进程
    (3) 多任务
    非抢占式 – 除非进程主动让出CPU,否则将一直运行
    抢占式 – 由进程调度器强制开始或暂停(抢占)某一进程的执行

  • 调度策略
    默认策略 :
    实时进程 -> 优先级按高低区分用 FIFO (First In First Out),优先级一样用 RR (Round Robin)
    普通进程 -> CFS (Completely Fair Scheduler, 完全公平调度算法),按优先级分配时间片的比例,记录每个进程的执行时间,如果有一个进程执行时间不到它分配的比例,优先执行。
    其中等级最高的是FIFO,这种进程除非自己让出CPU或更高等级的FIFO和RR抢占它否则会一直执行,RR只是线程中同级别FIFO中的平均分配。只有实时进程主动让出,或者执行完毕后,普通进程才有机会执行

中断(信号)

  • 硬中断
    硬件跟操作系统内核打交道的一种机制
  • 软中断
    系统中断(80中断),int 0x80 或者 sysenter 原语

内存管理

  • 发展历程
    DOS 时代
    同一时间只能有一个进程在运行(也有一些特殊算法可以支持多进程)
    Windows
    多个进程装入内存照成 :1、内存不够用 2、互相打扰
    解决:诞生了现在的内存管理系统:分页装入(解决内存不够用问题) 虚拟地址(解决互相打扰问题) 软硬件结合寻址

  • 分页(解决内存不够用)
    内存中分成固定大小的页框(最小4K),把程序(硬盘上)分成4K大小的块,用到哪一块加载哪一块加载过程中内存满了,会把最不常用的一块放到SWAP分区,把最新的一块加载进来,LRU 算法
    补充
    SWAP 分区
    在这里插入图片描述
    LRU 算法
    最近最少使用,是一种常见的页面置换算法,选择最近最久未使用的页面进行淘汰哈希表(保证查找操作O(1))+ 双向链表 (保证排序操作和新增操作)
    在这里插入图片描述

  • 虚拟内存(解决互相打扰问题)
    每一个进程拥有虚拟空间,让进程工作在虚拟空间,程序中用到的空间地址不再是直接的物理地址,而是虚拟的地址,保证A进程永远不可能访问到B进程的空间
    (1) 虚拟空间大小
    寻址空间 - 64位系统 2^64 byte,比物理空间大很多
    (2) 使用优点
    1、隔离应用程序
    2、每个程序都认为自己有连续可用的内存
    3、突破物理内存限制
    4、应用程序不需要考虑物理内存是否够用,是否能够分配等底层问题安全
    5、保护物理内存,不被恶意程序访问

  • 虚拟地址映射物理地址
    逻辑地址 = 段的基地址
    线性地址 = 偏移量 + 段的基地址
    物理地址 = 线性地址通过 OS + MMU
    虚拟地址映射物理地址

  • 缺页中断
    需要用到的页面内存中没有,产生缺页异常(中断),由内核处理并加载

总线

区分数据是指令还是一个数,包括:数据总线 地址总线 控制总线,地址总线目前48位

内核同步

基本概念

1、临界区(critical area) – 访问货操作共享数据的代码段(synchronized 大括号部分)
2、竞争条件(race conditions) – 两个线程同时拥有临界区的执行权
3、数据不一致(data unconsistency) – 由竞争条件引起的数据破坏
4、同步(synchronization) – 避免竞争条件
5、锁 – 完成同步的手段
6、原子性 – 像原子一样不可分割的操作
7、有序性 – 紧张指令重排
8、可见性 – 一个线程内的修改,另一个线程可见

内核同步常用方法

1、原子操作 – 内核中类似于AtomicXXX
2、自旋锁 – 内核中通过汇编支持的CAS
3、读、写自旋 – 类似于ReadWriteLock,可同时读,只能一个写
4、读的时候共享锁,写的时候排它锁
5、信号量 – 类似于 Semaphore (down up 操作,占有和释放)
6、重量级锁,线程会进入wait,适合长时间持有的锁情况
7、读、写信号量 – 多个写,可以分段写,分段锁
8、互斥体 – 特殊的信号量(二值信号量)
9、完成变量 – 特殊的信号量,子进程结束时通过完成变量叫醒父进程,类似于Latch
10、大内核锁 – 早期,现在不用了
11、顺序锁 – 线程可以挂起的读写自旋锁
序列计数器(从0开始,写时 +1 ,写完释放 +1,读前发现是单数,说明有写线程,等待,读前后序列一样,说明没有写线程打断,对于写来说是独占)
12、禁止抢占 –
13、内存屏障 – volatile

思维导图地址

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值