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

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态

目录

        操作系统中

运行状态

阻塞状态

进程状态转换

 Linux系统中

查看进程状态

深度睡眠状态

T 暂停状态

Z 僵尸状态

 孤儿状态

文章手稿


xmind: 

引言

介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换过程以及处理方法。

操作系统中

一个进程通常有三种状态

  • 就绪状态(Ready):表示进程已经具备运行所需要的一切条件,只需要等待CPU的分配就可以运行。进程处于就绪状态时,通常会被添加到就绪队列,等待调度器分配CPU资源
  • 运行状态(Running):表示进程正在被CPU执行。处于运行状态的进程正在使用CPU进行计算或其他操作
  • 阻塞状态(Blocked):表示进程因为某些原因暂时无法继续执行,需要等待一些特定条件的解除之后才能继续运行。例如,当进程等待I/O操作完成或者等待某个资源可用时,会转入阻塞状态。进程在阻塞状态时,通常会被移动到阻塞队列中,等待条件的满足。

我们下面将对运行,阻塞,和阻塞挂起进行介绍~ 

运行状态

 进程只要在运行队列中,就叫做 运行态

阻塞状态

关于进程:

① 一个进程使用资源的时候,可不仅仅是在申请 CPU 资源
② 进程可能会申请其它资源:磁盘、网卡、显卡,显示器资源……

如果我们申请 CPU 资源无法暂时无法得到满足,这就需要排队的 "运行队列" 。那么如果我们申请其他慢设备的资源呢?是需要排队的(task_struct 在进程排队)。

当访问某些资源(磁盘,网卡等),如果该资源暂时没有准备好,或者正在给其他进程提供服务,那么此时:

① 当前进程要从 runqueue 中逐出。
② 将当前进程放入对应设备的描述结构体中的waitqueue 。

进程状态:看PCB在哪个队列

内存不足了,操作系统就会把 该进程的代码和数据置换到磁盘上,进行 进程挂起

进程状态转换

进程状态的转换可以通过以下示例说明:

#include <stdio.h>
#include <unistd.h>int main() {while (1) {printf("进程[%d]正在运行...\n", getpid());sleep(1); // 模拟阻塞状态}return 0;
}

通过运行上述代码并观察进程状态,可以理解进程在不同状态之间的转换过程。

三种状态的图示如下:


 Linux系统中

进程状态用整数表示,这些整数存储在进程的task_struct结构体中。常见的进程状态包括:运行(R)、睡眠(S)、磁盘睡眠(D)、停止(T)、死亡(X)、僵尸(Z)和孤儿进程

进程状态一览

状态代码状态名称描述
R运行(Running)进程正在运行或在运行队列中等待
S睡眠(Sleeping)进程在等待某事件完成,可被信号唤醒
D磁盘睡眠(Disk Sleep)进程在等待I/O操作完成,不可被信号唤醒
T停止(Stopped)进程被暂停,可通过信号恢复
X死亡(Dead)进程已终止,从进程列表中移除
Z僵尸(Zombie)进程已退出,父进程尚未读取其状态
孤儿(Orphan)父进程已退出,被init进程收养

查看进程状态

使用ps auxps axj命令可以查看系统中进程的状态。例如:

ps aux
ps axj

这些命令输出的状态字段展示了进程当前的状态。

背后的原因让人暖心,cpu太快了,print显示器等待的时间在他看来就是在sleep了

深度睡眠状态

这个D状态我们就不模拟了……可能会把我的机子磁盘打满(害怕.dog) 


T 暂停状态

比如看视频,听音乐,下载,都会有暂停。当你点击暂停的时候下载对应的代码就不跑了,此时这个进程你就可以认为是暂停状态。

再比如说我们调试程序,让程序打断点之后让程序运行起来,程序在打断点处停住的时候是将进程暂停了,所以你在gdb 调试或在 VS 下调试时你会发现程序会停下来,这就是暂停

是进程挂起的一种。

我们可以先来看一下kill

接下来可以来尝试一下;

$ kill -19 4026,就会发现

