Linux下的进程状态和 僵尸/孤儿进程的区别

news2024/10/6 6:04:52

     

目录

Linux进程的各种状态的表示:

R状态的测验:

S状态的测验:

T状态的测验: 

这次讲解一个新指令:kill -l

t状态测验:追踪暂停

X状态:死亡状态

Z状态:僵尸状态

        进程一直处于僵尸状态的危害:

孤儿进程:

最后简单来说一说状态后面有+号的意思:


       在上一篇博客中,我介绍了宏观层面下普遍的操作系统对于进程多种状态的理解,有运行状态、阻塞状态、挂起状态,感兴趣的同学可以看看:操作系统层面下——进程状态讲解

而在Linux操作系统中,进程的状态又是怎样的呢?

Linux进程的各种状态的表示:

 从上图可知,Linux操作系统中公有7种类型的进程状态:

其中R状态是运行状态;

S是阻塞状态;

T是暂停状态(浅度睡眠),它其实也算是阻塞状态的一种分支;

D算是深度睡眠状态;

X是死亡状态;

Z是僵尸状态;

t是追踪暂停状态


R状态的测验:

 通过查看该进程的状态信息可知,它为R+,R从上面可知为运行状态,这里卖个关子,对于状态后面的加号,一会进行讲解。


S状态的测验:

该代码相比较于试验1的代码多了一个printf函数调用。 



 运行程序后:

        通过右图发现,该程序的状态变成了S+,从开头的状态表示可知,S状态是阻塞状态。为什么进程会变成阻塞状态呢?它不是运行的好好的吗?

        之前讲到进程转换成阻塞状态一定是因为该进程在被CPU执行的过程中,需要申请硬件资源,导致CPU终止了该进程的执行,操作系统将其调入硬件处理器的等待队列中等待着硬件资源的处理。

        这个例子也是如此,因为printf函数是需要将运算结果输出到显示屏的,它是关联到硬件的显示屏的,所以会申请硬件资源,程序运行虽然是一瞬间的事情,但在此运行中大部分时间都在使用硬件资源,那么该进程就会从运行状态转到阻塞状态。

T状态的测验: 

仍是与例二一样的代码。

运行该程序 :

这次讲解一个新指令:kill -l

功能:kill指令 可将指定的信号(singnal)送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。

共有60多种信号,各有各的作用去终止进程运行。

11290是该进程的Pid编号,想要终止一个进程,直接使用指令:kiil -[所选信号] [进程pid编号]。

根据ps ajx指令查看该进程的状态信息变成了T状态:

因为19号信号的作用是使得正在运行的进程暂停。

所以触发进程暂停为T状态的直接原因是对该进程使用SIGSTOP信号。



t状态测验:追踪暂停

例:

源代码:

 使用gcc编译器生成Debug版本可执行文件:

 

开始使用n或s指令开始调试已启动的程序:

通过监视器查看该进程状态信息: 

红色框中涉及了多条指令:

1.while : ;do [输入想要输入的指令]; done        :该指令作用是一直做死循环

2.ps ajx | head -1                                     :显示所有进程状态信息并且显示检测器的属性栏 

3.ps ajx | grep hahha                               :显示文件名为hahha进程的状态信息

4.grep -v grep                                           :反向查找不含有grep关键字的信息

5.sleep num                                              :休眠num秒种

       绿框内容表示:使用gdb调试器运行上面生成的可执行文件代码。在框里面看有一个进程在运行,即gdb hahha,它处于阻塞状态。

       当我开始给程序打上断点,并开始使用指令run后,进程状态检测器检查到hahha处于t状态,如上图橙色框中的内容,说明了该进程现在正在处于被追踪暂停状态。

        也就是说触发某个进程状态为t状态的只能是使用gdb调试器对该进程进行断点调试才行


X状态:死亡状态

        该状态表明了进程退出后的一种状态,我们在操作系统的进程状态监测中也无法看到,因为进程退出的一瞬间会从某个状态转换为Z状态,然后一瞬间就会被父进程给回收掉。


