多线程的上下文切换是指在多线程环境下,操作系统或调度器将 CPU 执行权从一个线程切换到另一个线程的过程。上下文切换允许多个线程交替执行,使得看起来多个线程同时在运行,从而实现并发性。上下文切换的发生通常有以下几种情况:
-
时间片耗尽:操作系统为每个线程分配一定的时间片(或时间量),当一个线程的时间片用尽时,操作系统会暂停该线程的执行,并将 CPU 执行权切换到另一个就绪状态的线程,以便继续执行。这是最常见的上下文切换情况。
-
等待阻塞:当一个线程在等待某个事件发生(如 I/O 操作完成、锁释放等)时,它会被阻塞,此时操作系统会切换到另一个就绪状态的线程执行。一旦等待的事件发生,被阻塞的线程会重新变为就绪状态,等待调度器分配时间片。
-
主动让出 CPU:有些线程可能会主动让出 CPU 的执行权,通过调用像
yield()
方法或sleep()
方法等方式来实现。这会告诉操作系统可以将 CPU 执行权切换给其他线程。 -
线程优先级:操作系统可以基于线程的优先级来决定上下文切换。高优先级的线程可能更频繁地获得 CPU 执行权,低优先级的线程可能需要等待。
-
硬件中断:硬件中断(如时钟中断)也可能导致上下文切换,因为操作系统需要在中断处理程序中保存当前线程的上下文,并在中断处理完成后恢复线程的执行。
上下文切换是一种开销较大的操作,因为在切换时需要保存当前线程的状态(寄存器值、程序计数器等)并加载新线程的状态。因此,过多的上下文切换会降低系统性能。在多线程编程中,需要注意减少不必要的上下文切换,优化线程的调度和并发控制,以提高程序的效率。
总之:CPU通过时间⽚分配算法来循环执⾏任务,当前任务执⾏⼀个时间⽚后会切换到下⼀个任务。但是,在切换前会保存上⼀个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态。