Linux 进程调度器入门

简介: Linux 进程调度器入门


进程调度器

对于CPU进程调度,目前主流的方式是两种,第一种是像window那样抢占式调度,每一个CPU可能会出现调度时间分配不等的情况,这是由于历史硬件单核性能强多核性能弱考虑。

而另一种是时间分片的方式,时间分片是Linux 常见的进程调度器,特点是每一个进程有近似相等的CPU使用权,在使用完成之后立马交给下一个进程完成工作,使用分片的方式虽然可能导致一些重要任务延迟,但这样的处理和调度方式使得系统最为稳定。

一些结论

针对Linux进程调度可以有下面的思考:

  • 每一个CPU同一时间只能调度一个进程
  • 每一个进程有*近乎相等的执行时间
  • 对于逻辑CPU而言进程调度使用轮询的方式执行,当轮询完成则回到第一个进程反复
  • 进程数量消耗时间和进程量成正比

对于进程调度来说不能保证一个程序是连续完成的,由于CPU调度和进程切换,上下文也会出现切换情况。

进程状态

对于大部分进程来说,当我们不使用的时候多数处于睡眠状态。

除了睡眠状态之外,进程还有下面几种状态

  • 运行状态:获得CPU调度,执行进程任务
  • 僵死状态:进程等待结束,等待父进程回收
  • 就绪状态:具备运行条件,等待CPU分配
  • 睡眠状态:进程不准备运行除非某种条件触发才会获得CPU调度分配。

对于处在睡眠态的进程触发运行态的条件如下

  • 外部存储器访问,
  • 用户键入或者鼠标操作触发事件
  • 等待指定时间
  • 等待指定时间

通过ps ax命令可以查看当前的进程状态,下面的案例以个人的Mac电脑为例:

MacBook-Pro ~ % ps ax
  PID   TT  STAT      TIME COMMAND
32615   ??  Ss     0:00.11 /usr/libexec/nearbyd
32632   ??  Ss     0:00.51 /System/Library/CoreServices/Screen Time.app/Content
32634   ??  Ss     0:00.02 /System/Library/PrivateFrameworks/Categories.framewo
32635   ??  S      0:00.12 /System/Library/CoreServices/iconservicesagent
32636   ??  Ss     0:00.05 /System/Library/CoreServices/iconservicesd
32671   ??  S      0:02.44 /Applications/Microsoft Edge.app/Contents/Frameworks
32673   ??  S      0:02.86 /Applications/Microsoft Edge.app/Contents/Frameworks
32678   ??  Ss     0:00.17 /System/Library/PrivateFrameworks/UIFoundation.frame
32726   ??  S      0:00.07 /System/Library/Frameworks/CoreServices.framework/Fr
32736   ??  S      0:00.08 /System/Library/Frameworks/CoreServices.framework/Fr
32738   ??  S      0:00.75 /System/Applications/Utilities/Terminal.app/Contents
32739   ??  Ss     0:00.02 /System/Library/PrivateFrameworks/Categories.framewo
32746   ??  Ss     0:00.03 /System/Library/Frameworks/Metal.framework/Versions/
32740 s000  Ss     0:00.02 login -pf xxxxxx
32741 s000  S      0:00.03 -zsh
32750 s000  R+     0:00.01 ps ax

s表示sleep,d表示此时可能在等待磁盘IO,但是如果长时间处于D状态则可能是磁盘IO等待超时或者内核可能发生故障。

image.png

那么如果只执行一个进程,同时在进程中间休眠过一次,那么休眠的时候进程在干什么?

此时进程会进入一个空进程的模式轮询,但是空进程不是没有事做,而是需要调用一些维持系统运行的线程,为了保证系统正常稳定运行。

如果只有CPU和空闲进程,那么同样会不断的切换睡眠态和运动态,运动态获取用户输入操作完成动作,睡眠态则执行一些轻量操作。

针对睡眠态的进程会有如下特点:

  • 遵循同一时间CPU只能完成一个进程操作
  • 睡眠态不占用CPU时间,也就是完全不管。

吞吐量和延迟

  1. 吞吐量:处理完成的进程数量 / 耗费时间
  2. 延迟:结束处理时间 - 开始处理时间

通过这两点可以总结几个规则:吞吐量的上限是进程的数量多过逻辑CPU的数量,则再增加进程无法增加吞吐量,另外进程中的延迟总是平均的,也就是说多个进程执行会获得近似平均的延迟,最后进程越多延迟越高。

