【Linux系统化学习】进程的状态 | 僵尸进程 | 孤儿进程
=========================================================================
个人主页点击直达:小白不是程序媛
Linux专栏:Linux系统化学习
=========================================================================
目录
操作系统进程的状态
运行状态
阻塞状态
进程阻塞的现象
挂起阻塞状态
Linux进程状态
Linux内核源代码怎么说
R(running状态)运行状态
S(sleeping)休眠状态
D(desk sleep)磁盘休眠
T(stopped)
t(tracing stop)
x(dead)
僵尸进程(zombie)
僵尸进程的危害
孤儿进程
前台进程和后台进程
操作系统进程的状态 
进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命状态。
一个可执行程序加载到内存中,操作系统会创建一个PCB里面存放着各种属性、PID、PPID等;进程的状态也就是一个字段/变量在PCB中,不同的值代表不同的状态。
操作系统进程的主要状态包括,运行状态、阻塞状态、挂起阻塞状态;
运行状态
当我们的可执行程序加载到内存中,需要CPU进行数据运算时会从内存调度到CPU中;当然CPU的处理数据的能力是有限的,而当有很多的程序被调度时候,会将每个可执行程序的PCB使用链表建模依次等待CPU的调度;也就是我们之前提到的进程在”排队“;因此只要在CPU运行的队列中的进程,都是运行状态。
阻塞状态
我们自己编写的可执行程序难免会对系统中的资源进行访问,像我们需要使用输入函数cin/scanf从键盘输入一些数据时候就是可执行程序从键盘中读取数据;那么我们一直不输入数据,键盘中的数据就一直没有准备就绪,也就是进程访问的资源没有就绪,那么后序的代码就执行不了了。
当然我们的操作系统此时可不止这一个进程需要对系统中某个设备的资源进行访问,这就有需要一个队列建模需要访问资源的进程的PCB,此时这个队列就不再等待CPU调度的队列中了;因此我们把进程PCB链入非CPU的运行队列而把PCB链入到各种设备所维护的等待队列当中去等待资源就绪时的状态叫做阻塞状态。
- 进程的PCB从CPU调度的等待队列中转移到各种设备的等待队列中叫做该进程阻塞了。
- 当从设备中拿到数据是PCB会从设备的等待队列转移到CPU的调度队列这个过程叫做将该进程唤醒。
进程阻塞的现象
- 进程卡住了
- PCB不在运行状态中&&状态不是running,进程不在被CPU调度
挂起阻塞状态
挂起阻塞状态时阻塞状态的一种特殊情况,当我们的PCB在阻塞状态时操作系统的内存严重不足时,会将次PCB对应加载到内存中的程序移出内存放回磁盘,当PCB读取到数据时需要被CPU调度时又将程序加载到内存中。
总结
进程状态变化的本质:
- 更改PCB中status的整数变量
- 将PCB链入不同的队列中
- 只和进程的PCB有关,和进程的代码数据无关。
Linux进程状态
Linux内核源代码怎么说
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
下面的状态在kernel源代码里定义:
/*
* 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 */
};
1 #include<stdio.h>2 int main()3 {4 while(1)5 {6 printf("我是一个进程\n"); 7 }8 return 0;9 }

因为我们的进程在疯狂的printf时,本质是往显示器上面打印,进程是在内存中是将内存中的数据向外刷新;当刷新时,显示器不一定准备好,因此在程序运行中大部分是S状态。
R(running状态)运行状态
1 #include<stdio.h>2 int main()3 {4 while(1)5 {6 // printf("我是一个进程\n"); 7 } 8 return 0; 9 }

这样我们就可以查到R状态的进程了;
S(sleeping)休眠状态
浅度睡眠
1 #include<stdio.h>2 #include<unistd.h>3 int main()4 5 {6 int a=0;7 printf("请输入一个数字:");8 scanf("%d",&a);9 printf("%d\n",a); 10 11 return 0;12 }

浅度休眠状态可以被终止,可以被kill掉;并且会对外部状态做出相应。
D(desk sleep)磁盘休眠
深度睡眠
- 针对磁盘来设计的,不可能被kill掉,操作系统也不可以;
- 我们很难查到D状态,如果被用户查到计算机几乎快要宕机了。
T(stopped)
暂停一个进程。
t(tracing stop)
适用于我们debug模式下调试代码追踪我们的进程暂停下来。
等待软件条件。

