上下文切换
1.在单处理器时期,操作系统就能处理多线程并发任务,处理器给每个线程分配CPU时间片,线程在CPU时间片内执行任务
CPU时间片是CPU分配给每个线程执行的时间段,一般为几十毫秒
2.时间片决定了一个线程可以连续占用处理器运行的时长
当一个线程的时间片用完,或者因自身原因被迫暂停运行,此时另一个线程会被操作系统选中来占用处理器
上下文切换(Context Switch):一个线程被暂停剥夺使用权,另一个线程被选中开始或者继续运行的过程
切出:一个线程被剥夺处理器的使用权而被暂停运行
切入:一个线程被选中占用处理器开始运行或者继续运行
切出切入的过程中,操作系统需要保存和恢复相应的进度信息,这个进度信息就是上下文
3.上下文的内容
寄存器的存储内容:CPU寄存器负责存储已经、正在和将要执行的任务
程序计数器存储的指令内容:程序计数器负责存储CPU正在执行的指令位置、即将执行的下一条指令的位置
4.当CPU数量远远不止1个的情况下,操作系统将CPU轮流分配给线程任务,此时的上下文切换会变得更加频繁
并且存在跨CPU的上下文切换,更加昂贵
切换诱因
1.在操作系统中,上下文切换的类型可以分为进程间的上下文切换和线程间的上下文切换
2.线程状态:NEW、RUNNABLE、RUNNING、BLOCKED、DEAD
Java线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
3.线程上下文切换:RUNNING -> BLOCKED -> RUNNABLE -> 被调度器选中执行
一个线程从RUNNING状态转为BLOCKED状态,称为一个线程的暂停
线程暂停被切出后,操作系统会保存相应的上下文
以便该线程再次进入RUNNABLE状态时能够在之前执行进度的基础上继续执行
一个线程从BLOCKED状态进入RUNNABLE状态,称为一个线程的唤醒
此时线程将获取上次保存的上下文继续执行
4.诱因:程序本身触发的自发性上下文切换、系统或虚拟机触发的非自发性上下文切换
自发性上下文切换
sleep、wait、yield、join、park、synchronized、lock
非自发性上下文切换
线程被分配的时间片用完、JVM垃圾回收(STW、线程暂停)、线程执行优先级