Linux进程的管理和进程的状态

 

进程的基本概念:

程序的一个执行实例 ,正在执行的程序等等 ——— 课本概念
担当分配系统资源的实体,例如cpu时间,内存 -----内核的观点

一、进程的管理

 

processbar 存储在磁盘中的可执行文件   可执行文件在启动/运行的同时,会将 往 内存中加载 / 传输 代码和数据,这一段代码和数据是代表进程的代码和数据,但并不是进程,至少进程对应的数据和代码

于此同时,为了调用和管理进程,cpu会使用一种名叫PCB的结构体,通过该结构体内部的内存指针,指向内存,顺着内存找到可执行文件传输入内存中的进程相对数据和代码

PCB结构体在内存的内的排列方式类似与数据结构中的链表,因此cpu对进程的调用和管理就变成了对多个PCB结构体组成的链表的增删查改

 为什么要有PCB呢?(OS是操作系统、PCB又叫进度控制块)
  • PCB是OS中最重要的记录型数据结构,它扮演着记录进程信息、描述进程状态以及控制进程运行的关键角色。 PCB中记录了OS所需的、用于描述进程情况及控制进程运行所需的全部信息。
  • 同时PCB是为了让OS方便对进程进行管理

因此,便可以得出一个结论,进程 = PCB + 可执行程序的代码 + 可执行程序的数据

  • 同时,结构体PCB 在LInux 内部的具体名称叫做 task_struct 结构体,在这个结构体的内部存储的是Liux进程控制块,用来帮助用户对进程进行调控
  • 而,对进程的调控,本质就是在对Linux进程控制块在内存中进行排队,就是让结构体task_struct在内存中进行排队
 如何理解进程的动态运行?

 

根据内存中PCB结构体的数据结构,可以得到只要我们的进程结构体PCB(task_struct)在不同的队列中进行运行,就可以得到和访问不同的资源!这需要对进程控制块进行调度运行。

./XXXX 在Linux中,该代码就是启动或者运行可执行程序,它的本质是让系统创建进程并且运行进程!同时,在linux中的大部分可执行操作和命令,它们的本质也是运行进程!

 进程的pid属性

pid,进程id,  pid是一种进度标识,在由于内存的内部有多个PCB结构体/进程控制块,为了区分这些进度块,从而衍生出pid,是每一个进程都有的唯一标识。

同时,和pid 相对因的是ppid 也就是父进程,每一个进程都是由父进程创建的,子进程可以继承父进程的代码,而父进程的代码和数据一般来自于磁盘、

在Linux中,可以创建C语言文件,使用函数getpid()和函数getppid()获取当前进程的pid和ppid

 

进程的创建

进程可以通过fork()函数,进行创建,同时之后的新进程就由fork()创造的进程产生,是它的子进程,而子进程和父进程的代码共享,但是数据分别独立,这也表明了进程的特点,独立性!

 

查看进程:

使用ps aux或者ps ajx 进行所有进程的查看,使用| grep 关键字   查找需要查看的进程,因为grep本身也会产生包含关键字的进程,使用| grep -v grep进行屏蔽操作!

查看进程信息使用 /proc , 如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹

以下代码是查看所有进程的信息

Linux的进程状态:

S状态: 

 S是休眠状态!S状态验证如下:

printf是在显示器上打印东西,而根据冯诺依曼体系,prinftf是先往cpu和内存打印东西,但是cpu的处理的速度比屏幕显示代码以及内部的传输到cpu的速度要快,所以cpu大部分时间都在等待数据的输入,并没有都在运行,而且运行的熟读极快造成了速度差,所以被判断是休眠状态

所以会造成代码刷屏时,会处于休眠状态,其实休眠状态就是cpu处于等待状态,也可以说,休眠状态就是进程在等待资源的就绪

同时休眠状态也叫做可中断状态,可以通过ctrl+c进行中断!

最后如上面代码中的休眠状态 S + 中的+表示在前台运行, 可以在启动可执行文件时使用 &把进程移到后台运行

 同时如果进程在后台运行,那么并不能使用ctrl +c 对进程进行中断,需要使用  kill-9 进程的pid  对进程进行中断

R状态:

R状态验证如下:R表示是进程运行的状态!

T状态和t状态:

T 和 t 状态,都是让进程处于暂停的状态!而且暂停都是外部使用指令对进程进行暂停

暂停也叫做等待被进一步唤醒!

验证:

使用另一个进程控制目标进程!

 使用   kill - l 代码 查看进程信号  只需要知道前31个即可  这些进程型号都是和宏一样

其中 使用 kill -19  进程的pid 进行进程的暂停:

还可以使用 kill -18 进程的pid  让进程继续运行!

同时进程的暂停也可以使用调式中的打断点进行暂停,也就打断点就是通过暂停实现的! 

而断点的暂停其实就是t,t表示当前的进程遇到了断点处 被暂停了!

D状态: 

D状态是Linux系统中比较特有的一种状态,是对磁盘的一种特殊的状态! disk sleep disk是磁盘的意思