x(dead)
这个状态只是一个返回状态,不会查看到这个进程的。
僵尸进程(zombie)
z(zombie)
可执行程序加载到内存中成为进程,操作系统创建PCB,内存里的进程肯定是完成某种任务得到某种结果的;当进程退出时总要返回一些信息告诉操作系统任务完成的怎样;就像我们写的代码总要在最后一行return 0;退出信息会由操作系统写入到PCB中,此时内存中进程的代码和数据被释放,但是不允许PCB释放;需要操作系统读取PCB进程的退出信息,得知进程退出的原因后PCB才会被释放。因此当进程被释放后而PCB没有被释放的这段空窗期成为僵尸进程。
- 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
- 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
- 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
僵尸状态演示
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main()5 {6 pid_t id =fork();7 if(id<0)8 {9 return 1;10 }11 else if(id==0)12 {13 int n=5;14 while(n)15 {16 printf("我是一个子进程:%d\n",n--);17 sleep(1);18 }19 exit(2); 20 }21 else{22 while(1)23 {24 printf("我是父进程\n");25 sleep(1);26 }27 }28 return 0;29 }
僵尸进程的危害
- 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
- 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
- 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
- 内存泄漏!!!
孤儿进程
- 孤儿进程和僵尸进程刚好相反,父进程先退出,子进程称之为”孤儿进程“。
- 孤儿进程会被系统进程”领养”,最中由init进程回收,init进程为我们所有进程的起源。
孤儿进程演示
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main()5 {6 pid_t id =fork();7 if(id<0)8 {9 return 1;10 }11 else if(id==0)12 {13 while(1)14 {15 printf("我是一个子进程\n");16 sleep(1); 17 }18 }19 else{20 int n=5;21 while(n)22 {23 printf("我是一个父进程:%d\n",n--);24 sleep(1);25 }26 exit(2);27 }28 return 0;29 }

前台进程和后台进程 
当我们运行我们编译好的代码后无论输入任何指令系统都不会有任何反应,但是可以通过Ctrl+C来终止 。并且状态带有+ ,这就是前台状态。


