目录
《组成原理》——硬件
计算机五大核心组件:
- 控制器(Control)
- 运算器(Datapath)
- 存储器(Memory)
- 输入(Input System)
- 输出(Output System)
与JMM相关的硬件结构
如今采用多CPU,以及多核CPU
在多CPU时,多个进行需要进行上下文切换,代价高
多核CPU通信在内部总线,公用一个缓存
- CPU寄存器:CPU寄存器是CPU内内存的基础。CPU在寄存器上的执行速度远大于在主存上的速度。
- CPU缓存Cache:位于CPU与主存之间的一种中间的容量较小速度很高的存储器
- 内存:计算机中公用的内存。
缓存行加锁
缓存行(cache line) 是CPU缓存中可分配、操作的最小存储单元。与CPU架构有关,通常有32字节、64字节、128字节不等。目前64位架构下,64字节最为常用。
缓存锁不需锁定总线,只需要“锁定”被缓存的共享对象(实际为:缓存行)即可,接受到lock指令,通过缓存一致性协议,维护本处理器内部缓存和其他处理器缓存的一致性。相比总线锁,会提高cpu利用率。
缓存一致性问题
当多个处理器的运算任务都涉及同一 块主内存区域时,将可能导致各自的缓存数据不一致的情况,如果真的发生这种情况,那同步 回到主内存时以谁的缓存数据为准呢?
缓存一致性协议: MESI
指令重排与指令流水
为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执 行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该 结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的 顺序一致。因此,如果存在一个计算任务依赖另一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。与处理器的乱序执行优化似,Java虚拟机的即时编译器中也有 类似的指令重排序(Instruction Reorder)优化。
但是指令重排是怎样提高执行的效率的呢?
a=b+c;
d=e-f;
指令重排序前
指令重排序后
《操作系统》——线程基础
什么是线程
现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度CPU的最小单元是线程,也叫轻量级进程 (Light Weight Process),在一个进程里可以创建多个线程,每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。 处理器在这些线程上高速切换, 让使用者感觉到这些线程在同时执行。
线程分类
用户级线程(User-Level Thread)
指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应 用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
不需要用户态/核心态切换, 速度快。
内核线线程(Kernel-Level Thread)
线程的所有管理操作都是由操作系统内核完成的。
内核保存线程的状态和上下 文信息,当一个线程执行了引起阻塞的系统调用时,内核可以调度该进程的其他线程执行。
Java线程与系统内核的关系
Java线程的生命状态
- NEW:刚刚创建的线程,还未执行。
- RUNNABLE:当前执行的线程处在这一状态。
- BLOCKED:如果线程在执行过程中遇到synchronized同步块,就会进入这一状态,这是线程会暂停执行,知道获取请求的锁。
- WAITING:无限时间等待。
- TIMED_WAITING:有限时间等待。
- TERMINATED:线程执行完毕后进入这一状态,表示结束。