Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

目录

CPU的乱序执行(指令重排序)

CPU在进行读等待(IO等待)的时候执行其他指令,本质是为了提高效率(想一下什么是并发),也就是指令重排序.
指令重排序在多线程情况下可能会带来问题,经典案例:

DCL双重检验锁的volatile

Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
DCL不加volatile时,可能Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

如果禁止指令重排序

CPU层面:
Intel:原语(mfence,sfence,mfence),或者锁总线
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
这些原语效率比较高,Intel有,其他CPU不一定有
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
lock指令:(效率比较低,一般CPU都有)
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

JVM层面

JVM是一个规范
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
volatile
实现细节:lock addl$0x0,(%esp)
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
volatile如果修饰对象的成员变量,会怎样,有加屏障吗?

啥时候不会指令重排序:
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
as if serial:不管让一个重排序,单线程执行结果不会改变,像按顺序执行一样

WCBuffers-write combining合并写技术(了解)

为了提高效率,CPU 在写入L1的同时,用WC(一般写满4个字节后)写入L2
可以写个程序测试
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

UMA&NUMA

UMA
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]
NUMA
每组CPU有各自专属的内存,也可以访问别人的,对自己的内存有更高优先级
NUMA-aware(ZGC):分配内存时优先分配该线程所在CPU最近的内存
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

计算机启动过程(了解)

BIOS:basic input output system
通电->BIOA/UEFI->自检->到硬盘固定位置加载boot loader->cmos->操作系统
剩下就是操作系统的时间了
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

OS基础

我们一般学习操作系统,都是学习Linux,因为windows和mac不开源.
推荐一本书<<Linux内核设计与实现>>

什么是操作系统?
operation system,是硬件资源和软件服务的桥梁,它本身也是一个软件.向下管理CPU,硬盘,内存等,向上提供进程线程,各种软件等服务给用户.
kernel内核,见名知意,操作系统的核心,主要和硬件打交道,管理各种硬件(CPU,内存,硬盘等),文件系统,进程调度

宏内核:上面说的内核的操作,都在一块地方
微内核:只管进程调度;其他的都可以在任何地方,可以有远程调用
这俩可以类比一下传统单体应用和微服务应用

外核:实验室的概念,对于某个特定应用,定制化实现一个内核

VMM:virtual machine monitor在硬件上模拟出多个操作系统,进行管理

鸿蒙系统(半成品)

核心概念:微内核
Javaman需要掌握的计算机底层知识(二)[指令重排序,UMA&NUMA(ZGC),OS基础概念]

内核态 用户态

最开始的操作系统,所有的操作,包括操作系统和各种用户应用软件等都在一块(内存?)空间,用户可以做出任何操作.但是这样很危险,存在误操作或者恶意操作等风险.
为了改善这种情况,人们就决定分层,从硬件上支持这种分层,CPU-CPL->分了四个等级ring0 1 2 3
Linux用到了ring0 内核态 和ring3 用户态,很多关键的操作(进程,线程等)都是在内核空间完成
Linux内核泡在ring 0;用户程序在ring 3,对于用户的关键操作,需要经过kernel同意,保证系统健壮性
(*和五环)

上一篇:Symbol 小妙处


下一篇:容器关闭时(docker stop)处理自定义操作