0

0

Linux进程状态详解_running与sleep说明【指导】

冷漠man

冷漠man

发布时间:2025-12-30 13:39:08

|

507人浏览过

|

来源于php中文网

原创

linux中r状态表示进程在可运行队列中等待调度,并非正在cpu执行;s态分可中断(s)与不可中断(d),后者常因硬件故障导致;ps无法捕捉真实运行瞬间,需用pidstat、perf等工具追踪实际cpu占用。

linux进程状态详解_running与sleep说明【指导】

Linux中R状态不等于“正在CPU上执行”

进程显示为R(running)只是表示它处于**可运行队列中等待被调度**,未必正在占用CPU。内核调度器决定哪个R进程真正上CPU执行,其余的就排队等。尤其在多核系统中,pstop看到大量R进程,可能只是负载高、调度竞争激烈,而非每个都在满频运行。

常见误判场景:

  • 单核机器上看到20个R进程 → 实际只有1个在跑,其余19个在runqueue里堵着
  • top%CPU总和远低于100%,但STAT列一堆R → 说明进程频繁进出可运行态(如短时计算+快速阻塞),不是持续霸占CPU
  • perf record -e sched:sched_switch能观察到R进程实际被切换上/下CPU的频率,比单纯看ps更准

S睡眠态分两种:可中断 vs 不可中断

S(sleeping)是Linux中最常见的非运行态,但背后机制差异极大:

  • S(大写)= 可中断睡眠(TASK_INTERRUPTIBLE):进程在等I/O、信号或显式调用wait_event_interruptible();收到信号会唤醒并处理,比如read()从磁盘读数据时被Ctrl+C打断
  • D(大写)= 不可中断睡眠(TASK_UNINTERRUPTIBLE):通常卡在底层驱动或硬件交互中(如等待坏块磁盘响应、NFS服务器失联),连SIGKILL都杀不掉,只能等设备恢复或内核超时

判断方法:

$ ps aux | awk '$8 ~ /^[SD]$/ {print $0}'

若大量进程卡在D态,基本可定位为存储或外设故障,不是应用层问题。

A1.art
A1.art

一个创新的AI艺术应用平台,旨在简化和普及艺术创作

下载

为什么ps看不到真正的“running on CPU”进程?

ps快照采样的是进程的**内核态任务结构体(task_struct)中的state字段**,而该字段在进程真正被调度器选中并进入__switch_to上下文切换前,仍是R。换句话说:ps永远抓不到“正在执行”的瞬间,只抓到“刚被唤醒”或“刚被抢占”的状态。

要逼近真实CPU占用,得用动态追踪工具

  • pidstat -u 1:按秒输出每个进程实际CPU使用率(基于调度统计,非状态快照)
  • perf top -p $(pgrep your_proc):直接看该进程在CPU上执行时的函数热点
  • /proc/[pid]/stack:对RS进程读取其内核,确认它到底在等什么(比如停在ext4_file_read_iter就是磁盘I/O,停在futex_wait_queue_me就是锁竞争)

sleep命令和进程S态没有直接关系

Shell里的sleep 5启动的进程确实会进S态,但它只是用户空间调用nanosleep()后由内核置为TASK_INTERRUPTIBLE——这和你程序里fread()卡住、accept()没连接、pthread_mutex_lock()抢不到锁导致的S本质相同,都是自愿让出CPU。

关键区别在于唤醒源:

  • sleep:靠定时器到期唤醒
  • I/O类S:靠设备中断或数据就绪唤醒
  • 锁/信号量类S:靠其他线程释放资源后显式唤醒

所以别看到S就以为是“休眠”,得结合/proc/[pid]/stackstrace -p [pid]看它最后一条系统调用是什么。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

202

2025.07.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1564

2023.06.21

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号