Linux操作系统从入门到实战(十九)进程状态

Linux操作系统从入门到实战(十九)进程状态

  • 前言
  • 一、什么是进程状态
  • 二、状态本质
  • 三、最核心的3种状态
    • 1. 就绪状态
    • 2. 运行状态
    • 3. 阻塞状态
  • 四、状态变化的核心
    • 1/两种资源如何影响状态?
  • 五、操作系统怎么管理这些状态?
  • 六、Linux里结构体与状态
  • 七、回顾:“父进程”和“子进程”
  • 八、僵尸进程
    • 1. 什么是僵尸进程?
    • 2. 僵尸进程是怎么产生的?
    • 3. 看个例子:30秒的僵尸进程
    • 4. 僵尸进程的危害
  • 九、孤儿进程
    • 1. 什么是孤儿进程?
    • 2. 孤儿进程会变成僵尸吗?
    • 3. 看个例子


前言

  • 上一篇博客里我们讲解了Linux里面怎么查看进程
  • 这篇博客我们开始讲解进程状态与僵尸和孤儿进程

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482


一、什么是进程状态

  • 前面我们讲过可以把“进程”理解成“正在运行的程序”(比如你打开的微信、浏览器,本质上都是一个或多个进程)。

而==“进程状态”==,就是这个“正在运行的程序”当前的“处境”——它现在是在干活?还是在等东西?还是准备好了就等机会干活?

简单说:进程状态就是用来描述“这个进程现在能干啥、接下来要干啥”的标记

二、状态本质

听起来好像很复杂,但其实在电脑(操作系统)内部,** 进程状态就是一个简单的数字 **

比如:操作系统可能用“0”表示“准备好了”,用“1”表示“正在干活”,用“2”表示“在等东西”。不同的操作系统数字可能不一样,但核心逻辑都差不多——用数字标记“进程当前的状态”。

三、最核心的3种状态

所有操作系统(不管是Windows、Linux还是手机系统),管理进程状态的逻辑都差不多,最核心的就3种状态:** 就绪状态、运行状态、阻塞状态 **。

在这里插入图片描述

我们可以用一个生活例子理解:把“进程”比作“去食堂打饭的同学”,“CPU(电脑的核心)”比作“打饭窗口”。

1. 就绪状态

比如你到了食堂,发现窗口正在有人打饭,你就站在队伍里等着——这时候你就是“就绪状态”。

对应到进程:

  • 进程已经把所有“准备工作”做好了(比如需要的内存、数据都齐了);
  • 就差“CPU(打饭窗口)”有空了,一旦CPU轮到它,它就能立刻开始干活。

2. 运行状态

当窗口空出来,轮到你打饭了——这时候你就是“运行状态”。

对应到进程:

  • 进程正在被CPU“处理”,比如正在执行代码(算数学题、处理文字等);
  • 只要CPU没“轮到下一个”,它就一直处于这个状态。

3. 阻塞状态

假设你打饭时发现没勺子,得先去旁边取勺子,这时候你就暂时离开队伍,等拿到勺子再回来排队——这时候你就是“阻塞状态”。

对应到进程:

  • 进程暂时没法用CPU干活,因为它在等“外设资源”(比如等键盘输入、等硬盘读写数据、等网络传输完成);
  • 必须等外设资源准备好了(比如你拿到勺子),它才会重新回到“就绪状态”(回到队伍),再等CPU来处理。

四、状态变化的核心

为什么进程会在这3种状态之间切换?本质是因为进程在“抢资源”,而资源只有两种

  1. ** CPU资源 **:就是“打饭窗口”,谁抢到谁就能“运行”;
  2. ** 外设资源 **:就是“勺子、餐盘”这类,比如键盘、鼠标、硬盘、网络等。

1/两种资源如何影响状态?

  • 如果你是“计算密集型”任务(比如跑复杂的数学公式、处理大数据):主要抢CPU资源,大部分时间要么在“运行”(用CPU),要么在“就绪”(等CPU)。
  • 如果你是“IO密集型”任务(比如用微信发消息、用浏览器下载文件):主要抢外设资源(发消息要等网络,下载要等硬盘),大部分时间可能在“阻塞”(等外设),偶尔回到“就绪”和“运行”。