gdb下的暂停状态,测试一下

$ gdb process  # 进入gdb调试
(gdb) l        # 查看代码
(gdb) b 9      # 打断点
q + 回车       # 退出

Z 僵尸状态

僵尸状态:当一个 Linux 中的进程退出的时候,一般不会直接进入 X  状态(死亡,资源可以立马被回收),而是进入 Z 状态。

为什么呢~

进程为 Z 状态,就是为了维护退出信息,可以让父进程或者 OS 读取记录的,退出信息会写入 test_struct。

以下是创建僵尸进程的代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t id = fork();if (id < 0) {perror("fork");return 1;} else if (id == 0) { // 子进程printf("子进程[%d]开始运行...\n", getpid());sleep(5);printf("子进程[%d]退出...\n", getpid());exit(0);} else { // 父进程printf("父进程[%d]正在睡眠...\n", getpid());sleep(30); // 父进程延迟回收子进程}return 0;
}

 我们可以写一个监控脚本来看一下~

while :; do ps axj | head -1 && ps axj | grep mytest | grep -v grep; sleep 1; echo "######" ; done

在另一个终端中运行ps命令可以看到子进程进入僵尸状态。

僵尸进程的危害

僵尸进程虽然不再运行,但它们仍然占用系统资源(如进程控制块task_struct)。如果父进程不及时回收子进程,会导致系统资源浪费,甚至内存泄漏。

避免僵尸进程

可以通过以下方式:

  1. 父进程及时调用wait()waitpid()回收子进程。
  2. 使用信号处理机制,在子进程退出时通知父进程进行回收。

 孤儿状态

