上下文切换

205 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

上下文切换

上下文切换会出现在那?

上下文切换这个情况会出现在一个CPU核心需要处理多个线程的时候出现。因为需要处理多个线程,所以CPU给不同的线程进行分配CPU时间片,并且快速切换处理线程来实现。


什么是CPU时间片?

时间片是CPU分配给不同线程的执行时间。时间片很短,一般是几十毫秒。所以我们感觉多个线程在同时进行。


什么是上下文切换?

既然CPU单个核心要负责多个线程的运行,即便会进行高速切换运行线程,但是在一个线程运行时其他线程就会暂停。具体为线程切换时会保存该任务状态,再次执行时,重新加载该任务状态。

上下文切换就是某个任务从保存到再加载个过程。

如图:

截屏2022-02-12 下午10.53.11

上下文切换会造成的问题?

上面也说了上下文切换会使得某个线程 保存-->暂停-->再加载。难免会使得效率降低,影响运行速度

所以过于追求线程的数量来加快程序的运行速度是不可行的


如何减少上下文切换?

  1. 无锁并发编程:多线程在执行时会存在竞态条件,在多个线程竞争同一资源的锁的时候,会存在上下文切换。所以我们可以避免使用过多的锁,或者使用其他方法来分配资源,避免多个线程竞争同一资源,达到无锁并发编程。
  2. CAS算法:JUC中存在原子类在atomic包中,使用CAS算法来进行更新数据,不需要加锁。
  3. 减少线程数减少冗余线程的创建
  4. 使用协议:在单线程里实现多任务的调度,并在单线程里维护多个任务间的切换。