Z状态:僵尸状态

1.什么是僵尸进程?

        在Linux系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候次啊会结束运行,当子进程某个命令结束自己的生命时,其实它并没有真正的被销毁,内核操作系统只是释放了该进程所占有的所有资源(打开的文件,占用的内存等),,但是一定会保留该进程的PCB,因为PCB中的进程状态显示栏不能直接显示为死亡状态X,只有当父进程通过使用特定的函数将子进程的信息全部回收掉后,处理完后事,OS才会真正将子进程的所有信息全部释放掉。这样设计的目的主要是:父进程需要知道子进程到底什么时候才结束所定的一个闹钟,子进程一退出,父进程身旁的闹钟就会响,意味着它知道了子进程退出了,该去给子进程处理后事了。

        举个例子:小明早上六点起床去公园跑步,在他视野的前方,同样也有一个老人在跑步,这时老人突发心脏病倒在了地上,小明发现后快步跑到前方查看老人的情况,发现老人没了呼吸,赶紧拨打了110和120。等几分钟过后,警察和医生飞速奔来检查和救治老人,但抢救无效老人已经去世了。医生将老人送至医院后联系其家属进行后事处理,警察则在现场拉起了警戒线,收集老人死亡前后的所有原因和线索。而老人在突发心脏病离世到医生和警察为其处理的过程在Linux下就叫做僵尸状态。

        所以只要子进程退出,父进程还在运行,但是父进程一直没有回收子进程的资源和退出信息,那么子进程就一直处于僵尸状态。

例:

生成可执行文件,并允许: 

 通过ps ajx 指令循环查看父子进程状态:

由上图可知:蓝框为父进程,红框为子进程(此时子进程已经结束退出),父进程还未回收处理,子进程状态为Z装,且后面显示<defunct>。

        虽然mytest该进程的父进程还在执行,但其子进程已经成为僵尸进程了,且以终止状态出现在状态表中,可见defunct一一失效的意思,即子进程成为了失效的进程,虽然它仍在运行着,但是是行尸走肉,所以叫做僵尸,它只能默默等待着父进程结束退出,让父进程来回收自己,结束生命! 

进程一直处于僵尸状态的危害:

       进程的退出状态就会一直被维持下去,它要告诉父进程“你交给我的任务,我办的怎么怎么样了......"。如果父进程一直不读取,那么子进程就一直处于Z状态。

       维护退出状态本身就是用资源做维护,也属于进程的基本信息,保存在PCB中,换句话说,Z状态一直不退出,PCB一直就要维护。

       一个父进程创建了很多个子进程,若是它们都退出了父进程不回收,就会造成内存资源的浪费!即内存泄漏。

说完了僵尸进程,就不得不提一提孤儿进程了,造成孤儿进程的原因与造成僵尸进程的原因正好是的相反的。

孤儿进程:

 在上边将了子进程如果提前退出,该进程成为僵尸进程。

若是父进程先退出,子进程仍在运行,那么子进程就称之为”孤儿进程“。

父进程先退出的话,我们不需要输入特定的函数或者指令去回收父进程的退出信息,因为bash进程会自己做这些事情,不劳烦我们用户操心!

        bash进程上上篇博客提到过,bash是一切父进程的父亲——老祖宗,就连我们输入的指令都是由bash的子进程去执行的,所以父进程退出,它由bash去进行善后处理。

        此时,父进程被bash回收后,只剩下子进程一个人孤零零的在运行着程序,这时子进程的ppid会自动变成1(bash的pid编号默认就为1),也就相当于是bash进程代替了原来的父进程,给这个子进程当父亲。那操作系统为什么要这么干?

        如果bash不领养子进程,等到子进程退出的时候会成为僵尸进程,僵尸进程原本是父进程会进行回收处理,但父进程已经挂掉了,无人收尸便会造成内存泄漏,所以需要bash去领养!子进程退出后,就由bash对该进程进行回收,名正言顺。

例: 

针对父进程执行流采用exit命令退出,子进程仍处于while循环中执行代码。 

运行结果: 

 