验证举例:

当我们讲进程的一部分数据传输到磁盘中,这个过程根据冯诺依曼体系可以变为,是把对应的数据传给外设的过程

而当进程把数据传给磁盘进行数据存储的过程中,进程会进入一种状态,这个状态就是休眠状态,

此时的进程在等待数据完全传入磁盘中

当内存不足时,Linux有权利杀死进程,释放空间!当然这个的前提条件是内存严重不足,系统压力非常大!

而当内存严重不足且 进程进行数据传输至磁盘是,磁盘会写入失败,数据会丢失,因为进程没了! 

所以为了防止,操作系统删除 这种 在传输数据的进程,就出现了一个新的状态 D状态,D状态表示在传输数据,不可被操作系统杀死,D状态又叫做深度睡眠,不可中断睡眠

僵尸状态:

一个Linux的进程退出的时候,进程的退出,进程的退出是要将自己的信息保留在属于它的PCB当中,如果没有人读取它的PCB中的进程消息,那么该进程内部的内容就一直不释放。

进程的退出一般是将它的代码和数据进行释放,而它的PCB内容和数据结构则不会释放

直到将来对进程等待,如果不等待进程,那么进程就会变成僵尸状态,如果读取了等待了,那么进程则会将它的内容也就说PCB的数据结构进行释放

进程在退出后会处于僵尸状态,需要父进程进行回收,如果不回收那么进程就一直会处于僵尸状态

验证:

 

创建子进程,子进程循环五次就退出

而else内部是父进程,这里证明了父进程一直什么都没做,当子进程退出后会一直进入僵尸状态!等待被回收!

之后子进程进入了僵尸状态,并且出现了defuct 这个是表示僵尸进程的标志之一

僵尸进程表示的是一斤运行完毕,但是要维持自己的退出星系,在自己的进程PCB中会记录自己的退出信息,让未来的父进程进行读取

如果不让父进程进行读取,那么僵尸进程会一直存在!

因为进程已经运行完毕,但是进程 = 内核数据结构PCB + 进程的代码 + 进程的数据

而当僵尸进程一直存在,那么会占用一定的内存空间,要是不释放会一直存在,这种可能会造成内存泄露问题!

而且如果我们释放PCB也就释放僵尸进程,释放是由操作系统操作的,而读取PCB内部数据是由父进程进行的

同时我们可以使用waitpid命令进行释放,当僵尸进程被释放后,该进程的状态就会变成X状态!也就是进程死亡!

为什么进程要等待,因为我们要读取进程的信息!

孤儿状态: 

就是该进程在运行期间,这个进程的父进程先退出了,那么这个进程就是孤儿进程!

在这个代码中,fork建立子进程,让子进程一直运行,同时让父进程率先结束!

可以看到父进程ppid变成了1

同时我们需要注意,之前的僵尸进程中,父进程是需要读取变成僵尸进程的子进程内部的内容

但是这里父进程先退了,那子进程之后变成僵尸进程后该怎么办呢?

就在这时我们就可以看到上面信息中dppid父进程变成了1,也就是说子进程之后退出后的信息由1号进程进行回收!

一号进程可以表示为OS也就说操作系统本身!

那孤儿进程为什么要被1号进程回收?因为我们要保证子进程正常的被回收!

为什么不需要关注僵尸进程和内存泄露嗯?或者说,为什么为什么我们启动了所有的进程(inux的命令也是进程),但是我们不关注僵尸进程和内存泄露呢?

因为会有bash进行回收新进程的PCB 


 

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

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

相关文章

阿里云安全产品简介,Web应用防火墙与云防火墙产品各自作用介绍

在阿里云的安全类云产品中,Web应用防火墙与云防火墙是用户比较关注的安全类云产品,二则在作用上并不是完全一样的,Web应用防火墙是一款网站Web应用安全的防护产品,云防火墙是一款公共云环境下的SaaS化防火墙,本文为大家…

政安晨:【Keras机器学习实践要点】(四)—— 顺序模型

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 介绍 Keras是一个用于构建和训练深度学习模…

MySQL数据库高级语句(一)

