计算机底层原理
1 计算机基础
[1][马士兵仅用30小时就把计算机底层原理、操作系统、数据结](https://www.bilibili.com/video/BV1va411y7Hy)
前言
适度打开计算机底层,因为它的知识量广而深,要抓住当前的主线!
目的
- 知道计算机如何运行的
- 过面试这一关
进大厂
最佳时间:3-5年
原因:1.心智成熟 2.熟手
跳槽时机和薪资
时长 | 薪资 |
---|---|
干1年 | 9k |
干2年 | 16k |
进大厂前薪资最好达到20k以上
忘掉学历的前提:1.技术 25k以上 2.团队leader
2 计算机组成
说明:
- PC(): 存储指令
- Register(寄存器): 指令中涉及到数据,就会加载到寄存器中
- ALU(算术逻辑单元): 获取寄存器中的数据,进行运算,并把结果存到内存中
总结CPU,一直取指令,做运算,写结果
缓存
出现原因:CPU太快了,内存太慢了,所以会出现了缓存这个东西
L1、L2、L3
查找过程:CPU会先在L1中查找,找不到,去L2中查找,找不到,去L3查找,找不到,再去内存中查找
区别:L3是多核CPU共享的缓存,L1和L2在每个核中都存在
问:为什么是三级缓存?而不是四级、五级?
工业测试的结果,三级最优
超线程
一个ALU对应两组线程对应的运算
实例:四核八线程,4个ALU拖8个线程
读取缓存
一块一块读取,每一个块叫做 cache line
在interCPU中,每一个 cache line
为64个字节
cache行一致性
interCPU利用MESI实现一致性
指令重排序
cpu乱序执行
阻止乱序执行的方式是加volatile,从JVM层面来看,原理是加内存屏障
问:DCL(double check lock)需要加volatile吗?
3 线程和锁
3.1 进程和线程
进程:是资源分配的基本单位
线程:是程序执行的基本单位
问:线程切换是什么概念?
执行T1,缓存T1,执行T2,恢复T1(恢复现场)
那这里会涉及到一个问题:线程越多越好吗?
不一定,因为线程切换需要时间
问:线程是如何调度的?
问:协程是什么?
问:用户级别线程和操作系统级别线程的区别?
在JVM中,一个用户线程对应一个操作系统线程,也就是1:1
在GO语言中,是M:N的数量关系,类似于JAVA的线程池,但有区别,JAVA线程池无法进行同步
- M表示GO创建出来的用户线程,通过队列去维护
- N表示提前创建出来的几个或者几十个系统线程
3.2 锁
名称 | 描述 | 关系 |
---|---|---|
偏向锁 | 注意,偏向锁不是锁 | 出现竞争后,升级为自旋锁 |
自旋锁 | 同一时刻,只允许一个人上马桶,其他人竞争 | 竞争激烈后,升级为队列锁 |
队列锁 | 同一时刻,只允许一个人上马桶,其他人排队,通过OS调度 |
保证数据一致性,锁是一个逻辑概念
同一时刻,只允许一个人上马桶
自旋锁,轻量级锁,适用于线程少,执行时间短
队列锁,重量级锁(需要OS调度),适用于线程多,执行时间长
问:synchronized原理?
问:自旋锁
ABA问题:可以通过版本号解决
CAS(compare and swap)修改值的原子性问题:当判断完相等,但这时被其他线程改动了,怎么办?
用lock指令,锁总线
lock cmpxchg 指令
偏向锁
首先,偏向锁不是锁,它只是一个占位用的
为什么会出现偏向锁呢?因为绝大数都是一个线程在跑,省去了线程竞争的过程。如果出现多个线程,那么就会进行 锁升级
锁升级步骤,偏向锁,如果出现两个以上线程轻度竞争,则升级为轻量级锁(自旋锁),如果重度竞争,则升级为重量级锁(队列锁)
问:一个对象占多少字节?美团
用 jol
这个库可以打印出对象信息
一个对象占16个字节
对象在内存空间中的布局
64位机器:表示指针长度为64位
架构师
思想:
- 这个地适合用什么语言就用什么语言
- 不要让自己局限在某个语言上
述求
我的述求是什么?
扎稳前端,逐步向后端扩展。
[1][MCA架构师课程大纲-马士兵教育](https://ke.qq.com/course/package/20773)
MCA(Microsoft Certified Architect),微软认证构架师的简称,是微软的顶级证书