五、操作系统怎么管理这些状态?

操作系统会给每个CPU建一个“调度队列”(就像食堂的队伍)

  • 所有“就绪状态”的进程,都会排在这个队列里,等着CPU来“叫号”;
  • 一旦CPU“叫到”某个进程,这个进程就从“就绪”变成“运行”;
  • 如果运行中的进程需要等外设(比如等你输入文字),就会离开队列,进入“阻塞”;等外设准备好了,再重新回到“就绪队列”排队。

六、Linux里结构体与状态

最后简单提一下Linux系统里的实现。

在Linux中,每个进程的信息(包括状态、占用的资源、位置等)都存在一个叫“PCB(进程控制块)”的结构体里(可以理解成“进程的身份证+档案”)

  • 结构体就像一个“抽屉”,里面有很多“小格子”(成员),每个格子存不同的信息(比如状态、内存地址等)。
  • 如果你知道某个“小格子”(比如状态这个数字)的地址,就能反推出整个“抽屉”(结构体)的起始地址(就像知道抽屉里某本书的位置,就能找到整个抽屉在哪)。
  • 想访问结构体里的信息(比如状态),直接用“结构体变量.成员名”就行(比如“进程档案.状态”)。

七、回顾:“父进程”和“子进程”

就像现实中父母会生孩子,一个进程(比如你打开的浏览器)也能“创建”新的进程(比如浏览器新开的标签页进程)。我们把“创建者”叫** 父进程 ,“被创建的”叫 子进程 **。

它们的关系就像:父进程“管”子进程,子进程干完活后,要告诉父进程“结果咋样”(比如“任务完成”或“出错了”)。

八、僵尸进程

1. 什么是僵尸进程?

简单说:子进程已经退出(“死了”),但父进程一直没“问”它“死之前干得咋样”,这时候子进程就变成了僵尸进程

用生活例子类比:
你(子进程)帮爸妈(父进程)做一件事,做完后你告诉爸妈“我完事了”,但爸妈一直在忙别的,没理你。这时候你虽然“任务结束”了,但还得等着爸妈回应,就像“僵尸”一样,没彻底“消失”。

2. 僵尸进程是怎么产生的?

子进程退出时,会留下一个“退出状态码”(比如“0”表示成功,“1”表示失败),这个码是给父进程看的。

  • 如果父进程及时用wait()(可以理解成“询问结果”)读取了这个码,子进程就会彻底消失;
  • 但如果父进程没读(比如父进程在睡觉、忙别的),子进程就会保持“僵尸状态(Z状态)”,留在系统的“进程表”里,等着父进程来“处理”。

3. 看个例子:30秒的僵尸进程

有一段代码(不用看懂细节,知道逻辑就行):

  • 父进程创建子进程后,自己睡30秒(期间不处理子进程);
  • 子进程创建后,只睡5秒就退出了。

这时候:

  • 子进程5秒后“死了”,留下退出状态码;
  • 父进程还在睡觉(30秒),没读这个码;
  • 所以子进程在这25秒(30-5)里,就成了僵尸进程,状态是Z。

4. 僵尸进程的危害

僵尸进程虽然“死了”,但它的“档案”(PCB,之前讲过的“进程身份证+信息表”)还在系统里存着——因为要保留“退出状态码”等信息,等着父进程来取。

问题来了:

  • 一个僵尸进程的PCB占一点内存,看起来不多;
  • 但如果父进程创建了很多子进程,还都不管(不读状态码),就会有一堆僵尸进程的PCB占内存,最后导致“内存泄漏”(内存被白白浪费,用不了)。

九、孤儿进程

1. 什么是孤儿进程?

和僵尸进程相反:** 父进程先退出(“死了”),但子进程还在运行,这时候子进程就成了孤儿进程 **。

生活例子类比:
爸妈(父进程)提前“离开”了,你(子进程)还没长大(还在运行),这时候你就成了“孤儿”。