孤儿进程:父亲没了(bushi

即:父进程先退出了,子的父就变成1 号进程了,相当于被os领养了

测试一下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main(void) {pid_t id = fork();if (id == 0) {// childint cnt = 5;while (1) {  // 死循环,孩子进程就不退了printf("我是子进程,我还剩下 %ds\n", cnt--);sleep(1);}printf("我是子进程,我已经变僵尸了,等待被检测\n");exit(0);}else {// fatherint cnt = 3;while (cnt) {printf("我是父进程,我: %d\n", cnt--);sleep(1);}exit(0);}
}

 监控一下:

 while :; do ps axj | head -1 && ps axj | grep mytest | grep -v grep; sleep 1;echo "######";done

我们可以top看一下1究竟是什么

 

❓ 疑问:父进程退出,为什么父进程没有变成僵尸?我们怎么没有看到父进程 为Z  ?

  • 那是因为父进程的父进程是bash ,它会自动回收它的子进程,也就是这里的父进程。这里之所以没有看到父进程变成僵尸,是因为被 bash 回收了, z->x 的状态很快,所以你没看到
  • 那为什么刚才我自己代码中的父进程创建的子进程,父进程没有回收子进程呢?那是因为你的代码压根就没有写回收,所以你的子进程就没有回收

那我们怎么暂停呢,ctrl+c 只能干掉前台进程,

所以孤儿进程就要用到我们的杀进程:kill -9来暂停啦


文章手稿

相关文章:

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态

目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例&#xff0c;详细说明进程的各种状态、转换…...

MySQL添加外键约束经典案例

1DDL建表语句 需要一个emp员工表和一个dept部门表 CREATE TABLE emp (id int NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_0900_as_ci NOT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,job varchar(20) COLLATE utf8mb4_0900_as_ci DEFAULT NULL CO…...

vue3监听器watch以及watchEffect的使用

一&#xff0c;watch()简介&#xff1a; 侦听一个或多个响应式数据源&#xff0c;并在数据源变化时调用所给的回调函数 watch()默认是懒侦听的&#xff0c;即仅在侦听源发生变化时才执行回调函数。 watch()一共有三个参数 第一个参数&#xff1a;侦听器的源&#xff0c;可以为以…...

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件&#xff08;其他工具生成的网表文件类似&#xff09;&#xff0c;与modelsim联合进行门级仿真的样例&#xff0c;时序仿真与门级仿真的方法类似&#xff0c;只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…...

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表&#xff0c;或者所有分区表的所有分区&#xff0c;以便执行进一步的操作&#xff0c;比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…...

如何在 qmake(QtCreator)中指定 Mac 平台

在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…...

day39动态规划part02| 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96..不同的二叉搜索树 (可跳过)

**62.不同路径 ** 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流&#xff0c;很难想到。 题目讲解 | 视频讲解 class Solution { public:int uniquePaths(int m, int n) {// 确定数组及其下标的含义int dp[101][101] {0}; //到达i,j的点有多少条路径// 确定递推…...

声场合成新方法:基于声波传播的框架

声场合成是指在房间内的麦克风阵列上&#xff0c;根据来自房间内其他位置的声源信号&#xff0c;合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务&#xff0c;因为它是一种成本效益高的方法&#xff0c;用于数据生成以替代真实的数据收集&#xff0c;后…...

鸿蒙文件操作事前准备

13900001&#xff0c;沙箱13900002 首选授权 module授权配置 "requestPermissions": [{ "name": "ohos.permission.CAMERA",}, { "name": "ohos.permission.READ_MEDIA",}, { "name": "ohos.permission.WR…...

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化&#xff1a;ChatGPT在金融策略与算法交易中的实践》亮点内…...

C#面:C#属性能在接口中声明吗?

在C#中&#xff0c;接口是一种定义了一组方法、属性和事件的类型。在接口中&#xff0c;只能声明方法、属性和事件的签名&#xff0c;而不能包含字段、构造函数或实现代码。因此&#xff0c;C#属性不能直接在接口中声明。 然而&#xff0c;你可以在接口中定义属性的签名&#…...

区块链的历史和发展:从比特币到以太坊

想象一下&#xff0c;你住在一个小镇上&#xff0c;每个人都有一个大账本&#xff0c;记录着所有的交易。这个账本很神奇&#xff0c;每当有人买卖东西&#xff0c;大家都会在自己的账本上记一笔&#xff0c;确保每个人的账本都是一致的。这就是区块链的基本思想。而区块链的故…...

input()函数——输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入&#xff0c;将所有的输入按照字符串进行处理&#xff0c;并返回一个字符串&#xff0c;input()函数的…...

CST 时间格式减去八小时

问题&#xff1a; 查看服务器时间是正确的,但输出出来的时间&#xff0c;比此时多出来八个小时。这里直接把时间减去八个小时。 public static void main(String[] args) throws ParseException {// 设定原始时间格式try {SimpleDateFormat dateFormat new SimpleDateFormat(&…...

植物大战僵尸杂交版技巧大全(附下载攻略)

《植物大战僵尸杂交版》为策略游戏爱好者带来了全新的挑战和乐趣。如果你是新手玩家&#xff0c;可能会对游戏中的植物和僵尸感到困惑。以下是一些实用的技巧&#xff0c;帮助你快速掌握游戏并享受其中的乐趣。 技巧一&#xff1a;熟悉基本玩法 游戏的基本玩法与原版相似&…...

HTTPS 代理的优点和缺点是什么?

HTTPS代理的优点包括提供更好的安全性、支持验证、速度、匿名性、节省带宽。 安全性&#xff1a;HTTPS代理通过使用SSL/TLS协议对传输的数据进行加密&#xff0c;保护用户的数据传输安全&#xff0c;防止中间人攻击和窃听&#xff0c;确保数据的安全性。 速度&#xff1a;HTTPS…...

Mac安装多版本node

Mac下使用n模块去安装多个指定版本的Node.js&#xff0c;并使用命令随时切换。 node中的n模块是&#xff0c;node专门用来管理node版本的模块&#xff0c;可以进行node版本的切换&#xff0c;下载&#xff0c;安装。 1.安装n npm install -g n 2.查看版本 n --version 3.展…...

HTML静态网页成品作业(HTML+CSS)——动漫猪猪侠网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…...

【机器学习300问】125、什么是双向循环神经网络(BRNN)?什么是深度循环神经网络(DRNN)?

一、双向循环神经网络 &#xff08;1&#xff09;诞生背景 双向循环神经网络&#xff08;Bidirectional Recurrenct Neural Network, BRNN&#xff09;是在深度学习领域发展起来的一种特殊类型的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它诞生的背景是为了解决传…...

办公软件汇总

1、OCR 1.1 pearOCR pearOCR 是一个免费的免费在线文字提取OCR工具网站。PearOCR界面简洁&#xff0c;所有过程均在网页端完成,无需下载任何软件&#xff0c;点开即用。官方地址&#xff1a;https://pearocr.com/ 参考&#xff1a;9款文字识别&#xff08;OCR&#xff09;工具…...

Docker 搭建 MinIO 对象存储

Docker 搭建 MinIO 对象存储 一、MinIO MinIO 是一个高性能的对象存储服务器&#xff0c;用于构建云存储解决方案。MinIO 允许你存储非结构化数据&#xff08;如图片、视频、日志文件等&#xff09;以对象的形式。MinIO 提供简单的部署选项和易于使用的界面&#xff0c;允许你…...

主干网络篇 | YOLOv5/v7 更换骨干网络之 PP-LCNet | 轻量级CPU卷积神经网络

主干网络篇 | YOLOv5/v7 更换骨干网络之 PP-LCNet | 轻量级CPU卷积神经网络&#xff1a;中文详解 1. 简介 YOLOv5 和 YOLOv7 是目前主流的目标检测算法之一&#xff0c;具有速度快、精度高的特点。但 YOLOv5 和 YOLOv7 的原始模型结构中使用的是 MobileNetV3 作为骨干网络&am…...

CubeFS - 新一代云原生存储系统

CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。 官方文档 CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面…...

推动多模态智能模型发展:大型视觉语言模型综合多模态评测基准

随着人工智能技术的飞速发展&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在多模态应用领域取得了显著进展。然而&#xff0c;现有的多模态评估基准测试在跟踪LVLMs发展方面存在不足。为了填补这一空白&#xff0c;本文介绍了MMT-Bench&#xff0c;这是一个全面的…...

深度学习31-33

1.负采样方案 &#xff08;1&#xff09;为0是负样本&#xff0c;负样本是认为构造出来的。正样本是有上下文关系 负采样的target是1&#xff0c;说明output word 在input word之后。 2.简介与安装 &#xff08;1&#xff09;caffe:比较经常用于图像识别&#xff0c;有卷积网…...

Docker多种场景下设置代理

20240623 - 公司内网环境下需要对Docker进行代理设置&#xff1b;此时需要对拉取镜像的时候的命令设置代理&#xff1b;例如平时经常使用的wget设置代理一样。但对docker进行设置&#xff0c;并不能简单的直接export。 文章[1]指出&#xff0c;拉取镜像的时候实际执行的是doc…...

node 实现导出, 在导出excel中包含图片(附件)

如果想查看 node mySql 实现数据的导入导出&#xff0c;以及导入批量插入的sql语句&#xff0c;连接如下 node mySql 实现数据的导入导出&#xff0c;以及导入批量插入的sql语句-CSDN博客https://blog.csdn.net/snows_l/article/details/139998373 一、效果如图&#xff1a; 二…...

【ai】trition:tritonclient yolov4:ubuntu18.04部署python client成功

X:\05_trition_yolov4_clients\01-python server代码在115上,client本想在windows上, 【ai】trition:tritonclient.utils.shared_memory 仅支持linux 看起来要分离。 【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行 client代码远程部署在ubuntu18.0…...

oracle 主从库中,从库APPLIED为YES ,但是主库任然为NO

主库 从库 从库已经APPLIED但是主库为APPLIED&#xff0c; 主数据库和备用数据库之间的ARCH-RFS心跳Ping负责更新主数据库上v$archived_log的APPLICED列。 在主数据库上有一个指定的心跳ARCn进程来执行此Ping。如果此进程开始挂起&#xff0c;它将不再与远程RFS进程通信&#…...

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…...