文章目录
在单处理器的情况下,每个线程的执行时间是根据
时间片大小决定或者自身的其他原因,如果一个线程被迫或者主动暂停运行时,另外一个线程(可能是同一个进程中的线程或者其他进程中的)可以被操作系统(线程调度器)选中占用处理器开始或者继续运行。这种一个线程被暂停,即是被剥夺处理器使用的权利,另外一个线程被选中开始或者继续运行的过程就叫做上下文切换一个线程被剥夺处理器的使用权而被暂停运行就被称之为切出一个线程被操作系统(线程调用器)选中占用处理器开始或者继续运行就被称之为切入在线程的数量大于核心处理器的数量的时候,我们看到连续运行的线程,实际上是以断断续续的运行方式使其任务进展的。这种方式意味着在切入和切出的时候操作系统需要保存和恢复相应线程的进入信息,即是切入和切出的那一刻线程执行的任务进行到什么程度了(如计算结果以及执行到了哪条指令)。这个保存的进度信息叫做上下文在切出的时候,操作系统需要将上下文信息保存在内存中,以便稍后处理器继续运行该线程的时候能够在此信息的基础上继续运行 在切入的时候操作系统需要从内存中加载和恢复被选中的线程上下文信息,以在之前的基础上继续运行
自发性上下文切换是指线程由于自身因素导致的切出。一个线程在运行过程中执行下列方法可能会导致线程自发性的上下文切换
sleep()wait()yield(() : 这个方法可能导致join()LockSupport.park()IO操作(如读取文件) 或者等待其他线程的持有的锁也会导致自发性上下文切换由于线程调度器的原因被迫切出
上下文切换的花销是必须的,即使在多核的处理器系统中上下文切换也是必须的,因为我们需要执行的线程的数量总是大于处理器的数量。