2. 孤儿进程会变成僵尸吗?

不会。因为操作系统有“兜底机制”:
当父进程先死,子进程会被系统的“1号进程”(可以理解成“系统大管家”,比如Linux里的init进程)“领养”。

  • 1号进程会负责“接管”这个孤儿进程,等它退出后,及时读取它的退出状态码;
  • 所以孤儿进程退出后,不会变成僵尸,会被1号进程彻底“清理”掉。

3. 看个例子

一段代码逻辑:

  • 父进程创建子进程后,自己只睡3秒就退出了;
  • 子进程会睡10秒才退出(比父进程活得久)。

这时候:

  • 父进程3秒后“死了”,子进程还在运行,成了孤儿;
  • 系统的1号进程会“领养”这个孤儿;
  • 10秒后子进程退出,1号进程会及时读取它的状态码,子进程正常消失,不会变僵尸。
类型产生原因结果/危害系统处理方式
僵尸进程子进程先死,父进程没读它的退出码留在进程表,占内存,可能导致内存泄漏父进程用wait()读取状态码即可清除
孤儿进程父进程先死,子进程还在运行不会变僵尸,会被1号进程领养并正常回收1号进程接管,负责后续清理

以上就是这篇博客的全部内容,下一篇我们将继续探索Linux的更多精彩内容。

我的个人主页
欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918446.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器技术之docker

容器技术之Docker一、什么是Docker二、为什么会出现Docker2.1 环境一致性问题2.2 虚拟化技术的局限性2.3 微服务架构的兴起三、重要概念3.1 什么是镜像3.2 什么是容器3.3 总结:3.4 Docker仓库四、安装Docker(Ubuntu系统下)1.卸载老的版本2.更…

数据结构与算法:树状数组

前言 太难了…… 一、树状数组使用场景 树状数组一般用来维护可差分的信息,比如累加和,累乘积等。举个例子,当整个数组的累加和为sum1,一个区间内的累加和为sum2,那么除了这个区间剩下部分的累加和就是sum1-sum2&am…

“一车一码一池一充”:GB 17761-2024新国标下电动自行车的安全革命

2025年9月1日,电动自行车行业将迎来一场深刻变革。随着强制性国家标准GB 17761-2024《电动自行车安全技术规范》的全面实施,我国超3.5亿电动自行车用户的安全出行将获得全新的技术保障。在这场安全升级中,“一车一码一池一充”的全链条管控机…

QT聊天项目DAY18

1.文件传输1.1 客户端采用分块传输(20MB/块),以及MD5码校验并将读出的二进制数据采用Base64编码进行传输1.1.0 通信协议1.1.1 UI采用垂直布局,该布局大小为570 * 160,间隔全是0,UI方面不详细介绍了1.1.2 MainWindow头文件#ifndef …

centos系统sglang单节点本地部署大模型

前置工作 本地部署大模型的基本概念和前置工作-CSDN博客 模型部署 这里通过docker容器进行部署。我这里是h20*8,部署deepseek-v3-0324,这个配置和模型都比较大,大家根据自己的硬件对应调整 步骤一 我们要通过sglang部署模型,先拉取sglang的docker镜像,这里下载失败的…

【dij算法/最短路/分层图】P4568 [JLOI2011] 飞行路线

题目描述 Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在 nnn 个城市设有业务,设这些城市分别标记为 000 到 n−1n-1n−1,一共有 mmm 种航线,每种航线连接两个城市,并且航线有一定…

告别传统,CVPR三论文用GNN动态图重塑视觉AI

本文选自gongzhonghao【图灵学术SCI论文辅导】关注我们,掌握更多顶会顶刊发文资讯今天,为大家推荐一个极具前沿价值与实用潜力的研究方向:图神经网络(GNN)。作为深度学习领域的新兴力量,图神经网络在近年顶…

HTTP/HTTPS代理,支持RSA和SM2算法

在日常工作和学习中,我们经常遇到HTTP和HTTPS的相关问题,要解决这些问题,有时就需要搭建各种实验环境,重现业务场景,比如: 将HTTP转为HTTPS。本地只能发送HTTP请求,但是远程服务器却只能接收HT…

