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

news2024/10/1 3:24:50

 

进程的基本概念:

程序的一个执行实例 ,正在执行的程序等等 ——— 课本概念
担当分配系统资源的实体,例如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.coloradmin.cn/o/1540544.html

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

相关文章

Photoshop 工具使用详解(全集 · 2024版)

全面介绍 Photoshop 工具箱里的工具,点击下列表格中工具名称或图示,即可查阅工具的使用详解。 移动工具Move Tool移动选区、图层和参考线。画板工具Artboard Tool创建、移动多个画布或调整其大小。moVe快捷键:V 矩形选框工具 Rectangular Mar…

mac硬盘拷贝到另外硬盘 苹果电脑怎么拷贝到移动硬盘

在当今的信息时代,数据的存储和传输是我们日常生活和工作中不可或缺的一部分。我们经常需要使用各种硬盘来保存和备份我们的数据,比如内置硬盘、移动硬盘、U盘等。但是,不同的硬盘可能使用不同的文件系统,这给我们的数据拷贝带来了…

C++11:左值与右值|移动构造|移动赋值

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:マイノリティ脈絡—ずっと真夜中でいいのに。 0:24━━━━━━️💟──────── 4:02 🔄 …

每日一题 第三十期 洛谷 [USACO1.5] [IOI1994]数字三角形 Number Triangles

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中,从 7 → 3 → 8 →…

深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! Doris是一款高性能、开源的实时分析数据仓库,旨在为用户提供毫秒级查询响应、高并发、高可用以及易于扩展的OLAP解决方…

基于“云”重构“百度云盘”

这一篇文章是和上一篇连着的哟! # docker run -p 80:80 -d -v /data/owncloud/:/var/www/html owncloud 一、【安装完成】 二、【打开浏览器】 三、【回到这个熟悉的界面,掉。】 四、【上传文件】 试了可以看哇偶!!&#xff01…

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展,能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题,导致企业的经济效益降低。目前,提高企业的生产计划管理是改善能源企业现状最有利的途…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(七) 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

JavaEE--小Demo--数据库建立

目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录,并运行命令提示符 3.打开数据库mysql -uroot -p 4.创建数据库create database demo; 5.使用数据库use demo; 6.导入数据source demo.sql;…

【OpenGL手册-21】高级GLSL编程

一、说明 这章不会向你展示什么新的功能,也不会对你的场景的视觉效果有较大提升。但是,本文能够提供最深刻的GLSL表达,也深入探讨了一些GLSL有趣的知识,它们可能在将来能帮助你。基本来说有些不可不知的内容和功能在你去使用GLSL创…

MySQL面试题--开发(最全,涵盖SQL基础、架构、事务)

MySQL面试题--事务https://mp.csdn.net/mp_blog/creation/editor/136947072 MySQL面试题--MySQL内部技术架构https://blog.csdn.net/Timebro/article/details/136946046?spm1001.2014.3001.5501 MySQL面试题--最全面-索引https://blog.csdn.net/Timebro/article/details/136…

Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准

前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略,希望通过本文,能够帮助大家规范 Git Commit,并且展示相关 …

波奇学Linux:网络套接字

domain:ipv4 还是ipv6 type:面向字节流还是... 虚拟机 云服务器禁止直接bind公网ip 服务器可以有多个ip,如果只绑定一个ip,只能收到来自一个ip的信息 任意地址绑定 关于port的问题 [0,1024]:系统内定的端口号,一般要用固定的应…

JetPack之LiveData

目录 一、LiveData简介1.1 LiveData是什么? 二、LiveData使用2.1 LiveData基础使用2.2 LiveData搭配Service模拟后台消息2.3 LiveData在组件中的数据传递 三、LiveData应用场景 一、LiveData简介 1.1 LiveData是什么? LiveData是一种可观察的数据存储器…

[数据结构初阶]二叉树

各位读者老爷好,鼠鼠我现在浅浅介绍一些关于二叉树的知识点,在各位老爷茶余饭后的闲暇时光不妨看看,鼠鼠很希望得到各位老爷的指正捏! 开始介绍之前,给各位老爷看一张风景照,有读者老爷知道在哪里吗&#x…

02-MySQL数据库的基本使用与密码设置

一、服务端口 3306端口和33060端口,是我们启动数据库后开启的监听端口; 3306端口:是我们MySQL服务的监听端口,用来连接数据库使用; 33060端口:MySQL-shell服务的端口,MySQL-shell是MySQL架构集群…

基于霍夫检测(hough变换)的人眼瞳孔定位,Matlab实现

博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…

Java设计模式 | 抽象工厂模式

抽象工厂模式 工厂方法模式中考虑的是一类产品的生产,如幼儿园只培养小朋友,鞋厂只生产鞋子。这些工厂只生产同种类产品,同种类产品称为同等级产品,即工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂都…

一文读懂代理与反向代理

反向代理与正向代理在代理服务器的角色和工作方式上有所不同,这两种代理方式主要取决于代理服务器代理的对象和处理方式。 区别: 正向代理: 正向代理是代理客户端的请求,客户端通过正向代理访问其他服务或资源。客户端知道自己正…

注解总结,Java中的注解,springboot中的注解

注解总结 1、Junit 开始执行的方法:初始化资源,执行完之后的方法:释放资源 测试方法,必须是:公有、非静态、无参无返回值的 在一个类中,可以定义多个测试方法,每个测试方法可以单独运行&#…