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

Linux--进程的状态

1.进程状态在所有系统中宏观的大致模型

1.1、进程状态与变迁

  • 基础状态:涵盖创建、就绪、运行、阻塞、结束等核心状态,描述进程从诞生到消亡的生命周期流转,如创建后进入就绪,争抢 CPU 进入运行,遇 I/O 或资源等待则转阻塞,完成任务或时间片用尽后结束 。

阻塞一般是进程要访问硬件,等待硬件设备回应。进程会加入阻塞队列。

挂起状态一般是,内存爆满了,操作系统为了能让内存放松一点,会吧暂时没用的进程代码和数据暂时放在磁盘空间。

如果磁盘空间也爆满,那OS会选择杀死一些它认为没那么重要的进程。

  • 状态转换条件:运行态因时间片耗尽、等待事件(如 I/O)转为就绪 / 阻塞;就绪态获 CPU 调度转为运行;阻塞态等待事件完成转回就绪,清晰呈现状态切换的触发逻辑。

1.2、进程管理数据结构

进程控制块(task_struct):作为进程 “身份证”,存储状态(status)、队列链接(list_node)等关键信息,是操作系统识别、调度进程的核心载体,多个 task_struct 通过链表 / 队列组织,管理进程队列 。

值得注意的是:在task_struct中并不是直接使用task_struct*来连接的,而是在task_struct中有一个叫做list_node的结构体连接,通过类似于struct test *strart= &c-&((struct test*)0->c)这样的运算就可以成功访问到task_struct里面的数据。

运行队列(runqueue):维护就绪进程,包含队列属性(如进程数 num)、链表头(head_node),体现 “CPU - 就绪队列” 的调度关系,保证进程有序争抢 CPU 资源 。

1.3、资源调度逻辑

CPU 调度:基于就绪队列,采用类似 “剥夺式” 策略(如时间片轮转),从队列中选进程分配 CPU,体现 “就绪进程竞争 CPU 运行权” 的核心机制 。

I/O 与外设资源:通过device_list管理外设(如键盘),进程因访问外设(如等待键盘输入)进入阻塞态,释放 CPU 给其他进程,体现 “资源等待触发状态变迁” 的逻辑 。

内存资源:引入 “交换(swap)” 机制,内存紧张时,操作系统将进程代码 / 数据换出到磁盘(swap out),需用时再换入(swap in),保证内存资源动态平衡,避免因内存不足直接销毁进程 。

1.4、设计思想与隐喻

“调度即算法”:用队列管理、状态变迁简化复杂调度,如 “队列 + 状态” 模型,将进程调度抽象为 “状态判断 + 队列操作”,体现操作系统 “用数据结构(队列) + 算法(调度逻辑)解决资源分配” 的设计思路 。

“资源是关键”:进程状态变迁、队列调度均围绕 “资源(CPU、I/O、内存)” 展开,凸显操作系统 “资源管理者” 的角色 —— 通过状态控制、队列组织,高效分配有限资源,保证系统有序运行 。

2.Linux内核源代码怎么说

•  为了弄明⽩正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有⼏个状
态(在Linux内核⾥,进程有时候也叫做任务)。

