关于进程状态

目录

进程的各种状态

运行状态

阻塞状态

挂起状态

linux中的进程状态、

进程状态查看

S状态(浅睡眠)

t 状态(追踪状态)

T状态(暂停状态)

​编辑

kill命令手册

D状态(深度睡眠)

Z状态(僵尸状态)

孤儿状态


我们知道cpu是通过一个调度队列来处理调度一个个进程的,一个cpu,一个调度队列!

一个个进程肯定有多种不同的状态,到底是执行完了还是没有,或者是一直执行某个语句不动的状态,所以我们现在详细讲讲。

进程的各种状态

运行状态

运行状态比较好理解,我们说只要进程在调度队列中就都是运行状态(running)。

为什么同一个节点可以在不同的数据结构中呢?怎么实现的?

 我们之前在学习数据结构的时候,同一个节点只能在一个数据结构中,而OS中却不是这样的,它可以在不同的数据结构中。

有了list_head,我们只需要管理list_head就能间接管理进程pcb。

我们可以在task_struct 中设计多个list_head结构体,这样多个数据结构容器只需要对各自的list_head结构体管理就能间接管理task_struct:

阻塞状态

阻塞状态:等待某种设备(键盘,显示器,网卡,磁盘,摄像头......)或者资源的就绪。

我们最常接触到的阻塞就是程序运行在scanf语句的时候,等待键盘的输入,说白了就是在等待键盘就绪,这时候进程从运行状态变为阻塞状态。

更深理解:

我们知道OS管理硬件也是和进程一样一个个结构体描述硬件,在每一个硬件中其实也有一个队列,叫等待队列。程序刚开始在运行的时候是运行状态,在执行到sacnf语句时,这个过程,进程pcb从调度队列链出,链入键盘的等待队列。此时进程就是阻塞状态。

当我们输入完毕,键盘就绪,OS判断等待队列是否为空,不为空将这个进程pcb就会重新链出等待队列,链入调度队列,变为运行状态。

设备管理:

挂起状态

磁盘中有一个swap交换分区(大小是内存的1.5倍或2倍等),当内存资源严重不足的情况下,OS将阻塞进程的代码和数据唤入swap交换分区,此时这些进程状态就叫阻塞挂起状态。当这些进程要被调度时,将这些进程的代码和数据再唤入内存中。有时甚至会将调度队列中的末尾进程唤入swap交换分区。

图:

linux中的进程状态、

进程状态查看

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

在linux内核中,linux状态和以上的状态有所不同,上面只是适合所有操作系统,但是不同操作系统之间还是有差别的。

在每个task_struct中都有一个变量记录一下进程的状态,上图是一个状态数组,而一般task_struct中的这个变量其实就是一个整数(每个不同的整数代表不同的状态)。

  • R ----运行状态
  • S ----浅睡眠状态(可中断睡眠状态)
  • D ----深睡眠状态(不可中断睡眠状态)
  • S和D其实都属阻塞状态
  • t ----追踪状态
  • T ----暂停状态
  • X ----死亡状态
  • Z----僵尸状态

我们看看具体概念:

  • R运⾏状态(running):并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏ 队列⾥。
  • S睡眠状态(sleeping):意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。
  • D磁盘休眠状态(Disksleep)有时候也叫不可中断睡眠状态(uninterruptiblesleep),在这个 状态的进程通常会等待IO的结束。
  • T停⽌状态(stopped):可以通过发送SIGSTOP信号给进程来停⽌(T)进程。这个被暂停的 进程可以通过发送SIGCONT信号让进程继续运⾏。
  • X死亡状态(dead):这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。

我们一个个来讲解!!!

S状态(浅睡眠)

我们可以换成后台输入运行,此时我们的命令行可以继续输入其他命令:

t 状态(追踪状态)

当一个程序被debug的时候,就是一个追踪状态。

T状态(暂停状态)

kill命令手册

kill有很多命令,我们可以查:

其中:

  • -9 :杀掉进程
  • -18:恢复进程
  • -19:暂停进程

D状态(深度睡眠)

首先为什么要有D状态呢?

看一个情景:

某个进程,要将100MB数据写入磁盘,此时进程状态是S状态(等待数据全部写入磁盘,写完之后会告诉进程成功与否(返回值实现)),如果此时内存空间严重不足,我们知道OS会将一些阻塞进程甚至调度队列末尾进程挂起,可是这样仍然不足呢?那么OS很有可能将这个写入磁盘进程杀掉,这个进程杀掉了,那这100MB数据怎么办?如果写入磁盘时,磁盘空间也不足,写入失败了,本来要返回告诉这个进程失败信息,但是此时进程被杀掉了,也就是说现在用户也不知道这100MB数据写入失败了,这100MB数据就丢失了!如果这100MB数据是某个银行转账一天的流水呢!

所有说才会有D状态进程,不可被OS杀掉,这样就算写入失败了,用户也知道失败了!

一般在高IO流的时候才会出现!

Z状态(僵尸状态)

只要是进程,那么它一定有父进程,而当子进程运行结束,子进程的相关信息是需要被父进程获取的,而我们知道进程的相关信息是在它的pcb的,也就是说子进程运行完,此时OS可以将它的代码和数据释放掉,但是pcb不能释放掉,父进程获取完子进程信息之后,子进程正式退出!

子进程运行完之后,父进程获取子进程相关信息,子进程正式退出之前,这就是僵尸状态!

看代码:

看现象:

