上下文切换

356 阅读2分钟

上下文切换(Context Switch):一个线程被暂停剥夺使用权,另一个线程被选中开始或者继续运行的过程.

上下文是指某一时间点 CPU 寄存器和程序计数器的内容。

引起线程上下文切换的原因

  1. 当前执行任务的时间片用完之后,系统 CPU 正常调度下一个任务;
  2. 当前执行任务碰到 IO 阻塞,调度器将此任务挂起,继续下一任务;
  3. 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务;
  4. 用户代码挂起当前任务,让出 CPU 时间;
  5. 硬件中断;

举例说明死锁发生的场景

  • 系统资源的竞争。只有资源不足时才会出现死锁可能,另外,可剥夺资源的竞争是不会引发死锁的;
  • 进程推进顺序不对。多进程在运行时,请求和释放资源的顺序不当。
  • 系统资源分配不当。
  • 线程之间交错执行
    解决:以固定的顺序加锁
  • 执行某方法时就需要持有锁,且不释放
    解决:缩减同步代码块范围,最好仅操作共享变量时才加锁
  • 永久等待
    解决:使用tryLock()定时锁,超过时限则返回错误信息 因此我们要减少上下文切换,以下概述了什么场景下设置线程池的大小
  1. 高并发,低耗时的情况:建议少线程,只要满足并发即可;例如并发100,线程池可能设置为10就可以;
  2. 低并发,高耗时的情况:建议多线程,保证有空闲线程,接受新的任务;例如并发10,线程池可能就要设置为20;
  3. 高并发高耗时:1要分析任务类型,2增加排队,3、加大线程数;