关于linux系统CPU篇--->上下文切换

1.什么是CPU上下文切换?

  linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行,当然这些任务实际上并不是真的同时在运行,而是因为系统在很短的时间内,将CPU轮流分配给它们,造成多任务同时运行的错觉

 而在每个任务运行前,CPU都需要知道任务从哪里加载,又从哪里开始运行,也就是说需要系统事先帮它设置好CPU寄存器和程序计数器。

 CPU寄存器,是CPU内置的容量小,但是速度极快的内存。而程序计数器,则是用来存储CPU正在执行的指令位置,或者即将执行的下一条指令位置。它们都是CPU在运行任何任务前,必须依赖的环境,因此也被叫做CPU上下文

 CPU的上下文切换就是先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

2.上下文切换的类型?(按照任务不同区分)

  (1).进程上下文切换(不同进程之间上下文切换)

  (2).线程上下文切换,包括同一个进程下线程上下文切换,不同进程下线程上下文切换

  (3).中断上下文切换

  (4).自愿上下文切换(cswch),是指进程无法获取所需资源,导致的上下文切换

  (5).非自愿上下文切换(nvcswch),是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换,比如大量进程都在争抢CPU时,就容易发生非自愿上下文切换

3.Linux中如何查看上下文切换?

  vmstat中cs,表示每秒上下文切换的次数

 pidstat(pidstat -w 5),查看每个进程的上下文切换情况,cswch表示每秒自愿上下文切换次数,nvcswch表示每秒非自愿上下文切换的次数

总结:

 上下文切换指标:

 (1).上下文切换次数取决于系统本身的CPU性能,如果系统的上下文切换次数比较稳定,那么从数百到1万以内都是正常的

 (2).当上下文切换次数超过1万次,或者切换次数出现数量级增长时,就很可能已经出现了性能问题

 同一个进程下线程上下文切换,因为共享虚拟内存,切换过程中,虚拟内存这些资源保持不变,只需要切换线程的私有数据,寄存器等不共享的数据。(多线程代替多进程)

 自愿上下文切换变多了,说明进程都在等待资源,有可能发生IO等其他问题

 非自愿上下文切换变多了,说明进程都在被强制调度,都在争抢CPU,说明CPU的确成了瓶颈

 中断上下文切换变多了,说明CPU被中断处理程序占用,需要通过查看 /proc/interrupts文件分析具体的中断类型

猜你喜欢

转载自www.cnblogs.com/maxwellsky/p/10629753.html