最后简单来说一说状态后面有+号的意思:

        状态后面有+号表明该进程现在是前台运行方式,我们可以使用ctrl+c,ctrl+z,ctrl+\快捷键使其终止。

        而状态后面没有+号表明进程是后台运行方式,使用上面的快捷键无法使进程停止,只能使用kill -9强制终止!

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

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

相关文章

过孔焊盘~尺寸、间隙、通流能力

过孔焊盘 导通孔&#xff08;via&#xff09;焊盘尺寸 a) 外层焊盘环宽(A)要大于5mil&#xff0c;内层焊盘环宽(A)要大于8mil, 推荐导通孔孔径及焊盘尺寸如下&#xff1a; b) 推荐反焊盘大小尺寸≥过孔焊盘&#xff0b;20MIL。 走线与金属化孔间的最小间隙 推荐的走线距金属…

Roblox 不但不支持 Linux,还屏蔽了 Wine

导读据悉&#xff0c;Roblox 不但不支持 Linux&#xff0c;还屏蔽了 Wine。 Roblox 不但不支持 Linux&#xff0c;还屏蔽了 Wine 多人游戏 Roblox 没有 Linux 原生版本&#xff0c;但之前可以通过 Wine 在 Linux 上运行。不过其最新的反作弊软件专门屏蔽了 Wine 应用&#xff…

XuperChain共建守护者系列藏品震撼发行,最新合成玩法揭秘

5月30日上午10点&#xff0c;百度超级链重磅推出「XuperChain共建守护者系列」藏品。「XuperChain共建守护者徽章系列」自身具有权益&#xff0c;也可与共建徽章系列藏品合成新藏品&#xff0c;玩法多多、福利多多&#xff0c;等你探索&#xff01; 共建守护者系列共计20款藏品…

智能集成接口:I3 ISA-95 的应用

介绍 多年来&#xff0c;使用基于制造运营管理 &#xff08;MOM&#xff09; 的应用程序的制造 IT 顾问试图说服制造商这些类型的应用的高价值。实时 MOM 解决方案是唯一一组能够精确优化工厂日常运营的 IT 应用程序&#xff0c;可为其可用性流程带来可创造的价值&#xff0c;…

《操作系统》期末客观题梳理

《操作系统》复习&#xff08;1-9&#xff09; 文章目录 《操作系统》复习&#xff08;1-9&#xff09;Ⅰ知识点概念第一章操作系统导论第二章进程描述与控制第三章处理机调度死锁第四章进程同步第五章存储器管理第六章虚拟存储器第七章输入输出系统第八章文件管理第九章磁盘存…

探索无限可能:物联网技术的未来应用引领智能化时代

⭐ 物联网技术⭐ 物联网技术的应用⭐ 物联网发展和创新挑战 当我们回顾过去几十年的科技发展&#xff0c;不难发现物联网技术的崛起和蓬勃发展。物联网的概念已经成为当今科技领域的热门话题&#xff0c;它正在以惊人的速度渗透到我们的日常生活中。从智能家居到智能城市&#…

【C++】map容器

更明确的类型重命名规则using 在C语言中typedef将一个变量提升为一种类型&#xff1a; typedef int * p;//p是int*类型//int Array[10];//Array是一个可装10个int类型变量的数组。typedef int Array[10]&#xff1b;//Array是一个可装10个int类型变量的数组的类型//Array arr;…

[golang 微服务] 1.单体式架构以及微服务架构介绍

一.单体架构 在了解微服务之前首先看看单体架构,单体架构在 中小企业内部用的是非常多的&#xff0c;当 业务不复杂&#xff0c; 团队规模不大的时候&#xff0c;单体架构比微服务架构具有 更高的生产率,比如2017年前的淘宝都是单体架构 单体架构的程序部署在单台服务器 这种架…

计算机网络考试多选题汇总Ⅱ

https://cadyin.blog.csdn.nethttps://blog.csdn.net/qq_38639612?spm1010.2135.3001.5421 计算机网络考试多选题汇总 1、在Windows中&#xff0c;任务管理器的作用是() A&#xff0e;终止未响应的应用程序 B&#xff0e;终止进程的运行 C&#xff0e;查看系统当前的信息 …

