多线程学习笔记(二)上下文切换

一、上下文切换的概念

       什么是上下文切换?

       时间片是CPU分配给各个线程的时间,一般几十毫秒,CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务,

但是,在切换前都会保存会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换

       单核处理器支持多线程吗?

       答案是支持的,也是通过CPU时间片分配机制,CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的。

二、上下文切换的带来的消耗

       上下文切换带来的消耗是什么?主要在上下文切换是需要保存上一个线程的状态,包括线程私有的程序计数器、寄存器等数据。

上下文切换通常是计算密集型的。也就是说,他需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,

上下文切换对系统来说意味着消耗大量的CPU时间。

三、如何减少上下文切换

  1)无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。

  2)CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要枷锁。

  3)使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。我们在使用线程池创建线程时要注意 这点。

  4)协程。在单线程里实现多任务的调度,并在单线程里维持多个任务见的切换。见GO语言。

  5)超线程。一个ALU(算术逻辑单元)对应多个PC(程序计数器)和寄存器。两个PC、寄存器可以保存两个线程的状态,减少了上下文切换。

posted @ 2020-12-27 19:02  迷思t无  阅读(344)  评论(0)    收藏  举报