持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
一、计算机的组成
二、程序的执行
- 一个程序,读入内存,全是0和1构成
- 从内存读入到cpu计算,要通过总线,总线分为三种:控制线、地址线、数据线
- 怎样区分一段0和1是数据还是指令?根据从哪种类型总线读取的区分,从控制线读取的就是指令,数据线读取的就是数据,地址线读取的就是地址
三、线程切换
-
一个程序设置多少线程合适?(线程池设置多少核心线程?)
-
单核cpu进行多线程有没有意义?
1)我们使用一个例子来说明问题,在单核CPU的情况下,存在4个需要执行任务,有如下两种情况运行方式:
- 使用多线程执行这些任务,会发生线程上下文切换。
- 一个一个任务按顺序执行完成。
2)上述两种情况,到底那个执行效率会快呢? 分析:第一种情况明显发生很多次线程的上下文切换,我们知道线程的上下文切换是很消耗性能的,而第二种情况发生的则是一个任务完成再执行下一个任务,基本没线程切换,那么讲道理,难道是第二种情况下更加快了,那么就抛出个问题在单核CPU下,有必要存在多线程吗?
3)我们需要清楚的认识到:多线程会提高效率到底指的是什么?实际上,多线程会提高效率是跟I/O操作相关的。I/O操作又有磁盘IO,网络IO。
4)以磁盘IO来说,实际上当CPU需要磁盘中某些文件的时候,并不是直接CPU向磁盘IO要数据,而是交给DMA来完成磁盘io的数据读取,执行如下操作:
- 从上图我们就可以发现CPU在将指令告诉DMA的时候就处于空闲状态了。
- 如果磁盘IO读取的数据较大,则会长时间停留在第三步中。
- 那么CPU空闲下来的时间,为啥我们不好好利用起来呢?
- 因此就出现了多线程,当一个任务被执行到第三步 磁盘将内容加载到内存中的时候且执行时间巨长,CPU则空闲的,那么我们就切换线程,让它执行其他的任务,整体就提高的任务完成的效率。
- 这也是经常听到这句话的原因:IO操作不需要占用CPU。
5)另一个小原因:为了防止一个任务一直占据CPU。当任务1时间特别长,则一直使用CPU的话,那么其他任务就会被无法执行,为了防止这现象出现,任务之间的切换很有必要。
四、超线程
五、多级缓存
六、缓存行
七、CPU控制并发
- 关中断
- 缓存一致性协议(Intel MESI)
- 系统屏障(编译级别屏障和指令级别屏障)
1)cpu乱序执行
2)JVM规定重排序必须遵守的规则:happens-before原则
3)JVM内存屏障
4)volatile关键字
volatile底层调用