目录
CPU的乱序执行(指令重排序)
CPU在进行读等待(IO等待)的时候执行其他指令,本质是为了提高效率(想一下什么是并发),也就是指令重排序.
指令重排序在多线程情况下可能会带来问题,经典案例:
DCL双重检验锁的volatile
DCL不加volatile时,可能
如果禁止指令重排序
CPU层面:
Intel:原语(mfence,sfence,mfence),或者锁总线
这些原语效率比较高,Intel有,其他CPU不一定有
lock指令:(效率比较低,一般CPU都有)
JVM层面
JVM是一个规范
volatile
实现细节:lock addl$0x0,(%esp)
volatile如果修饰对象的成员变量,会怎样,有加屏障吗?
啥时候不会指令重排序:
as if serial:不管让一个重排序,单线程执行结果不会改变,像按顺序执行一样
WCBuffers-write combining合并写技术(了解)
为了提高效率,CPU 在写入L1的同时,用WC(一般写满4个字节后)写入L2
可以写个程序测试
UMA&NUMA
UMA
NUMA
每组CPU有各自专属的内存,也可以访问别人的,对自己的内存有更高优先级
NUMA-aware(ZGC):分配内存时优先分配该线程所在CPU最近的内存
计算机启动过程(了解)
BIOS:basic input output system
通电->BIOA/UEFI->自检->到硬盘固定位置加载boot loader->cmos->操作系统
剩下就是操作系统的时间了
OS基础
我们一般学习操作系统,都是学习Linux,因为windows和mac不开源.
推荐一本书<<Linux内核设计与实现>>
什么是操作系统?
operation system,是硬件资源和软件服务的桥梁,它本身也是一个软件.向下管理CPU,硬盘,内存等,向上提供进程线程,各种软件等服务给用户.
kernel内核,见名知意,操作系统的核心,主要和硬件打交道,管理各种硬件(CPU,内存,硬盘等),文件系统,进程调度
宏内核:上面说的内核的操作,都在一块地方
微内核:只管进程调度;其他的都可以在任何地方,可以有远程调用
这俩可以类比一下传统单体应用和微服务应用
外核:实验室的概念,对于某个特定应用,定制化实现一个内核
VMM:virtual machine monitor在硬件上模拟出多个操作系统,进行管理
鸿蒙系统(半成品)
核心概念:微内核
内核态 用户态
最开始的操作系统,所有的操作,包括操作系统和各种用户应用软件等都在一块(内存?)空间,用户可以做出任何操作.但是这样很危险,存在误操作或者恶意操作等风险.
为了改善这种情况,人们就决定分层,从硬件上支持这种分层,CPU-CPL->分了四个等级ring0 1 2 3
Linux用到了ring0 内核态 和ring3 用户态,很多关键的操作(进程,线程等)都是在内核空间完成
Linux内核泡在ring 0;用户程序在ring 3,对于用户的关键操作,需要经过kernel同意,保证系统健壮性
(*和五环)