在编译好的代码后加上&操作符进行执行,代码不仅可以执行而且输入的指令也可以识别,但是不可以使用CTRL+C终止掉,这就是后台状态。
今天对Linux下进程的状态的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法。您三连的支持就是我前进的动力,感谢大家的支持!!!
相关文章:
【Linux系统化学习】进程的状态 | 僵尸进程 | 孤儿进程
个人主页点击直达:小白不是程序媛 Linux专栏:Linux系统化学习 目录 操作系统进程的状态 运行状态 阻塞状态 进程阻塞的现象 挂起阻塞状态 Linux进程状态 Linux内核源代码怎么说 R(running状态)运行状态 S(sl…...
深信服AC流量管理技术
拓扑图 一.保证通道针对修仙部,访问网站,邮件,DNS,IM,办工 OA,微博论坛网上银行等常见应用保证带宽最低 50%,最高 100% 1. 先新建线路带宽 2.新增流量管理通道(保证关键应用&#x…...
二元关系及关系代数中的象集、除运算
二元关系及关系代数中的象集、除运算 数学上,二元关系用于讨论两个数学对象的联系。诸如算术中的「大于」及「等于」,几何学中的"相似",或集合论中的"为...之元素"或"为...之子集"。二元关系有时会简称关系&a…...
[PHP]关联和操作MySQL数据库然后将数据库部署到ECS
在Mac电脑上使用VS Code进行PHP开发并关联操作MySQL数据库,然后将数据库部署到ECS。 1.安装PHP和MySQL 确保你的Mac上已经安装了PHP和MySQL。你可以使用Homebrew来安装它们: $ brew install php $ brew install mysql 安装mysql完成后记住这一句: …...
23.11.19日总结
经过昨天的中期答辩,其实可以看出来项目进度太慢了,现在是第十周,预计第十四周是终级答辩,在这段时间要把项目写完。 前端要加上一个未登录的拦截器,后端加上全局的异常处理。对于饿了么项目的商品建表,之前…...
系列一、JVM概述
一、概述 1.1、Java发展中的重大事件 1.2、虚拟机 vs Java虚拟机 1.2.1、虚拟机 1.2.2、Java虚拟机 1.2.3、Java虚拟机的作用 Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令指令。每一条Java指令&#…...
milvus数据管理-压缩数据
Milvus 默认支持自动数据压缩。您可以 配置 Milvus 以启用或禁用 压缩 和自动压缩。 如果自动压缩被禁用,您仍然可以手动压缩数据。 1.手动压缩数据 压缩请求是异步处理的,因为它们通常需要花费很长时间。 from pymilvus import Collection collection…...
SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)
最近找个springboot脚手架重新熟悉一下springboot相关框架的东西,结果发现好像项目还不能直接像数据库GUI工具一样填几个SSH参数就可以了,于是就给他再整一下看看如何解决 linux开放3306(可修改)端口直接访问 此方法较为方便&am…...
【Rust】快速教程——闭包与生命周期
前言 你怎么向天生的瞎子说清颜色?怎么用手势向天生的聋子描述声音? 鲜花就在眼前,雷鸣就在头顶,对他们来说却都毫无意义 眼睛看不到,鼻子可以嗅闻花香,耳朵听不见,手指可以触碰窗纸的震动。 犯…...
redis高级案列case
案列一 双写一致性 案例二 双锁策略 package com.redis.redis01.service;import com.redis.redis01.bean.RedisBs; import com.redis.redis01.mapper.RedisBsMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; imp…...
Vue3+Vite实现工程化,attribute属性渲染v-bind指令
想要渲染一个元素的attribute,应该使用v-bind指令 由于插值表达式不能直接放在标签的属性中,所有要渲染元素的属性就应该使用v-bindv-bind可以用于渲染任何元素的属性,语法为 v-bind:属性名数据名,可以简写为 :属性名数据名 <…...
下一代搜索引擎会什么?
现在是北京时间2023年11月18日。聊一聊搜索。 说到搜索,大家首先想到的肯定是谷歌,百度。我把这些定义成上一个时代的搜索引擎。ChatGPT已经火热了有一年的时间了,大家都认为Ai搜索是下一代的搜索。但是AI搜索,需要的是很大算力&a…...
WPF中如何在MVVM模式下关闭窗口
完全来源于十月的寒流,感谢大佬讲解 使用Behaviors <Window x:Class"Test_03.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:b"http://schemas.microsoft.com/xaml/behaviors"xmlns:x&quo…...
【数据结构&C++】二叉平衡搜索树-AVL树(25)
前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.AVL树的概念二.AVL树节点的定义(代码…...
Python算法——树的最大深度和最小深度
Python中的树的最大深度和最小深度算法详解 树的最大深度和最小深度是树结构中的两个关键指标,它们分别表示树的从根节点到最深叶子节点的最大路径长度和最小路径长度。在本文中,我们将深入讨论如何计算树的最大深度和最小深度,并提供Python…...
46.全排列-py
46.全排列 class Solution(object):def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""# 结果数组0ans[]nlen(nums)# 判断是否使用state_[False]*n# 临时状态数组dp_[]def dfs (index):# 终止条件if indexn:ans.appe…...
系列三、GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈
一、关系 GC算法(引用计数法、复制算法、标记清除算法、标记整理算法)是方法论,垃圾收集器是算法的落地实现。 二、4种主要垃圾收集器 4.1、串行垃圾收集器(Serial) 它为单线程环境设计,并且只使用一个线程…...
WPF中的虚拟化是什么
WPF(Windows Presentation Foundation)中的虚拟化是一种性能优化技术,它主要用于提高大量数据展示的效率。在WPF中,如果你有一个包含大量项的ItemsControl(例如ListBox、ListView或DataGrid等),…...
免费稳定几乎无门槛,我的ChartGPT助手免费分享给你
公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 ChatGPT想必大家应该都不陌生了,大部分人或多或少都接触了,好多应该都是通过openAi的官方进行使用的,这个门槛对大部分人有点高,…...
奇瑞金融:汽车金融行业架构设计
拆借联合贷款abs...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
