进程状态都有哪些?

news2025/1/21 21:55:57

目录

前言:

 进程的各个状态:

1、R状态(进程运行状态)和S状态(休眠状态)

2、T状态和t状态(暂停进程)

3、D状态(磁盘休眠状态)

4、Z状态(僵尸状态)

5、孤儿进程

总结:


前言:

        在上一章的学习中,我们是初步的聊了聊关于进程的相关话题,认识到了fork函数和系统调用接口的getpid函数。本章的重点就是来剖析每个状态对应的内容以及原理。

 进程的各个状态:

1、R状态(进程运行状态)和S状态(休眠状态)

        先看代码和结论,随后我们再进行讨论。

        面对以上代码我们需要打开“监视窗口”来查看当前进程的状态。
        输入指令:while :; do ps ajx | head -1 && ps ajx | grep process | grep -v grep; sleep 1; done

         此时当运行的时候,咱们得进程处于S状态,就是我们的休眠模式

        我们在这里将代码改一下,把printf去掉来看看结果:

        这个时候该进程的状态就是R状态了,也就是我们的进程运行状态

        这里难免会出现疑惑,为什么我只是把数据用printf打印出来,结果就是S状态,如果不printf打印出来,就是R状态,这有关系吗?
        其实这个问题的本质就是我们前两章讲解的“冯诺依曼体系”,此时代码已经被CPU执行好了,但是需要等待显示器准备就绪,这个等待显示器把数据打印到屏幕上的这个过程本质就是在等待中!因此是出于S休眠状态。

2、T状态和t状态(暂停进程)

        这里的T代表的是纯粹的暂停进程,而t代表当前进程因为被追踪而暂停,其中我们用gdb进行调试的时候本质就是在追踪调试,他们都是让进程暂停,等待进一步被唤醒。我们使用gdb调试的时候代码就是处于t状态的。

         在这里我们会发现t这里没有t+,因为咱们调试的时候算是暂停进程了,暂停之后变为后台进程,因此+号就不见了,遇到断点也就暂停了。

3、D状态(磁盘休眠状态)

        Linux系统中比较特有的一种状态,磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

        我们在这里需要了解一个前提,就是当遇到内存压力大而导致空间不足,Linux有权力杀掉进程来释放空间。
        所以为了防止内存中的进程在等待磁盘回馈的过程中因处于休眠等待过程中被操作系统误杀掉,所设置的“深度睡眠”状态。就比如当进程需要拷贝10GB的数据到磁盘中,该进程确实一直在处于休眠状态,但它也是在等待磁盘处理,你也总不能把它给误杀掉吧。
        因此咱们的D状态只能等待进程自己 醒来 /重启 /断电。

4、Z状态(僵尸状态)

        先看代码演示,我们再来分析结果。     

         这段代码是在讲什么呢?如果仔细看看这个代码,其实我们是让子进程运行完毕,父进程还在不断运行中。
        这里我们要补充一点,子进程运行完毕后,是要等待其父进程进行回收的!可是这时父进程并没有退出,而我子进程的代码和数据已经执行完毕了,所以内存会释放这些代码和数据,但是该子进程创建的task_struct(PCB)还存在。

        所以僵尸状态:已经运行完毕的进程,但需要维持自己的退出信息,在自己的进程task_struct会记录自己退出信息,未来让自己的父进程来进行读取回收。

 

        那么有过多的僵尸进程,难免会造成“内存泄漏”!并且还要注意的是,kill不可以杀掉僵尸进程!kill无法杀掉一个死掉的进程。 

        那我们已经启动的所有的进程,我们怎么从来关心过僵尸进程呢?内存泄漏也没有关心过?
      ——直接在命令行中启动的进程,它的父进程是bash,bash会自动回收新的进程的僵尸进程!

  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说, Z状态一直不退出, PCB一直都要维护?是的!
  • 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构
  • 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
      

5、孤儿进程

        我们在这里先讲概念再通过代码来演示。

        父进程如果先退出,子进程就会变成孤儿进程。孤儿集成一般都会被1号进程(OS本身)进行收养。


        其实代码和僵尸进程的代码差不多,只是将father进程开始了计数器并先让父进程先结束,而子进程一直持续运行中。不难看出来,当子进程的原父进程结束后,子进程便进入了孤儿进程,变为后台运行的进程,而且这个子进程的ppid也变为了1,就代表着该子进程被1后进程(OS本身)进行收养!为了保证子进程依然要被回收,所以由OS“领养”。 

 

总结:

        本章是主要介绍了进程状态的基础,这些进程状态还是需要下来多多理解理解,关于僵尸进程和孤儿进程为什么叫这个名字的,还需要下来写写代码画画图理解理解。下一章我们将介绍进程的阻塞,挂起和运行状态,会逐步分析我们在教材遇到的流程图!

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

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

相关文章

学习笔记 韩顺平 零基础30天学会Java(2024.8.2)

P447 五大运行时异常 P448 异常课堂练习 P449 异常处理机制 try-catch-finally throws(处理机制二选一),如果没有显式处理异常,默认throws JVM处理异常直接输出异常信息,退出程序 P450 tryCatch 对于第一个细节,发生异常之后时try…

C语言快速入门及精通学习指南——手把手教零基础/新手入门(完整C语言学习笔记整理)