如何提高AI写作论文的查重率?推荐七个AI写作论文工具

随着AI技术在学术领域的广泛应用,越来越多的学生和研究人员开始使用AI写作工具来提高写作效率,帮助完成毕业论文、科研论文等。然而,AI生成的内容是否会提高论文的查重率?是否能有效避免重复和提高通过率?这些问题成为…

跨平台、低延迟、可嵌入:实时音视频技术在 AI 控制系统中的进化之路

引言:面向未来的实时音视频基座 在万物互联与智能化加速落地的时代,实时音视频技术早已不再只是社交娱乐的附属功能,而是智慧城市、应急指挥、远程操控、工业智造、教育培训、安防监控等系统的“神经中枢”。一条高性能、可控、低延迟的视频…

Spring WebFlux开发指导

Spring WebFlux是一个响应式的web服务器端应用开发框架,响应式是指,当前端组件的状态发生变化,则生成事件通知,根据需求可异步或者同步地向服务器端接口发送请求,当服务器端网络IO组件的状态发生变化,则生成…

09-docker镜像手动制作

文章目录一.手动制作单服务的nginx镜像1.启动一个基础容器,此处我使用的是centos7镜像。2.修改容器中的软件源3.安装nginx服务并启动nginx服务4.修复nginx的首页文件5.退出容器6.将退出的容器提交为镜像7.测试镜像的可用性二.手动制作多服务的nginx sshd镜像1.启用…

Android.mk教程

语法 Android.mk 的必备三行 LOCAL_PATH : $(call my-dir) # Android.mk的目录,call调用函数include $(CLEAR_VARS) # 除了LOCAL_PATH清除所有LOCAL_XXXinclude $(BUILD_SHARED_LIBRARY) # BUILD_XXX, 指定构建类型 # BUILD_SHARED_LIBRARY → .so动态库 # BUILD…

稠密检索:基于神经嵌入的高效语义搜索范式

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1. 背景与定义 稠密检索(Dense Retrieval)是一…

AI日报0807 | GPT-5或今晚1点来袭:四大版本全曝光

关注:未来世界2099每日分享:全球最新AI资讯【应用商业技术其他】服务:【学习Q】【资源Q】【学习资料】【行业报告】(无限免费下载)应用 1、讯飞星火代码画布震撼上线:动嘴就能开发,工作效率翻倍…

认识爬虫 —— 正则表达式提取

本质是对字符串的处理,正则表达式描述的是一种字符串匹配的模式。简而言之,用具备一定特征意义的表达式对字符串进行检查,将符合条件的子字符串提取出来。导入模块import re一、单字符匹配match(表达式,匹配对象):匹配…

单链表专题---暴力算法美学(1)(有视频演示)

1.1 移除链表元素 题目要求:给你一个链表的头节点head 和一个整数val,请你删除链表中所有满足Node.val val 的节点,并返回新的头节点。 思路一:遍历链表,遇到val就删除,pcur指向val的下一个节点,最后只剩…

机器学习-决策树(DecisionTree)

0 回归决策树展示 import pandas as pd import numpy as np from sklearn.tree import DecisionTreeRegressor from sklearn.metrics import root_mean_squared_error, r2_score from sklearn.model_selection import GridSearchCV,KFold from sklearn.model_selection import…

【Java Web】JDBC 连接 MySQL 实现数据库 CRUD(增删改查)详解

在 Java Web 开发中,与数据库交互是不可避免的,而 JDBC(Java Database Connectivity) 是 Java 官方提供的标准数据库连接接口,几乎所有 Java 项目中都用过它。 本文通过一个完整示例,带你从零实现 增&#…

HTTP 请求返回状态码和具体含义?200、400、403、404、502、503、504等

HTTP 状态码是服务器对客户端请求的响应状态标识,分为五大类(以第一位数字区分),常用状态码如下: 1. 信息类(1xx):请求已接收,继续处理 100 Continue:服务器已…