「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。
上下文切换
上下文切换会出现在那?
上下文切换这个情况会出现在一个CPU核心需要处理多个线程的时候出现。因为需要处理多个线程,所以CPU给不同的线程进行分配CPU时间片,并且快速切换处理线程来实现。
什么是CPU时间片?
时间片是CPU分配给不同线程的执行时间。时间片很短,一般是几十毫秒。所以我们感觉多个线程在同时进行。
什么是上下文切换?
既然CPU单个核心要负责多个线程的运行,即便会进行高速切换运行线程,但是在一个线程运行时其他线程就会暂停。具体为线程切换时会保存该任务状态,再次执行时,重新加载该任务状态。
上下文切换就是某个任务从保存到再加载个过程。
如图:
上下文切换会造成的问题?
上面也说了上下文切换会使得某个线程 保存-->暂停-->再加载。难免会使得效率降低,影响运行速度。
所以过于追求线程的数量来加快程序的运行速度是不可行的。
如何减少上下文切换?
- 无锁并发编程:多线程在执行时会存在竞态条件,在多个线程竞争同一资源的锁的时候,会存在上下文切换。所以我们可以避免使用过多的锁,或者使用其他方法来分配资源,避免多个线程竞争同一资源,达到无锁并发编程。
- CAS算法:JUC中存在原子类在atomic包中,使用CAS算法来进行更新数据,不需要加锁。
- 减少线程数:减少冗余线程的创建。
- 使用协议:在单线程里实现多任务的调度,并在单线程里维护多个任务间的切换。