当前位置: 首页 > news >正文

进程的状态及其 CPU 占用

1. R —— 唯一的 CPU 消费者

这是最直观的状态,但这里有一个必须厘清的概念。

  • 定义:在内核源码中,R并不意味着进程一定正在 CPU 上跑。它表明进程“要么是在运行中,要么在运行队列 (runqueue) 里” 。
  • 对 CPU 的占用
    • 正在执行:实打实地占用 CPU 周期,执行指令(加减乘除、逻辑判断等)。
    • 在运行队列中排队:虽然此时没占用 CPU 硬件,但它准备好了。只要 CPU 一空闲,调度器就会把它拉上去跑。
  • 总结:只有处于R 状态的进程,才可能产生 CPU 负载。如果你的程序是死循环(while(1){}),它会一直处于 R 状态,把单核 CPU 跑满(100%)。

2. S & D —— 主动让出 CPU

这是绝大多数进程在绝大多数时间所处的状态。

  • S (浅度睡眠/可中断睡眠)
    • 场景:进程在等待某个事件。比如你的 C++ 程序调用了cin >> x;或者sleep(10);
    • 机制:当进程执行到这些代码时,它知道自己暂时没法继续(因为没数据输入,或者时间没到)。它会主动告诉内核:“我先睡会儿,有事叫我”。
    • CPU 占用0%。内核会把这个进程从 CPU 的“运行队列”中拿走,放入“等待队列”。调度器在分配时间片时,根本不会看它一眼。
  • D (深度睡眠/不可中断睡眠)
    • 场景:通常是在等待严重的 IO 事件(比如读写磁盘)结束 2。
    • CPU 占用0%。和 S 状态一样,它不消耗 CPU 指令周期。
    • 注意:虽然它不消耗 CPU,但在计算系统负载 (Load Average)时,Linux 会把 D 状态的进程算进去。因为它虽然没算术,但它占用了系统总线资源,系统实际上是“忙碌”的。

生活案例

  • R 状态:你在图书馆书桌前奋笔疾书(占用 CPU)。
  • S 状态:你把书合上,去旁边沙发上玩手机等外卖(让出书桌/CPU)。此时你虽然人还在图书馆(进程还在内存),但不占用学习资源(CPU)。

3. T —— 被强行暂停
  • 定义:通过发送信号(如SIGSTOP)让进程暂停 。比如你在终端里按下Ctrl+Z,或者调试断点命中时。
  • CPU 占用0%。进程被挂起,完全停止运行,自然不会占用任何 CPU 时间片。

4. Z —— 最大的误区

很多初学者看到top命令里有僵尸进程,第一反应是“它是不是在吃我的 CPU?”

  • 定义:进程代码执行完毕退出了,但父进程还没读取它的退出状态 4。
  • 现状:此时进程的代码和数据已经被释放了,它已经不是一个完整的代码执行体了。它只剩下内核中的一个task_struct结构体(PCB),用来保存退出码等信息 5。
  • CPU 占用绝对的 0%。一个死人是不会跑马拉松的。
  • 它的危害:它不耗 CPU,也不耗多少内存(只占一个结构体的大小),但它占用进程号 (PID) 资源和内核表格的一个位置。如果僵尸太多,会导致 PID 耗尽,系统无法创建新进程 6。

5. 隐藏的 CPU 消耗:进程切换

这是高阶视角。虽然 S 状态本身不耗 CPU,但状态切换本身是耗 CPU 的

  • 机制:当一个 R 状态的进程时间片用完,或者因等待 I/O 变成 S 状态时,CPU 需要进行上下文切换
  • 过程:CPU 必须保存当前进程的寄存器数据(上下文)到它的 PCB 中,然后从下一个进程的 PCB 中加载数据到寄存器 7。
  • 代价:如果你的程序频繁地在 R 和 S 之间反复横跳(例如大量的网络小包收发,或者极其频繁的系统调用),虽然程序逻辑看似简单,但大量的 CPU 时间会被浪费在“保存上下文-恢复上下文”这种内核搬运工作上,导致System CPU升高,而User CPU可能并不高。
总结表

状态

描述 (Linux)

典型场景

R

Running

正在运算、逻辑判断、死循环

S

Sleeping (可中断)

等键盘输入、sleep()

、等网络包

D

Disk Sleep (不可中断)

读写大文件、访问慢速磁盘

T

Stopped

Ctrl+Z

暂停、GDB 调试暂停

Z

Zombie

子进程已死,父进程未收尸

http://www.cnnetsun.cn/news/69896.html

相关文章:

  • [CISCN2019 华东南赛区]Web4
  • AI编程革命!Claude Skills大揭秘:小白也能快速上手的Agent开发神器,大模型开发者必看!
  • 内点法求最优潮流附matlab代码
  • 三相PWM整流器有限集模型预测电流控制附Simulink仿真模型
  • 光伏四可“可观”功能:光伏电站全景数字化的底层支撑技术
  • 如何用FLUX.1-dev镜像在本地部署下一代AI绘画模型?
  • 基于 Comsol 移动网格方法的激光熔池流动数值模拟
  • BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及有感无感换相方式研究
  • [光学原理与应用-491]:水冷机、零气模块CDA、功率计等影响266皮秒紫外激光器的种子源1064nm功率稳定性结果的主要因素有哪些?
  • 昆仑通态MCGS与欧姆龙E5CC温控器通讯实战:PID模式及输出启停控制
  • 通达信〖逆势突破强牛〗指标公式 逆市环境中率先突破前期重要压力位 较强内在上涨动力
  • 基于扰动观测器的永磁同步电机(PMSM)模型预测控制(MPC)仿真探索
  • AEB联合仿真算法设计:Carsim2019.0+Matlab/Simulink2021a实现...
  • Java毕设选题推荐:基于springboot个人博客系统的设计与实现基于SpringBoot+Vue个人博客系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot停车场车位预约系统基于Java springboot停车场管理系统停车位预约【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的无人化、线上化、数据化海洋馆预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ascend C高级API应用:InitGlobalMemory与Pad操作的底层原理
  • Java毕设选题推荐:基于Java Web的新能源汽车信息咨询服务基于SpringBoot+Vue的新能源汽车信息咨询服务的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
  • Object.defineProperty和Proxy实现拦截的区别
  • 若依物联网
  • PSEN1抗体:如何揭示阿尔茨海默病致病机制与治疗新靶点?
  • Docker Engine 升级指南:保障容器安全的关键步骤
  • 基于zigbee灯光控制照明及色温调节系统的设计与实现(有完整资料)
  • 7、Python高级语法:描述器、属性与元编程实战
  • 【开题答辩全过程】以 基于java技术的校园一卡通系统的设计与实现为例,包含答辩的问题和答案
  • 11、Python 包与应用开发全解析
  • django基于智能推荐算法的全屋定制平台网站设计
  • 详谈:解释器模式(四)
  • 双Buck电路并联下的下垂控制与VDCM协同控制策略:增强直流微电网稳定性的仿真应用