概念
- CPU寄存器,是CPU内置的容量小、但速度极快的内存。程序计数器,则是用来存储CPU正在执行的指令的位置,或者即将执行的下一条指令的位置。他们都是CPU在运行任何任务前,必须依赖的环境,因此也被叫做CPU上下文。
- 当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换到这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
线程上下文切换的原因
- 当前执行任务的时间片用完,cpu调度下一个任务执行
- 当前执行任务碰到IO阻塞,调度器将此任务挂起
- 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务
- 用户代码挂起当前任务,让出CPU时间
- 硬件中断
如何减少上下文切换
- 无锁并发编程,多线程竞争锁时,会引起上下文切换。
- cas算法。java的Atomic包使用cas算法更新数据,而不需要加锁。
- 使用最少线程。避免创建不需要的线程,这样会造成大量线程都在等待状态。
- 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务的切换。
补充
- 时间片分配算法:基于时间片轮转调度算法。原理:在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。当时间片结束或进程执行结束,系统再次将CPU分配给队首进程。
- 协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。