硬件和操作系统的底层知识

硬件和操作系统



一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值