Linux中进程的六种状态

Linux中进程的六种状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。

在这里插入图片描述

在这里插入图片描述

R运行状态(running)

并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列

问题:如果只有一个CPU,可不可以存在多个R状态的进程。
现场试一下:用fork创建子进程,试一下
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
可以看到,是可以存在多个运行状态的。
进程是R状态,不代表正在运行,代表可被调度。换句话说,进程只有是R状态才可被调度,其他状态要先转为R状态,才能被OS调度。
在这里插入图片描述

S睡眠状态(sleeping)

意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
代码实现一下:
在这里插入图片描述

在这里插入图片描述
休眠状态是在等待某种条件就绪,在休眠状态,可被操作系统杀死,也叫浅度睡眠。

处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

在这里插入图片描述
由上图看到,一般情况下,进程列表中的绝大多数进程都处于S状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。

D磁盘休眠状态(Disk sleep)

有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

可是为什么有了S状态,又来一个D状态呢?有什么作用呢?
举例说明:
在这里插入图片描述

T停止状态(stopped)

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

Z僵尸状态(Zombies)

代码实现一下僵尸状态:
子进程5秒结束,父进程死循环,不读取子进程结束信息。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5秒之后,子进程变为僵尸状态。

僵尸进程是什么

是一个比较特殊的状态。当子进程退出并且父进程没有读取到子进程退出的返回代码时,就会产生僵死(尸)进程,
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

为什么要有僵尸进程

因为我们必须得保证一个进程跑完,启动这个进程的父进程或是操作系统必须得知道这个进程退出时,把我们交代得任务完成得怎么样了,成功还是失败了。必须要知道子进程得运行结果。当子进程退出的时候,它的信息不会立即释放,会存在PCB中,没有人读取,这个状态不会被释放掉,这个状态就是僵尸状态。

僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!

那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!

因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空
间!内存泄漏?是的!

X死亡状态(dead)

这个状态只是一个返回状态,你不会在任务列表里看到这个状态。当父进程读取子进程的返回结果时,子进程立刻释放资源。死亡状态是非常短暂的,几乎不可能通过ps命令捕捉到。

孤儿进程

所谓孤儿进程,故名思义,和现实生活中的孤儿有点类似,当一个进程的父进程结束时,但是它自己还没有结束,那么这个进程将会成为孤儿进程。

孤儿进程会被init进程(1号进程)的进程收养,当然在子进程结束时也会由init进程完成对它的状态收集工作,因此一般来说,孤儿进程并不会有什么危害.
代码实现一下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id == 0){//child
printf("I am child, pid : %d\n", getpid());
sleep(10);
}else{//parent
printf("I am parent, pid: %d\n", getpid());
sleep(3);
exit(0);
}
return 0;
}

在这里插入图片描述
由图可以看出,当父进程结束时,父进程由4416变为1号进程,子进程4417被1号进程领养。