前言 作为一名拥有多年开发经验的码农,我的职业生涯涵盖了多种编程语言,包括 C 语言、C、C# 和 JavaScript。在这一过程中,我深刻地意识到扎实的基础对于编程学习的重要性,尤其是对于 C 语言这样一门核心语言来说。 出于对…

sgg快餐项目-3 项目

一、数仓架构 本项目的数据是事务数据,都存储在mysql数据库,如果是其他的项目,那数据可能会在文本、爬虫等。要使用相关的组件将数据导入到HDFS上。(因为要把数据导入到hive做数据管理、存储和分析,而hive就是在hfds上…

2024年文件防泄密系统TOP3|遥遥领先的文件防泄密系统

古语有云:“密者,国之重器,不可不慎。” 在今日之数字化时代,信息的保密与安全,已然成为企业乃至国家生存与发展的基石。 随着数据泄露事件频发,文件防泄密系统的重要性愈发凸显。 2024年,随着…

数据存储与访问

一、文件存储读写 1.Android文件的操作模式 2.文件的相关操作方法 3.文件读写的实现 Android中的文件读写和Java中的文件I/O相同,流程也很简单,下面我们来写个简单的示例: PS:这里用的是模拟器,因为笔者的N5并没有root&#xf…

Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记

概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…

工业人工智能真的能落地吗?

文章目录 前言Part1 聊聊技术1 人工智能、机器学习和深度学习的关系2 优化思想的一个案例 part2 聊聊业务3 工业人工智能与消费互联网人工智能的区别3.1 消费互联网中人工智能的应用3.2 为什么如此成熟的消费互联网人工智能扩展到工业场景那么难 4 工业互联网人工智能的发展方向…

wxPython中wx.adv.DatePickerCtrl用法

wx.adv.DatePickerCtrl是一个日期选择组件,支持键盘手工录入日期和弹出日历窗口选择日期两种方式。 一、组件样式 wx.adv.DP_SPIN : 只允许键盘手工录入和组件右侧上下箭头调整日期。 wx.adv.DP_DROPDOWN : 只允许健盘手工录入和组件右侧打开…

CentOS7 编译ffmpeg wasm库

1. 安装 emscripten 1)克隆 emsdk git clone https://github.com/emscripten-core/emsdk.git 2)cd 到emsdk 3)安装,按照官网的步骤(Download and install — Emscripten 3.1.65-git (dev) documentation) 4)验证 注意:如果emcc -v 报错: 提示是python脚本错误,是因为…

Qt Modbus 寄存器读写实例

一.线圈状态寄存器读写 项目效果如下 1. 写单个寄存器 MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); int addrui->spinBoxwirte_addr->value();int dataui->spinBoxwirte_data->value();int ret modbus_write_bit(mb,addr,d…

【Qt】Qt日志信息处理

Qt日志信息处理 一、介绍二、相关函数的使用介绍1. qInstallMessageHandle2. QtMsgType3. QMessageLogContext 三、一个简单示例 一、介绍 Qt有Info、Debug、Warning、Critical、Fatal五种级别的调试信息。 Info: 提示信息qDebug:调试信息qWarning:警告…

目标检测——X光安检数据集

1. OPIXray数据集(2020) 2. HIXray数据集(2021) 3. SIXray数据集(2019) 4. CLCXray数据集(2022) 5. PIDray数据集(2021) 6. GDXray数据集(20…

C++-引用,inline,nullptr

一,引用 1.1引用的概念与定义 引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。 引用的使用方式如下: 类型& 引用别名 引用对象…

【带你入门生信】什么是生物信息学

生物信息学 生物信息学:利用应用数学、信息学、统计学和计算机科学,对生物学数据进行搜索(收集和筛选)、处理(编辑、整理、管理和显示)及分析(计算和模拟),提取生物信息…

一键生成原创文案,轻松成为文案高手的方法

当下时代,文案写作对于各个企业推广产品和服务显得隔外重要。优秀的文案能够吸引用户的注意力,激发购买欲望,从而为企业带来更多的销售机会。然而,对于许多人来说,撰写出一篇吸引人的原创文案可能并不容易。但是&#…

【C++】C++11之新的类功能与可变参数模板

目录 一、新的默认成员函数 二、新的关键字 2.1 default 2.2 detele 2.3 final和override 三、可变参数模板 3.1 定义 3.2 递归展开参数包 3.3 逗号表达式展开参数包 3.4 emplace_back 一、新的默认成员函数 在C11之前,默认成员函数只有六个,…

2024华数杯选题建议-建模思路-代码论文助攻

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024 华数杯的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,帮助你全面理解并掌握如何…

C:关于static 和 extern 关键字的介绍-学习笔记

目录 1、作用域与生命周期 1.1 作用域 1.2 生命周期 1.3 变量的作用域和生命周期之间的关系 2、static 和 extern 2.1 static 修饰局部变量: 2.2 static 修饰全局变量(包含extern的作用): 2.3 static修饰函数&#xff1a…

海思RTSP推流第二篇——海思平台和H264编码Demo

前言: 记得行内一个老师说过,基础不牢,地动山摇,对于海思的编码过程还是不是很熟悉所以回头把这个分析一遍。 海思平台: 官方手册:HiMPP IPC V2.0 媒体处理软件开发参考,里面有介绍海思IPC平台的…

polyfit曲线拟合

一、简介 polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接…