文章目录 MySQL高级语句older by 排序区间判断查询或与且(or 与and)嵌套查询(多条件)查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符 结语 MySQL高级语句 1构建测试用表 create table test1 (id int prima…

湖北汽车工业学院 实验一 关系数据库标准语言SQL

头歌 实验一 关系数据库标准语言SQL 制作不易!点个关注呗!为大家创造更多的价值! 目录 头歌 实验一 关系数据库标准语言SQL**制作不易!点个关注呗!为大家创造更多的价值!** 第一关:创建数据库第…

Apple Vision Pro应用合集

这里给大家分享一个网站,手机了最新的apple vision pro 上面运行的应用。 1、查找应用:用户可以浏览特色推荐的应用,或者通过随机挑选功能发现新的应用。 2、社区交流:提供社区功能,用户可以在这里交流使用体验、分享…

小程序接入第三方信息流流程 下载SDK

由第三方信息流提供相应的SDK下载链接以及接入说明和开发文档或其他方式接入,如果第三方能支持小程序SDK,则不需要后面步骤,只需要提供相关开发文档和接入方式接口 接入SDK 后台开发人员接入第三方提供的SDK,并进行相关接口开发…

在django中使用kindeditor出现转圈问题

在django中使用kindeditor出现转圈问题 【一】基础检查 【1】前端检查 确保修改了uploadJson的默认地址 该地址需要在路由层有映射关系 确认有加载官方文件 kindeditor-all-min.js确保有传递csrfmiddlewaretoken 或者后端关闭了csrf验证 <textarea name"content&qu…

如何使用 ChatGPT 进行编码和编程

文章目录 一、初学者1.1 生成代码片段1.2 解释功能 二、自信的初学者2.1 修复错误2.2 完成部分代码 三、中级水平3.1 研究库3.2 改进旧代码 四、进阶水平4.1 比较示例代码4.2 编程语言之间的翻译 五、专业人士5.1 模拟 Linux 终端 总结 大多数程序员都知道&#xff0c;ChatGPT …

GitLab更新失败(Ubuntu)

在Ubuntu下使用apt更新gitlab报错如下&#xff1a; An error occurred during the signature verification.The repository is not updated and the previous index files will be used.GPG error: ... Failed to fetch https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu/d…

thinkadmin 新版安装步骤

1.通过 Composer 安装: ( 推荐方式,默认只安装 admin 模块 ) ### 创建项目( 需要在英文目录下面执行 ) composer create-project zoujingli/thinkadmin### 进入项目根目录 cd thinkadmin### 数据库初始化并安装 ### 默认使用 Sqlite 数据库,若使用其他数据库请按第二步修…

AIGC工具系列之——基于OpenAI的GPT大模型搭建自己的AIGC工具

今天我们来讲讲目前非常火的人工智能话题“AIGC”&#xff0c;以及怎么使用目前的AI技术来开发&#xff0c;构建自己的AIGC工具 什么是AIGC&#xff1f; AIGC它的英文全称为(Artificial Intelligence Generated Content)&#xff0c;中文翻译过来就是“人工智能生成内容”&…

HarmonyOS网格布局:List组件和Grid组件的使用

简介 在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。下图中两个页面都包含列表&#xff0c;“首页”页面中包含两个网格布局&#xff0c;“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的列表…

java类的定义方式和实例化、this引用、对象的构造及其初始化、封装特性、static修饰成员变量、static修饰成员方法

java类的定义方式和实例化 类的定义和使用 类是用来对一个实体(对象)来进行描述的&#xff0c;主要描述该实体(对象)具有哪些属性(外观尺寸等)&#xff0c;哪些功能(用来干啥)&#xff0c;描述完成后计算机就可以识别了。 在Java中定义类需要用到class关键字具体如下 // 创…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

Oracle 19cADG集群补丁升级

Oracle 19cADG集群补丁升级 文章目录 Oracle 19cADG集群补丁升级1.备库备份2.备库升级Opatch3.备库应用补丁4.主库备份 oracle_home目录5.主库升级Opatch6.注册补丁7.编译无效对象8.检查主库的补丁注册情况9.备库切换主库完成补丁注册 1.备库备份 su - oracle cd $ORACLE_HOME…

[webpack-cli] Invalid options object 报错

[webpack-cli] Invalid options object. Dev Server has been initialized using an options object that does not match the API schema devServer: {contentBase: ./src, // 告诉服务器从哪里提供内容&#xff0c;默认情况下&#xff0c;它会使用当前工作目录作为根目录c…

深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集 2、正则化(Regularization) 正则化&#xff1a;得到一个更加简单的模型的方法。 以一个多项式为例&#xff1a; 随着最高次的增加&#xff0c;会得到一个更加复杂模型&#xff0c;模型越复杂就会更好的拟合输入数据的模型&#xff08;图-1&#xff09;&#…

Oracle中实现根据条件对数据的增删改操作——Merge Into

一、需求描述 在我们进行项目开发的过程中&#xff0c;会遇到这样的场景&#xff0c;需要根据某个条件对数据进行增、删、改的操作&#xff1b;遇到这种情况我们有2种方法进行解决&#xff1a; 方法一&#xff1a;①查询指定条件&#xff1b;②根据查询出的指定条件结果在执行…

阿里云国际DDoS高防的定制场景策略

DDoS高防的定制场景策略允许您在特定的业务突增时段&#xff08;例如新业务上线、双11大促销等&#xff09;选择应用独立于通用防护策略的定制防护策略模板&#xff0c;保证适应业务需求的防护效果。您可以根据需要设置定制场景策略。 背景信息 定制场景策略提供基于业务场景…

【图论 | 数据结构】用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构,特别适合于存储稀疏图,它可以有效地存储图的边和节点信息,以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起,通过数组的方式连接(类似静态数组实现链表)。这种方法的优点是存储空间小,查询速度快,尤其适…