<think>好的,我现在需要回答用户关于Linux进程六种状态的问题。根据用户提供的引用内容,我需要先整理出这六种状态,并详细解释每一种状态。 首先,用户提到的引用[1]里列出了运行态R、睡眠态S、暂停态T、深度睡眠状态D、僵尸状态Z和孤儿进程。但要注意孤儿进程是否算作一种独立的状态。根据常规的Linux进程状态分类,通常分为运行(R)、可中断睡眠(S)、不可中断睡眠(D)、停止(T或T)、僵尸(Z)和死亡(X)。不过引用内容里可能将孤儿进程单独列出来,但孤儿进程实际上是一种状态的结果,而不是进程自身的状态。因此可能需要确认用户引用的内容是否将孤儿进程作为状态之一,或者是否有其他分类方式。 根据引用[1]中的描述,六种状态包括运行态R、睡眠态S、暂停态T、深度睡眠D、僵尸Z和孤儿进程。但孤儿进程更多是指父进程结束后子进程被init接管的情况,它本身可能处于其他状态,比如运行或睡眠。所以这里可能需要澄清用户的问题,是否孤儿进程被算作独立的状态。或者可能引用中的分类有误,或者用户将孤儿进程与僵尸进程混淆了。 不过根据引用[3],用户提供的资料中确实提到了六种状态,包括运行态R、睡眠态S、暂停态T、深度睡眠D、僵尸Z和孤儿进程。因此,在回答时需要按照用户提供的引用内容来组织,尽管这可能与标准的分类有所不同。需要指出用户提供的引用中的六种状态,并详细说明每个状态的特点。 接下来,需要逐一解释每个状态: 1. 运行态R:进程正在运行或就绪状态,等待CPU调度。 2. 睡眠态S:可中断的睡眠,等待事件完成,可以被信号唤醒。 3. 暂停态T:进程被暂停,比如通过SIGSTOP信号,需要SIGCONT恢复。 4. 深度睡眠状态D:不可中断的睡眠,通常发生在等待硬件I/O,不能通过信号唤醒。 5. 僵尸状态Z:进程已终止,但父进程尚未回收其资源,导致残留PCB。 6. 孤儿进程:父进程提前终止,子进程被init进程收养,避免成为僵尸进程。 需要注意的是,孤儿进程本身可能处于运行、睡眠或其他状态,但引用[2]提到孤儿进程会被init接管,解决僵尸问题。所以在用户提供的资料中,可能将孤儿进程视为一种状态,需要按照引用内容来呈现。 在回答时,需要结合每个状态的定义、触发条件和相关命令(如ps命令中的状态显示),以及如何处理或产生的问题(如僵尸进程的处理)。同时引用[1][2][3]中的内容作为支持,比如引用[2]说明孤儿进程被init收养,解决僵尸进程的问题。 需要确保回答结构清晰,分点解释每个状态,并引用正确的来源。此外,用户要求生成相关问题,可能需要根据主题设计相关问题,比如状态转换、如何检测僵尸进程、如何处理孤儿进程等。 现在开始组织回答: 首先,概述Linux进程六种状态,根据引用[1][3],然后分点详细说明每个状态,包括状态名称、描述、触发条件和相关引用。例如: 1. 运行态R: - 描述:进程正在执行或在就绪队列等待CPU调度。 - 引用[1]提到运行态的详细介绍,可能涉及CPU时间片的分配。 - 命令查看:ps aux中的STAT列为R。 2. 睡眠态S(可中断): - 等待事件(如I/O完成),可以被信号中断。 - 引用[1]中的睡眠态S,可能涉及进程主动进入睡眠。 3. 暂停态T: - 进程被暂停,如通过Ctrl+Z发送SIGSTOP,需SIGCONT恢复。 - 引用[1]中的暂停态T。 4. 深度睡眠D: - 不可中断的睡眠,常见于等待磁盘I/O,不能响应信号。 - 引用[1]中的深度睡眠状态D,可能导致进程无法终止,需重启系统。 5. 僵尸状态Z: - 进程已终止但未被父进程回收,残留PCB。 - 引用[1][3]提到僵尸状态Z,需父进程调用wait回收。 6. 孤儿进程: - 父进程终止后,子进程被init接管,避免成为僵尸进程。 - 引用[2]说明孤儿进程由init收养,资源正常回收。 需要注意,孤儿进程本身可能处于其他状态,但用户提供的引用将其列为状态之一,所以需要按此处理。 最后生成相关问题,如: 1. 如何避免僵尸进程的产生? 2. 进程状态转换的条件是什么? 3. 如何查看系统中的僵尸进程? 确保引用正确,比如引用[2]用于孤儿进程的处理,引用[3]说明状态存储在PCB中。 现在整合所有内容,形成结构清晰的回答,并附上相关问题。</think>### Linux 进程六种状态详解 Linux 进程状态反映了其在系统调度中的行为,这些状态信息存储在进程控制块(PCB)中,操作系统通过检查 PCB 来分配和管理进程资源[^3]。以下是六种主要状态的详细说明: --- #### 1. **运行态(R)** - **描述**:进程正在 CPU 上执行,或处于就绪队列中等待 CPU 调度。 - **特点**: - 若系统有多个 CPU 核心,多个进程可同时处于运行态。 - 通过 `ps aux` 命令查看时,进程的 `STAT` 字段显示为 `R`[^1]。 - **触发场景**:进程正在执行计算任务或等待 CPU 时间片分配。 --- #### 2. **睡眠态(S,可中断睡眠)** - **描述**:进程因等待事件(如 I/O 完成、信号量释放等)而暂时挂起。 - **特点**: - 可被信号(如 `kill` 命令)中断唤醒。 - 在 `ps aux` 中显示为 `S`[^1]。 - **触发场景**:例如,进程调用 `sleep()` 或等待用户输入。 --- #### 3. **暂停态(T)** - **描述**:进程被外部信号(如 `SIGSTOP`)暂停执行,需通过 `SIGCONT` 信号恢复。 - **特点**: - 常用于调试或手动暂停进程(如按 `Ctrl+Z` 触发)。 - `ps aux` 中显示为 `T`[^1]。 - **恢复方式**:使用 `kill -SIGCONT <pid>` 或 `fg` 命令恢复进程。 --- #### 4. **深度睡眠态(D,不可中断睡眠)** - **描述**:进程因等待硬件操作(如磁盘 I/O)进入不可中断的睡眠。 - **特点**: - **无法被信号唤醒**,需等待操作完成。 - 常见于内核级操作,可能导致进程长时间无法终止,需重启系统解决。 - `ps aux` 中显示为 `D`。 - **触发场景**:例如,进程向磁盘写入大量数据。 --- #### 5. **僵尸状态(Z)** - **描述**:进程已终止,但其退出状态未被父进程回收(通过 `wait()` 系统调用)。 - **特点**: - 残留进程的 PCB 占用系统资源,可能导致资源泄漏。 - `ps aux` 中显示为 `Z`。 - **解决方式**:父进程需主动回收子进程;若父进程未处理,需终止父进程(此时僵尸进程会被 `init` 进程回收)[^2]。 --- #### 6. **孤儿进程** - **描述**:父进程先于子进程终止,子进程被 `init` 进程(PID=1)接管。 - **特点**: - 避免子进程成为僵尸进程,`init` 进程会负责回收其资源。 - 孤儿进程本身可能处于运行(R)、睡眠(S)等状态。 - **触发场景**:例如父进程因错误提前退出,子进程仍在运行。 --- ### 状态转换示意图 ``` 运行态(R) ↔ 睡眠态(S) ↑ ↕ 暂停态(T) 深度睡眠态(D) ↓ 僵尸态(Z) → 孤儿进程(被 init 回收) ``` --- ### 相关问题 1. **如何避免僵尸进程的产生?** 2. **进程从运行态切换到睡眠态的常见原因有哪些?** 3. **如何通过命令查看系统中的不可中断睡眠(D)进程?** --- 以上内容基于进程状态的底层实现机制和 Linux 系统管理实践整理。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值