/*
*The task state array is a strange "bitmap" of
*reasons to sleep. Thus "running" is zero, and
*you can test for combinations of others with
*simple bit tests.
*/
static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */
"D (disk sleep)", /*2 */
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */
};
R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏队列⾥。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这⾥的睡眠有时候也叫做 可中断睡眠
(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫 不可中断睡眠 状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停⽌状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运⾏(一般是有非法操作,但是还不至于被操作系统杀死)。
t追踪状态:一般是在程序在调试的时候出现的,调试时其实就是创建一个子进程一步步执行,子进程会出现t状态。
X死亡状态(dead):这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。
Z僵尸状态

3.进程状态查看

ps aux / ps axj 命令
a:显⽰⼀个终端所有的进程,包括其他⽤⼾的进程。
x:显⽰没有控制终端的进程,例如后台运⾏的守护进程。
j:显⽰进程归属的进程组ID、会话ID、⽗进程ID,以及与作业控制相关的信息
u:以⽤⼾为中⼼的格式显⽰进程信息,提供进程的详细信息,如⽤⼾、CPU和内存使⽤情况等

4. Z(zombie)-僵⼫进程

僵死状态(Zombies)是⼀个⽐较特殊的状态。当进程退出并且⽗进程(使⽤wait()系统调⽤,后⾯讲)没有读取到⼦进程退出的返回代码时就会产⽣僵死(⼫)进程
僵死进程会以终⽌状态保持在进程表中,并且会⼀直在等待⽗进程读取退出状态代码。
所以,只要⼦进程退出,⽗进程还在运⾏,但⽗进程没有读取⼦进程状态,⼦进程进⼊Z状态

4.1示例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id > 0){ //parent
printf("parent[%d] is sleeping...\n", getpid());
sleep(30);
}else{
printf("child[%d] is begin Z...\n", getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}

执行重新后,打开一个新的shell使用该命令可以查看进程。

开始时

子进程结束,但是父进程没回应时

4.2僵⼫进程危害

进程的退出状态必须被维持下去,因为他要告诉关⼼它的进程(⽗进程),你交给我的任务,我
办的怎么样了。可⽗进程如果⼀直不读取,那⼦进程就⼀直处于Z状态?是的!
维护退出状态本⾝就是要⽤数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,
换句话说,Z状态⼀直不退出,PCB⼀直都要维护?是的!
那⼀个⽗进程创建了很多⼦进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数
据结构对象本⾝就要占⽤内存,想想C中定义⼀个结构体变量(对象),是要在内存的某个位置
进⾏开辟空间!
内存泄漏?是的!

4.3孤儿进程

⽗进程如果提前退出,那么⼦进程后退出,进⼊Z之后,那该如何处理呢?
⽗进程先退出,⼦进程就称之为“孤⼉进程”
孤⼉进程被1号init进程领养,当然要有init进程回收喽(这里的1号进程就是bash)

为什么要被领养?

因为孤儿进场也会退出,但是父进程已经没了,被系统领养,本质是为了回收孤儿。

http://www.lryc.cn/news/2403371.html

相关文章:

  • (nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
  • 008-libb64 你有多理解base64?-C++开源库108杰
  • 电子电路基础2(杂乱)
  • LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架
  • 电脑的ip地址会自动变怎么办?原因解析和解决方法
  • PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)
  • C++.OpenGL (5/64)变换(Transformation)
  • 优化电脑的磁盘和驱动器提高电脑性能和延长硬盘寿命?
  • 【八股消消乐】MySQL参数优化大汇总
  • JavaSec-SPEL - 表达式注入
  • 在 Caliper 中执行不同合约的方法
  • CSS 平铺+自动换行效果
  • 微服务网关SpringCloudGateway+SaToken鉴权
  • 永磁同步电机控制算法--模糊PI转速控制器
  • Elasticsearch集群最大分片数设置详解:从问题到解决方案
  • 计算机视觉与深度学习 | 基于MATLAB的图像特征提取与匹配算法总结
  • DVWA全靶场
  • 【反无人机检测】C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测
  • Android 本地存储路径说明
  • Git 推送失败解决教程——error: failed to push some refs to
  • spark 执行 hive sql数据丢失
  • 国产pcie switch 8748+飞腾/龙芯/昇腾高速存储方案设计
  • 【Qt】:设置新建类模板
  • 如何使用插件和子主题添加WordPress自定义CSS(附:常见错误)
  • 开始在本地部署自己的 Gitea 服务器
  • 7.2.1_顺序查找
  • spring重试机制
  • C语言的全称:(25/6/6)
  • 智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体
  • stylus - 新生代CSS预处理框架