但是现实系统没有那么多理想情况,多数情况是下面几种:

  • 空闲进程,此时吞吐量很低,因为很多逻辑CPU都在睡眠状态
  • 进程运行态,但是没有就绪,比较理想,CPU可以安排到下一次处理,此时虽然不会延长,但是会出现CPU空闲的情况
  • 进程运行态,同时都就绪,此时就好像赛跑,但是只有一个跑道,跑得快的可以抢着多处理,但是总归都要跑完赛道,所以此时延迟变长

最后其实由于程序编写都是单线程的情况,一核运行,多核围观或许在过去更位普遍。

最终主要的优化方式是使用 sar 命令找到运行时间和开销最大进程,同时把一些死进程kill掉。

多CPU调度情况

因为是分片时间每一个进程用一个CPU工作,那么分配和调度CPU安排工作又是如何的? 主要有两种方式,第一种是通过轮询的负载均衡,另一种是全局分配,把任务分配给空闲进程的逻辑CPU。

负载均衡是CPU遇到进程任务依次安排工作,当最后一个CPU安排完成之后,则再回到第一个CPU进行分配,同时都是对于进程执行一定的时间,也就是说出现CPUa处理一部分,另一部分可能是CPUb完成。 全局分配的方式比较简单,就是把任务分配给处于空闲进程的逻辑CPU完成工作。

查看系统逻辑CPU的命令如下:

grep -c processor /proc/cpuinfo

多核cpu通常只有在同时运行多个进程的时候才会发挥作用,但是并不是说有多少核心就有多少倍性能,因为大部分时候进程很少很多CPU都在睡眠态度

如果进程超过逻辑CPU数量,无论怎么增加进程都不会提高处理速度

最后处于睡眠状态的进程其实可以指定睡眠时间,通过sleep函数调用完成进程休眠的操作。

相关文章
|
11天前
|
算法 Linux 调度
深入理解Linux内核调度器:从基础到优化####
本文旨在通过剖析Linux操作系统的心脏——内核调度器,为读者揭开其高效管理CPU资源的神秘面纱。不同于传统的摘要概述,本文将直接以一段精简代码片段作为引子,展示一个简化版的任务调度逻辑,随后逐步深入,详细探讨Linux内核调度器的工作原理、关键数据结构、调度算法演变以及性能调优策略,旨在为开发者与系统管理员提供一份实用的技术指南。 ####
45 4
|
15天前
|
缓存 算法 Linux
深入理解Linux内核调度器:公平性与性能的平衡####
真知灼见 本文将带你深入了解Linux操作系统的核心组件之一——完全公平调度器(CFS),通过剖析其设计原理、工作机制以及在实际系统中的应用效果,揭示它是如何在众多进程间实现资源分配的公平性与高效性的。不同于传统的摘要概述,本文旨在通过直观且富有洞察力的视角,让读者仿佛亲身体验到CFS在复杂系统环境中游刃有余地进行任务调度的过程。 ####
36 6
|
21天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
87 4
linux进程管理万字详解!!!
|
12天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
53 8
|
12天前
|
缓存 负载均衡 Linux
深入理解Linux内核调度器
本文探讨了Linux操作系统核心组件之一——内核调度器的工作原理和设计哲学。不同于常规的技术文章,本摘要旨在提供一种全新的视角来审视Linux内核的调度机制,通过分析其对系统性能的影响以及在多核处理器环境下的表现,揭示调度器如何平衡公平性和效率。文章进一步讨论了完全公平调度器(CFS)的设计细节,包括它如何处理不同优先级的任务、如何进行负载均衡以及它是如何适应现代多核架构的挑战。此外,本文还简要概述了Linux调度器的未来发展方向,包括对实时任务支持的改进和对异构计算环境的适应性。
34 6
|
9天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
13天前
|
算法 Unix Linux
深入理解Linux内核调度器:原理与优化
本文探讨了Linux操作系统的心脏——内核调度器(Scheduler)的工作原理,以及如何通过参数调整和代码优化来提高系统性能。不同于常规摘要仅概述内容,本摘要旨在激发读者对Linux内核调度机制深层次运作的兴趣,并简要介绍文章将覆盖的关键话题,如调度算法、实时性增强及节能策略等。
|
20天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
58 4
|
21天前
|
Unix Linux Shell
linux入门!
本文档介绍了Linux系统入门的基础知识,包括操作系统概述、CentOS系统的安装与远程连接、文件操作、目录结构、用户和用户组管理、权限管理、Shell基础、输入输出、压缩打包、文件传输、软件安装、文件查找、进程管理、定时任务和服务管理等内容。重点讲解了常见的命令和操作技巧,帮助初学者快速掌握Linux系统的基本使用方法。
55 3
|
21天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
下一篇
无影云桌面