硬件和操作系统
文章目录
一、Cpu
cpu乱序执行
cpu在执行读写等待的同时执行命令,是cpu乱序的根源,不是乱,是为了提高效率
在这里插入代码片
乱序执行会产生问题
比如说为什么DCL单例要用volatile?
在这里插入代码片
对象的创建过程
对象先创建,半初始化,再初始化。指令重排让对象在半初始化的时候就被使用,这时为0
cpu层面如何禁止指令重排
内存屏障
对某部分内存做操作时前后添加的屏障,屏障前后的操作不可以乱序执行
intel:lfence mfence sfence原语
当然也可以用总线锁来解决
sfence:在sfence指令前的写操作必须在sfence指令后的写操作前完成
lfence:在lfence指令前的读操作必须在lfence指令后的读操作前完成
mfence:在mfence指令前的读写操作必须在mfence指令后的读写操作前完成
禁止乱序
cpu层面:intel使用原语lfence,sfence,mfence原语或者锁总线
JVM层面:8个hanppens-before原则 4个内存屏障 (LL LS SL SS)
原子指令:如x86上的lock指令是一个full barrier,执行时会锁柱内存子系统来确保执行顺序,甚至跨多个cpu。
software locks通常使用了内存屏障或原子指令来实现,变量可见性和保持程序顺序
volatile底层实现
lock adoil (esp寄存器)+0???
jvm/hotspot就用了一条lock指令来实行,intel可以用slm原语,其他cpu不一定有,而lock指令很多cpu都有。
JSR内存屏障
java程序(某些指令不可重排序)-> jvm(需要有些屏障) -> hotspot(写jvm实现) -> 原语或者lock指令
happens-before原则
jvm规定重排序必须遵守规则(8个规则),cpu规则和jvm规则不同,在cpu看来,只要前后没有依赖关系就可以乱序执行。jvm层面,8个happens-before原则和4个内存屏障(ll,ls,sl,ss)
as if serial
不管如何重排序,单线程执行结果不会改变,看上去像是serial
volatile如果修饰对象的话
new 出来一个对象,整个这个内存空间只要他有任何改变,前后都加屏障
问题
:假如有一个系统,系统内存好多请求过来,请求来的时候要求顺序执行
用Threadpool的signlthreadpool,这里面是个有限队列,长度有限制不会内存溢出,扔晚了使用拒绝策略
Wc合并写技术
为了提高效率,cpu在写入了l1时,同时用wc写入l2,由于alu速度太快,所以在写入l1的同时,写一个wc,满了之后,再重新到l2,4个字节长度
在这里插入代码片
二、操作系统
什么是操作系统
什么是操作系统
操作系统做什么
NUMA(非统一访问内存)
UMA:多块cpu共享内存,没有谁先谁后访问内存
NUMA:对于自己插槽的内存访问具有优先级
UMA缺点:不易扩展
cpu数量增加后引起内存访问冲突加剧,cpu的很多资源浪费在争抢内存地址上面,4颗左右比较合适
代码如下(示例):
NUMA-AWARE(就近访问原则)
能够感知到系统底层架构,cpu内分配了一个对象,会优先把这个对象分配在离自己近的内存上,ZGC能够做到NUMA-AWARE,分配内存会优先分配该线程所在cpu的最近内存。
系统启动过程
通电 -> bios uefi 工作 -> 自检 -> 到硬盘固定位置加载bootloader -> 读取可配置信息 -> CMOS-> linux回车->和linux相关的内核相关的程序才会被放到内存里_>然后cpu跳到操作系统启动的点上->其他剩下的所有权利全部交给操作系统控制 ox7c00
bootloader ->硬盘上写死的叫做启动规则控制器管理启动哪个操作系统,引导程序。
主板上有一块电池,一直在给cmos通电
OS基础
kernel
内核,内核负责管理应用,和硬件打交道
宏内核 微内核 外核
宏内核,都放在一块内存里
微内核:只有进程调度,核心在一块内存里,其他不在一块,部署起来特别灵活,万物物联(智能家居)
外核:为应用定制操作系统(多租户)
VMM针对硬件资源过剩
cpu分不同的指令级别
windows早期dos只能跑一个程序,负责自己工作(自己去跟内存等等等打交道)
后来有了分级别,分为应用程序访问级别和内核访问级别。应用程序访问级别未经许可干不了非法操作
intel cpu分0,1,2,3四个级别.0(内核态) 3(用户态)。有一些级别用户态访问不了的切换级别内核访问。
linux内核跑在ring 0,用户跑ring 3,对于系统的关键访问,需要经过kernel同意,保证系统健壮性。
内核执行的操作有两百多种,比如 sendfile read write pthread fork