Springboot服务端接口公网远程调试,并实现HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Hybrid Shuffle 测试分析和使用建议

摘要&#xff1a;Apache Flink 社区在 1.16 版本引入了 Hybrid Shuffle Mode [1]&#xff0c;它是传统的 Batch Shuffle 和 Pipelined Shuffle 的结合&#xff0c;让 Flink 批处理具备了更强大的能力。Hybrid Shuffle 的核心思想是打破调度约束&#xff0c;根据可用资源的情况来…

vue 获取url地址的参数

url是一个 URL地址&#xff0c;我们在使用 vue的时候&#xff0c;经常需要获取 url的参数&#xff0c;获取方法有很多种&#xff0c;这里我只介绍一种获取 url参数的方法&#xff0c;那就是使用 Requests. urlset. newContext &#xff08;&#xff09;方法。 这个方法就是调用…

华为OD机试真题B卷 Java 实现【内存资源分配】

一、题目描述 有一个简易内存池&#xff0c;内存按照大小粒度分类&#xff0c;每个粒度有若干个可用内存资源&#xff0c;用户会进行一系列内存申请&#xff0c;需要按需分配内存池中的资源&#xff0c;返回申请结果成功失败列表。 分配规则如下&#xff1a; 分配的内存要大…

论文浅尝 | 大规模知识图谱中的知识图谱补全和多跳推理

笔记整理&#xff1a;刘健宇&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱规则学习与推理 链接&#xff1a;https://dl.acm.org/doi/abs/10.1145/3534678.3539405 动机 知识图谱(KG) 以头-关系-尾三元组的形式捕获知识&#xff0c;是许多人工智能系统中的重要组成部…

chatgpt赋能python:Python文件另存为教程:让文件保存到你想要的地方

Python 文件另存为教程&#xff1a;让文件保存到你想要的地方 最近&#xff0c;我看到有人在问如何使用Python来另存文件。对于许多初学者或非技术人员来说&#xff0c;这可能看起来很困难&#xff0c;但实际上&#xff0c;Python 提供了一些非常简单的方法来达到这一目的。下…

产品发布+联合演讲+认证+奖项丨云和恩墨在openGauss Developer Day 2023主论坛大放异彩...

openGauss Developer Day 2023 5月26日&#xff0c;一场数据库开发者年度盛会「openGauss Developer Day 2023」在北京昆泰嘉瑞文化中心成功召开。大会汇聚产学研用各界知名专家分享 openGauss 社区的技术创新、优秀实践和生态成果&#xff0c;吸引了线上线下数千名开发者、技术…

大手笔!微软一口气发布了 3 款开发者工具。。

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 昨天我发了一篇 Build 大会相关的生产力产品&#xff0c;介绍了未来 Windows 将集成的一系列 AI 特性&#xff0c;以及如何帮助人们更好的利用 AI&#xff0c;辅助完成各类繁琐的工作。 今…

Go1.21 速览:正式结束对 macOS 10.13 和 10.14 的支持

大家好&#xff0c;我是煎鱼。 根据 Go 语言的版本发布规律&#xff0c;一般是 2 月份和 8 月份各会发布一个新的版本。当前是 Go1.20。也就是在 8 月份会发布 Go1.21 这一个新版本。 在这个新版本&#xff0c;将会正式的结束对 macOS 10.13 和 10.14 的支持&#xff0c;并禁用…

27 VueComponent 计算属性的实现

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 用例如下, 我们这里核心关注 counterPlus100 这个计算变量 问…

JavaScript键盘事件

目录 一、keydown&#xff1a;按下键盘上的任意键时触发。 二、keyup&#xff1a;释放键盘上的任意键时触发。 三、keypress&#xff1a;在按下并释放能够产生字符的键时触发&#xff08;不包括功能键等&#xff09;。 四、input&#xff1a;在文本输入框或可编辑元素的内容…