更多请关注 >>http://java.jr-jr.com

  1. 1. 什么叫上下文切换
  2. 2. 什么时候发生上下文切换
  3. 3. 上下文切换的消耗

什么叫上下文切换

Context Switch Definition
上下文切换只能发生在内核态中
简单点说:
上下文切换是指CPU从一个进程或线程切换到另一个进程或线程。
上下文是指某一时间点CPU寄存器程序计数器的内容。
CPU给每个任务都服务一定的时间, 然后把当前任务的状态保存下来, 在加载下一任务的状态后, 继续服务下一任务. 任务的状态保存及再加载, 这段过程就叫做上下文切换. 时间片轮转的方式使多个任务在同一颗CPU上执行变成了可能, 但同时也带来了保存现场和加载现场的直接消耗.

什么时候发生上下文切换

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

上下文切换的消耗

多线程并不一定会比单线程快,主要由以下因素影响:
直接消耗(Linux线程不需要切换页表、刷新TLB)

  • CPU寄存器需要保存和加载
  • 操作系统调度器执行耗时
  • TLB实例需要重新加载 (Linux kernel和TLB)
  • CPU 的pipeline需要刷掉

间接消耗

  • 多核的cache之间得共享数据

上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的CPU时间,事实上,可能是操作系统中时间消耗最大的操作。

Linux没有线程的概念,只是为了迎合开发者的需要而使用了一个所谓轻量级进程(POSIX线程),你从这两者区别也可以发现,轻量级进程最大的用途在于可以共享一些资源,如地址空间,打开文件。所以,事实上Linux实现多线程应用程序的方式就是用轻量级进程来代替线程。

使用vmstat可以看到上下文切换消耗(cs)

1
2
3
4
vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 74956 2952620 570032 57981312 0 0 0 0 2190 414 0 0 99 0 0