线程上下文切换耗时分析
切换时机
- 线程的 CPU 时间片用完;
- 垃圾回收;
- 有更高优先级的线程需要运行;
- 线程自己调用了 sleep、yield、wait、park、synchronized、lock 等方法;
开销
线程局部变量(TLS)的保存成本很低,只需要操作几十个寄存器。
线程上下文切换的真正性能瓶颈在于:
- 缓存失效:新线程的数据可能不在 CPU Cache 中,导致大量 Cache Miss,访问内存的延迟远高于寄存器;
- 调度器开销:选择下一个线程、更新队列、优先级计算等逻辑比较复杂,可能涉及到锁竞争、抢占和唤醒;
- 内核态和用户态的切换:若涉及系统调用或中断,会带来额外开销;