概念

  • CPU寄存器,是CPU内置的容量小、但速度极快的内存。程序计数器,则是用来存储CPU正在执行的指令的位置,或者即将执行的下一条指令的位置。他们都是CPU在运行任何任务前,必须依赖的环境,因此也被叫做CPU上下文。
  • 当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换到这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

线程上下文切换的原因

  • 当前执行任务的时间片用完,cpu调度下一个任务执行
  • 当前执行任务碰到IO阻塞,调度器将此任务挂起
  • 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务
  • 用户代码挂起当前任务,让出CPU时间
  • 硬件中断

如何减少上下文切换

  • 无锁并发编程,多线程竞争锁时,会引起上下文切换。
  • cas算法。java的Atomic包使用cas算法更新数据,而不需要加锁。
  • 使用最少线程。避免创建不需要的线程,这样会造成大量线程都在等待状态。
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务的切换。

补充

  • 时间片分配算法:基于时间片轮转调度算法。原理:在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。当时间片结束或进程执行结束,系统再次将CPU分配给队首进程。
  • 协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。