多线程学习笔记(二)上下文切换
一、上下文切换的概念
什么是上下文切换?
时间片是CPU分配给各个线程的时间,一般几十毫秒,CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务,
但是,在切换前都会保存会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换
单核处理器支持多线程吗?
答案是支持的,也是通过CPU时间片分配机制,CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的。
二、上下文切换的带来的消耗
上下文切换带来的消耗是什么?主要在上下文切换是需要保存上一个线程的状态,包括线程私有的程序计数器、寄存器等数据。
上下文切换通常是计算密集型的。也就是说,他需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,
上下文切换对系统来说意味着消耗大量的CPU时间。
三、如何减少上下文切换
1)无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
2)CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要枷锁。
3)使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。我们在使用线程池创建线程时要注意 这点。
4)协程。在单线程里实现多任务的调度,并在单线程里维持多个任务见的切换。见GO语言。
5)超线程。一个ALU(算术逻辑单元)对应多个PC(程序计数器)和寄存器。两个PC、寄存器可以保存两个线程的状态,减少了上下文切换。

浙公网安备 33010602011771号