上一篇笔记中我讲到了,在寻找 CPU 的性能瓶颈的问题的时候,首先会查看整台机器的平均负载是否高,而后再使用 pidstat 等工具判断究竟是哪一种状况致使的平均负载升高,主要状况有三种:函数
前面两种状况咱们都很好理解,可是大量的进程怎么也会致使 CPU 出现瓶颈呢?这是由于咱们的 CPU 核心在执行任务的时候,仍然是单任务的,只不过它执行的很快,让每一个进程交替着执行,因此在人类眼中看上去像是多个线程在并行执行。然而不一样的线程交替的切换着执行时须要成本的,当进程数量不少的时候,CPU Context Swith 就很频繁了,那么就会致使 CPU 出现性能瓶颈。CPU Context Swith 能够分为如下几种场景:工具
首先,Linux 按照特权等级,把进程的运行空间分为内核态和用户态,CPU 特权等级为 0-3 数字越小权限越高。性能
那么问题来了,因为 Linux 如今只用到了两个特权等级,分别是 Ring 0 内核态和 Ring 3 用户态,因此运行在不一样的特权等级上的进程上下文切换主要有两种:spa
那用户态进程陷入内核态进程与用户态空间之间的切换有何不一样呢?不一样之处在于用户态在进行系统调用的时候,会发生两次 CPU 的上下文切换,分别是:线程
那么说明了在系统调用的时候并不会切换本来的用户态的进程,它只是进行了系统调用(即切换到内核态)又恢复了,因此咱们把系统调用成为特权模式切换,用户态之间的进程成为上下文切换。对象
上下文切换相比系统调用会保存进程的虚拟内存和栈,因此会消耗更多的时间blog
线程与进程的区别是什么?线程是调度的基本单位,进程是资源拥有的基本单位。也就是说线程是实际上干活的,也是内核实际调度的对象,可是干活你须要工具和场地,而进程就是给线程提供了虚拟内存、全局变量等资源。因此能够这么理解:进程
那么线程的状况分为两种:事件
中断是外部事件对 CPU 执行过程打的打断,中断程序也是须要执行的,它会保存被打断的进程的状态,这样中断程序执行结束了后原来的进程就还能接着执行,那么天然中断也须要上下文切换,也会消耗 CPU 的资源。可是因为中断并不涉及到切换用户态进程,因此进程的资源是不须要保存和恢复的。ip
从上个笔记中我说到了根据 CPU 升高的状况下,会有三种缘由致使 CPU使用状况升高。这里我接着针对的是第三种大量进程切换的状况,而这种状况又能够分为三种状况,分别是:
进程上下文切换(进程切换就是特殊状况的线程切换)