上一篇中讲了stress用来模拟常见压力测试的选项:
RobotCode俱乐部:《Linux性能优化实战》之CPU性能篇(四)
这一篇的主题是:CPU上下文切换 之 进程上下文切换。
那么什么是 CPU上下文切换。简而言之,就是一个进程放弃对CPU的占用,让出其使用权,给其进程使用,此间发生的对当前进程的执行状态与现场保护,从而可以加载新的进程,这个过程就是CPU上下文切换。
那么CPU的上下文切换可以分为几种类型?
根据场景不同,可以分为3种类型:
进程上下文切换线程上下文切换中断上下文切换
那么这几种切换,哪种对CPU的平均负载影响最大?首先需要明白这几种切换时,CPU都干了些什么事。
进程上下文切换
Linux按照特权等级,把进程的运行空间分为内核空间与用户空间。内核空间具有最高权限,可以直接访问所有资源;用户空间只能访问受限资源,要想访问其他不能直接访问的资源需要通过系统调用的方式陷入内核中,此时相当于内核代替其执行一些资源的访问。(这里有个问题,普通进程通过系统调用就能访问之前自己对受限的资源,那 普通进程和 内核 好像没有区别了?后面会写这个疑问)
这里要引入的问题是 一次系统调用 引起几次CPU上下文切换?
在系统调用前,为了执行内核态的代码,需要先将用户态的 运行环境保存起来,CPU调入内核态代码,此时发生一次CPU上下文切换。之后,系统调用执行完后,又要返回到用户态,此时又要此前保存的用户态运行环境重新调入CPU,再次执行,又发生了一次CPU上下文切换。
还有个问题,进程上下文切换 和 系统调用的上下文切换 是什么区别?
进程上下文切换,是指从一个进程切换到另一个进程运行,而系统调用过程中一直是同一个进程在运行,不会涉及虚拟内存等进程用户态的资源。系统调用过程一般称之为 特权模式切换,而不是CPU上下文切换,但是系统调用的过程中 CPU的上下文切换是无法避免的!
所以进程的上下文切换就比系统调用多了一步,保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还要刷新进程的虚拟内存和用户栈。
Linux通过TLB管理虚拟内存到物理内存的映射关系,当虚拟内存更新后,TLB也需要刷新,内存访问会随之变慢,特别是在多处理器系统上,缓存是被多个处理器共享的,刷新缓存不仅会影响当前处理器的进程,也会影响共享缓存的其他处理器的进程。
那么什么时候会发生进程上下文切换?
Linux为了保证每个进程被公平调度,CPU时间被划分为一段段时间片,这时时间片再被轮流分配给各个进程,当某个进程的时间片耗尽了,就会被系统挂起,切换到其他进程;在系统资源不足时,需要等待资源满足后才可以运行,这个时候进程会被挂起,由系统调度其他进程运行;当进程通过睡眠函数sleep这样的方法将自己主动挂起,自然也会重新调度;当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行;发生硬件中断时,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序。
这一篇先码这么多,下一篇讨论线程上下文切换。
上下文保存 中断_Linux性能优化(CPU篇)(5)——CPU的上下文切换有几种类型?什么是进程上下文切换?...