0x00 前言

上一篇笔记中我讲到了,在寻找 CPU 的性能瓶颈的问题的时候,首先会查看整台机器的平均负载是否高,然后再使用 pidstat 等工具判断到底是哪种情况导致的平均负载升高,主要情况有三种:

CPU 密集型

IO 密集型

大量进程的场景

前面两种情况我们都很好理解,但是大量的进程怎么也会导致 CPU 出现瓶颈呢?这是因为我们的 CPU 核心在执行任务的时候,仍然是单任务的,只不过它执行的很快,让每个进程交替着执行,所以在人类眼中看上去像是多个线程在并行执行。然而不同的线程交替的切换着执行时需要成本的,当进程数量很多的时候,CPU Context Swith 就很频繁了,那么就会导致 CPU 出现性能瓶颈。CPU Context Swith 可以分为以下几种场景:

进程上下文切换

线程上下文切换

中断上下文切换

0x01 进程上下文切换

首先,Linux 按照特权等级,把进程的运行空间分为内核态和用户态,CPU 特权等级为 0-3 数字越小权限越高。

那么问题来了,由于 Linux 现在只用到了两个特权等级,分别是 Ring 0 内核态和 Ring 3 用户态,所以运行在不同的特权等级上的进程上下文切换主要有两种:

用户态进程之间的切换

用户态进程陷入到内核态,即系统调用

那用户态进程陷入内核态进程与用户态空间之间的切换有何不同呢?不同之处在于用户态在进行系统调用的时候,会发生两次 CPU 的上下文切换,分别是:

用户态进程调用系统调用,并陷入到内核态

内核进程执行完调用后再恢复原来的用户态的进程执行

如此说来,那么在系统调用的时候,当前用户态进程并不会切换成其他的用户态进程,它只是进行了系统调用(即切换到内核态)又恢复了,所以我们把为了好区分,把系统调用说成特权模式切换,用户态之间的进程切换说成上下文切换。

系统调用与上下文切换有何区别?

上下文切换相比系统调用会保存进程的虚拟内存和栈,所以会消耗更多的时间

何时会进行进程上下文切换?

CPU 时间片结束,CPU 是划分为多个时间片的给不同进程使用的

进程运行需要的资源不够,如等待IO,Memory insufficient 等等

进程主动挂起,如 sleep 函数

有优先级更高的进程执行,如硬中断

0x02 线程上下文切换

线程与进程的区别是什么?线程是调度的基本单位,进程是资源拥有的基本单位。也就是说线程是实际上干活的,是内核实际调度的对象,但是干活你需要工具和场地,而进程就是给线程提供了虚拟内存、全局变量等资源。所以可以这么理解:

进程 = 所有线程 + 资源

如果进程只有一个线程,那么可以认为这个线程就代表整个进程

如果一个进程有多个线程,所有线程共享这个进程的资源,在上下文切换的时候这些资源也不需要切换

线程有自己的私有数据,如 stack,Register等,这些需要保存

那么线程的情况分为两种:

前后线程属于一个进程,那么资源是共享的,所以只需要切换线程的私有数据

如果前后线程属于不同的进程,那么切换的情况和进程是一样的

0x03 中断上下文切换

中断是外部事件对 CPU 执行过程打的打断,中断程序也是需要执行的,它会保存被打断的进程的状态,这样中断程序执行完后,原来的进程还能接着执行,既然要切换进程那么自然中断也需要上下文切换,也会消耗 CPU 的资源。但是由于中断并不涉及到切换用户态进程,所以进程的资源是不需要保存和恢复的。

0x04 总结

从上个笔记中我说到了根据 CPU 升高的情况下,会有三种原因导致 CPU使用情况升高。这里我接着针对的是第三种大量进程切换的情况,而这种情况又可以分为三种情况,分别是:

进程上下文切换(进程切换就是特殊情况的线程切换)

系统调用

进程上下文切换

线程上线文切换

中断上下文切换