如果父进程一直不管,一直不回收子进程的pcb,那么子进程一直都是僵尸状态,子进程的pcb一直就得不到释放,这会导致内存泄露。

那进程内存泄露了,进程退出了,内存泄露还存不存在?

不存在。

就像之前我们学习c语言的时候,一个main函数里面,死循环开辟内存,而不释放,就会内存泄漏,而当程序结束完(return 0后),OS就自行回收内存!

那什么样的进程害怕内存泄漏呢?

我们刚刚说的那个显然是不害怕内存泄漏的,一些常驻内存的进程就会害怕内存泄漏。

常驻内存的进程就是那些启动之后不退出的,一旦启动不退出的进程。

比如操作系统就是一个启动不退出的进程,如果操作系统内核代码出现了内存泄漏,就会越来越卡。

task_struct的节点是怎么申请和释放的?

在平常的使用当中,大部分都是多进程并发的,那肯定离不开一个个的pcb去不断申请和释放,但却不是我们常认识的那种申请和释放。

有一个unuse区域,专门存储那些要释放的task_struct节点,当我们要释放某个task_struct的时候,将这个节点放入unuse区域即可,当我们要申请一个新的节点的时候,我们只需要在unuse区域中拿即可!

孤儿状态

父子进程关系中,如果父进程先退出,子进程要被1号进程领养,这个子进程就叫作孤儿进程。

这1号进程其实就是操作系统!既然被1号进程领养自然要被1号进程回收!

看代码:

现象:

子进程被领养之后就变成后台进程了!

看看1号进程:

我们可以看到,这个1号进程是叫systemd(老版本叫init)进程,它其实也有一个0号进程,但我们一开机这个0号进程就被1号进程取代了,这个我们不详细谈。

为什么1号进程需要领养呢?

前面知道,子进程需要被父进程获取信息(回收),这个时候子进程是僵尸状态,但是此时子进程没有父进程了,那么这个子进程就会内存泄漏,所以需要被领养,最后统一回收!

好了,我们下期见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络编程】从零开始彻底了解网络编程(二)

本篇博客给大家带来的是网络编程的知识点,. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便进步 1. …

node.js|环境部署|源码编译高版本的node.js

一、 前言 本文就如何二进制部署和源码编译安装部署node.js环境做一个简单的介绍 node的版本大体是以18版本为界限,也就是说18版本之前对glibc版本没有要求,其后的版本都对glibc版本有要求,node的版本越高,glibc需要的版本也越…

系分架构论文《论高并发场景的架构设计和开发方法》

系统分析师论文范文系列 【摘要】 2022年8月,我司承接了某知名电商平台“秒杀系统架构优化”项目,我作为系统分析师主导了整体架构设计与技术选型工作。该平台在促销活动中面临瞬时流量超过50万QPS的挑战,原有架构存在数据库崩溃、服务响应延…

第33讲|遥感大模型在地学分类中的初探与实战

目录 🧠 一、什么是“遥感大模型”? 📚 二、遥感大模型在地学分类中的优势 📍三、案例:使用 Segment Anything Model (SAM) 进行遥感地物分割 📦 1. 安装与依赖配置(PyTorch) 🖼 2. 读取遥感图像(可用 Sentinel-2 伪彩色图) 🔧 3. SAM 模型载入 💡 …

C++智能指针的知识!

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,我是PingdiGuo_guo,今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…

嵌入式单片机通过ESP8266连接物联网实验

第一:通过手机APP远程监控和控制 ESP8266驱动RST低电平触发复位,平时需要跟EN一样分别接10k拉高到3.3V 如果是12E/F的话管脚比较多,GPIO15也要接个1K到地 烧录时GPIO要接地,正常工作时将其拉高或者悬空 主要使用串口通信,烧录固件也是通过串口,烧录时,启动烧录程序后…

笔试专题(十一)

文章目录 添加字符(暴力枚举)题解代码 城市群数量(dfs)题解代码 判断是不是平衡二叉树(递归)题解代码 最大子矩阵(二维前缀和)题解代码 小葱的01串 (固定区间大小的滑动窗…

Linux系统:进程终止的概念与相关接口函数(_exit,exit,atexit)

本节目标 理解进程终止的概念理解退出状态码的概念以及使用方法掌握_exit与exit函数的用法以及区别atexit函数注册终止时执行的函数相关宏 一、进程终止 进程终止(Process Termination)是指操作系统结束一个进程的执行,回收其占用的资源&a…

[苍穹外卖 | 项目日记] 第三天

前言 实现了新增菜品接口实现了菜品分页查询接口实现了删除菜品接口实现了根据id查询菜品接口实现了修改菜品接口 今日收获: 今日的这几个接口其实和之前写的对员工的操作是一样的,都是一整套Curd操作,所以今天在技术层面上并没有…

用 NLP + Streamlit,把问卷变成能说话的反馈

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

算法01-最小生成树prim算法

最小生成树prim算法 题源:代码随想录卡哥的题 链接:https://kamacoder.com/problempage.php?pid1053 时间:2025-04-18 难度:4⭐ 题目: 1. 题目描述: 在世界的某个区域,有一些分散的神秘岛屿&…

利用deepseek+Mermaid画流程图

你是一个产品经理,请绘制一个流程图,要求生成符合Mermaid语法的代码,要求如下: 用户下载文件、上传文件、删除文件的流程过程符合安全规范细节具体到每一步要做什么 graph LRclassDef startend fill:#F5EBFF,stroke:#BE8FED,str…