linux进程上下文切换,Linux 性能分析总结之 CPU 上下文切换(二)相关推荐

  1. linux 解析pdf下载工具,Linux高级系统级性能分析工具-perf.pdf

    Linux高级系统级性能分析工具-perf Linux 的系统级性能剖析工具‐perf (二) 承刚 TAOBAO  Kernel Team chenggang.qin@ 第三章  Perf top ...

  2. Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  3. linux 性能教程,Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  4. 分析linux系统的运行性能,Linux系统下常见性能分析工具的使用

    在前面的文章中,我简单介绍了影响linux性能的几个方面以及如何解决这些方面的问题,但是如何才能从系统上发现是某个方面或某几个方面出现问题了呢,这就需要使用linux系统提供的几个常用性能分析工具,下 ...

  5. linux进程管理子系统分析,linux进程管理子系统简要分析

    Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 进程:是一个执行中的程序,它是动态的实体 进程四要素: 1. 有一段程序供其执行,这段程序不一 ...

  6. Linux进程 管理,Linux进程查看与管理以及作业控制

    Linux进程查看与管理 静态结构:重底层开始往上 底层:硬件 kernel(OS):各硬件接口封装成简洁的接口 库:将内核功能封装成功能模块,供程序员研发使用 OS的基本功能:文件系统.网络功能.进 ...

  7. 【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  8. linux 进程 系统调用,linux进程与系统调用

    进程管理 linux系统的实现非常特别:他对线程和进程并不特别区分.对linux而言,线程只不过是一种特殊的进程罢了. 现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存.虽然实际上可能是许多 ...

  9. linux进程笔记,Linux自学笔记——linux进程及作业管理

    内核的功用主要有进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能这几个方面,本文主要讨论linux进程及作业管理. 进程管理: 进程,process,运行中程序的一个副本,且存在生命周期: ...

最新文章

  1. oop的三大特性和传统dom如何渲染
  2. 【opencv4】opencv视频教程 C++ 7、手动调整图像亮度与对比度 g(i, j) = αf(i, j) + β(点操作与邻域操作概念)
  3. 华三交换机配置多个镜像口_配置本地端口镜像详解(多个镜像口:多个观察口)...
  4. 关于javascript的原型和原型链,看我就够了(一)
  5. 将多张图片转为avi视频,再转为h264文件
  6. XmlDocument,XDocument相互转换
  7. 嵌入式系统功能需求分析_嵌入式系统开发流程及前景分析
  8. 编程机器人考级证书有用吗_机器人编程有等级考试吗?
  9. 贝叶斯分析好坏_玩转贝叶斯分析
  10. Spring源码解析:Spring Aware 原理解析
  11. 解决谷歌disabled状态下操作问题
  12. 秒杀活动,怎么设计全套技术方案
  13. 9月份入读哈工大计算机研究生了
  14. 工业镜头倍率及视场范围、焦距的计算方法
  15. 炫酷进度条:Android 仿应用宝下载进度条
  16. Doris1.1.1多种异构数据源数据导入方案
  17. java单元测试如何全覆盖_java-覆盖测试
  18. kdd 2021 多网络挖掘的新前沿:近期发展和未来趋势
  19. Spacy model download
  20. 测试容器网络带宽,限制容器对内存,对CPU的使用

热门文章

  1. 理解 redis 中的 哈希对象类型
  2. Blazor带我重玩前端(二)
  3. .NET 程序员的 Playground :LINQPad
  4. 如何运用领域驱动设计 - 工作单元
  5. 特意向大家推荐.NET技术圈一些优秀开发者的公众号
  6. 使用Vistual Studio N年,推荐2个异常捕获的技巧
  7. 使用高性能Pipelines构建.NET通讯程序
  8. 终于明白了 C# 中 Task.Yield 的用途
  9. 基于Citus和ASP.NET Core开发多租户应用
  10. 在.NET Core中处理一个接口多个不同实现的依赖注入问题