【Linux】-----进程第一弹

news2024/9/20 16:01:17

目录

概念

描述进程-PCB

查看进程

获取进程标识符

终止进程

fork创建进程 

 返回值说明

进程的状态

①运行状态(R)

 ②浅度睡眠(S)

③深度睡眠(D)

④暂停状态(T)

 ⑤僵尸状态(Z)(重点)

是什么?

举例 

危害

孤儿进程

⑥死亡状态(X) 


概念

课本上对于进程的概念是这样子说的一个正在执行的程序就叫做进程。

对于操作系统的内核是这样子说的:担当分配系统资源(CPU时间,内存)的实体!(很抽象

什么叫做分配系统资源的实体?这得借助冯诺依曼体系结构来看看

从冯诺依曼结构可以看出,能与CPU直接打交道的是存储器,也就是的内存! 实际上我们平时所创建的文件都是放在外设磁盘上的。一个可执行程序的本质就是一个二进制文件,在我们没有运行这个可执行程序时,实际上它是被放在磁盘中的。当我们将这个可执行程序运行起来的时候,本质就是将这个可执行程序加载到内存中,只有当程序被加载到内存中的,CPU才能进行访问,此时这个可执行程序就分配到CPU的资源,这个就叫做一个实体,但是需要注意严格意义上来说还不能叫进程。只能说是进程的一部分。将可执行程序加载到内存,实际上是将对应代码和数据加载到了内存。

而内存会同时存在多个可执行程序的代码和数据,到底应该先执行哪一部分的?以及其他部分的数据执行了多久?等一系列进程的信息操作系统该如何进行管理呢?

我们都知道操作系统实际上是一款软件,对下能够进行软硬件管理,对上能提供安全稳定高效的运行环境的软件,这就包括了对进程的管理工作。。。。。仅需记住操作系统管理的六字真言:先描述,再组织!

先把进程的信息采用结构体的方式描述起来,再使用链表或者更高效的数据结构将结构体组织起来!

ps:实际上开机第一个运行的可执行程序就是操作系统,将操作系统的代码和数据先加载到内存中。。

描述进程-PCB

PCB(process control block),进程控制块。是一个结构体,这个结构体里面存放着对应进程的信息,或者说是进程的所有属性信息一个进程都有一个对应的PCB。

操作系统对进程的管理本质就是对进程信息的管理,每当新形成一个进程时,操作系统便会将其描述起来,在通过链表的形式组织的。此时对进程的操作,就是对链表完成增删查改的操作!

从上图就可以给进程下一个定义:进程=PCB+对应的代码和数据!

在Linux操作系统中下的PCB称为:task_struct,是PCB的一种!

如何理解进程的动态运行?

调度运行进程的本质就是让进程控制块task_struct进行排队,只要task_struct在不同的队列里,进程就可以访问不同的资源,这就是动态运行!!!

task_struct中主要包含以下信息:

  • 标识符:pid/ppid
  • 状态:任务状态,退出码等
  • 优先级:相对于其他进程的优先级
  • 内存指针
  • 上下文数据
  • I/O状态信息

查看进程

指令:ps axj

功能:查看当前系统中所有的进程

若想要查看指定的进程,可以加上管道 | 和grep 特定的进程

指令:ps ajx | grep 指定进程名称

获取进程标识符

  • pid:进程的标识符
  • ppid:当前进程的父进程的pid

 这两个属性都是存在于内核task_struct,用户不能直接访问,只能采用系统提供的接口调用。

  • getpid():获取进程id
  • getppid():获取父进程id

 实例:

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 int main()
  5 {
  6   while(1)
  7   {
  8     printf("my process,my pid is:%d,my ppid is:%d \n",getpid(),getppid());      
  9     sleep(1);
 10   }
 11   return 0;
 12 }

 注意:每次重新运行进程时,对应的pid都不一样。

终止进程

两种指令:

  • ctrl+C
  • kill -9 进程的pid

fork创建进程 

fork是一个由OS提供的函数,功能就是创建一个子进程。

 

例如:

可以看到这里的结果打印的是两句“after fork”,因为fork之后,父子进程代码共享,也就是创建出来的子进程和父进程执行相同的代码

注意:

  • 创建一个进程本质就是系统多出了一个进程,也就是多出来了一个PCB+代码和数据
  • 父进程的代码和数据是从磁盘加载来的,而默认情况下,子进程会继承父进程的PCB
  • 父子进程之间仅是代码共享,数据并不共享,有各自的存储数据空间(写时拷贝)

为什么要创建子进程?

  • 实际上就是因为想让多个进程并发的跑起来,每个进程都做不一样的事情!

这时就需要采用if语句分流了!

 返回值说明

上图可以看到fork实际上是有返回值的,类型为pid_t;

返回值=0表示子进程创建成功,返回子进程的pid给父进程,在子进程中返回0
返回值>0表示父进程,接收的是子进程的pid
返回值<0表示进程创建失败

例如:

 

可以看到采用if分流就能实现父子进程都执行各自模块的代码,做着不一样的事情!

注意:fork会返回两次,因为fork后的代码父子共享,子进程已经存在了,子进程返回一次,父进程又返回一次!

至于为啥同一个id会存在两个不同的返回值,那就涉及到虚拟地址空间+父子写时拷贝的问题了(后续提及)

进程的状态

进程的状态属于task_struct里的一个属性。一个进程可以有几个状态,更改进程状态实际就是更改task_struct内部的一个属性。。。下面具体来看Linux下的进程状态。。

①运行状态(R)

并不意味着进程一定是在运行,它可能表示的是进程正在运行或者处于运行队列中。

例如:

查看一下上述进程的状态,可以采用下面这条指令:

ps ajx | head -1 && ps ajx | grep 可执行程序名称

 可以看到当前进程就是处于运行状态,R+表示在前台运行,R表示在后台运行

 ②浅度睡眠(S)

这种状态一般都是进程在等待某种资源就绪,也称为可中断睡眠状态(能之间终止掉睡眠状态)

例如:死循环打印一段代码

上述处于睡眠状态因为CPU运行速度很快,早早就将程序执行完成,大部分的时间都在等待显示器资源就绪!

③深度睡眠(D)

一个处于D(disk sleep)状态的进程,是不可被杀掉的,操作系统也不能将其杀掉,也叫不可中断睡眠状态。

为何会存在D状态?

主要是为了防止数据丢失问题!当一个进程在向着磁盘写入信息时,若操作系统直接将该进程杀死,此时如果磁盘正在读取数据,但该进程已经被杀掉,那么磁盘去哪读数据?这就造成了数据丢失的问题。

        所以一个进程若正在进行数据的写入操作时,会将自身的状态设置为D状态!

注意:要想结束掉处于这种状态的进程,只能等进程自己醒来,或者断电重启操作系统1 

④暂停状态(T)

  • 暂停:kill  -19  对应进程的pid 

  • 恢复进程之前状态:kill -18 对应的进程pid 

恢复后的进程全部在后台运行 !看到这里或许会疑惑,这个18,19为什么能这样做?实际上就是kill指令存在一堆信号,相当于宏定义那样。

可见,我们实际上也可以采用kill + SIGSTOP来暂停进程!但这样没有数字来得简单!

 ⑤僵尸状态(Z)(重点)

处于这种状态的进程称为僵尸进程!

是什么?

一个已经运行完毕的进程,不会立刻退出,而是需要维持自己的退出信息,在自己的进程task_struct会记录自己的退出信息,这个退出信息未来会让父进程或者操作系统进行读取,只有当父进程读取退出信息,子进程之前申请的资源才能释放掉,若退出信息一直未被读取,相关资源就不会释放。

一个正在等待自己退出信息被读取的进程,称为僵尸进程,此时也称为该进程处于僵尸状态。僵尸进程无法将其kill掉。

举例 

while :; do ps ajx | head -1 && ps ajx | grep mytest | grep -v grep; sleep 1; done

 使用上述监视进程的脚本语言来观察观察。。

可以看出,当5s后子进程运行结束了, 但是在并没有退出,而是在等待父进程回收,此时该子进程的状态就变为僵尸状态!

ps:

  • 直接在命令行中启动的进程,不会存在僵尸状态,因为在命令行中启动的进程的父进程是(bash)系统,运行结束后会自动回收!
  • 至于程序中的进程如何读取退出信息,会使用到wait/waitpid系统接口,这里先不细说!

危害

  • 若父进程一直不读取子进程的退出信息,那么子进程会一直处于僵尸状态。。
  • 如果一个父进程存在多个子进程,但是都不回收,必然造成资源的浪费。。进程的PCB是占用内存空间的。
  • 僵尸进程数量越多,实际可利用资源就越少,那就会造成内存泄漏的问题!

孤儿进程

所谓孤儿进程,顾名思义,就是没有父亲呗。父进程先于子进程退出,子进程称为孤儿进程,运行在后台,父进程成为1号进程(OS本身)

孤儿进程的退出,会被1号进程负责任的进行处理,因此不会成为僵尸进程!

演示

 

不难发现,孤儿进程的ppid变成了1,也就是被系统领养了(爷爷)! 

⑥死亡状态(X) 

实际就是当一个进程运行结束并且被父进程回收时,此时的进程就是完全退出了,也叫做死亡状态,我们肯定看不到的!


今天的分享就到这,希望对你有用!

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

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

相关文章

如何保护电脑文件夹?多种方法保护数据安全

在数字化时代&#xff0c;电脑中的文件夹往往存储着我们最私密、最重要的数据&#xff0c;如个人文档、照片、工作资料等。因此&#xff0c;保护这些文件夹免受未经授权的访问、盗窃或损坏变得尤为重要。本文将介绍多种方法来有效保护电脑文件夹及其数据安全。 文件夹保护3000 …

MySQL中的比较条件

符号!也能够表示不等于条件。 示例一&#xff1a;查询employees表中员工薪水大于等于3000的员工的姓名与薪水。 select l ast_name,salary from employees where salary > 3000; 示例二&#xff1a;查询employees表中员工薪水不等于5000的员工的姓名与薪水。 select las…

人工智能在肿瘤浸润淋巴细胞研究中的最新进展|文献速递·24-09-20

小罗碎碎念 文献速递&#xff5c;目录 一、胆道癌治疗应答的新型AI生物标志物&#xff1a;肿瘤浸润性淋巴细胞的空间分布 补充文献&#xff1a;22年发表于JCO的一篇类似文献 二、生物标志物在肝细胞癌管理中的作用&#xff1a;从发现到临床应用 三、肿瘤样本中免疫细胞浸润水…

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述 本章引要练习 浮点数的存储浮点数的取出小补充题目解析彩蛋时刻&#xff01;&#xff01;&#xff01; 本章引要 常见的浮点数&#xff1a;3.1415&#xff0c;1E10等。其中&#xff0c;1E10是科学计数法的形式&#xff0c;它也就等于1*10^10。小数数据类型&#xff1…

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

【CustomPainter】渐变圆环

说明 实现一个渐变圆环&#xff0c;起点位置为- π / 2。 效果 源码 GradientCircularPainter1 class GradientCircularPainter1 extends CustomPainter {final double progress;GradientCircularPainter1(this.progress);overridevoid paint(Canvas canvas, Size size) {c…

零基础到项目实战:Node.js版Selenium WebDriver教程

在当今数字化时代&#xff0c;Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性&#xff0c;自动化测试成为一种不可或缺的工具。Selenium&#xff0c;作为自动化测试领域的瑰宝&#xff0c;为我们提供了无限可能。本教程将深入介绍Selenium&#xff0c;以及如何结合…

如何删除EXCELL文件中的空行?

1&#xff0c;选择某一列 2&#xff0c;点击《开始》《查找和选择》>《定位条件》&#xff0c;调出《定位条件》的选择框&#xff1b; 3&#xff0c;在定位条件选项框&#xff0c;选择《空值》&#xff1b; 4&#xff0c;找到变灰被选中的某一行&#xff0c;右击《删除》 5&…

配置管理之configmap

一 、云原生要素——配 置分离 ConfigMap&#xff1a;存储明文配置 Secret&#xff1a;存储密文、敏感配置、用户重要信息和密码 等。 配置更新直接同步容器&#xff0c;热加载&#xff0c;无需重启pod或者容 器;镜像和配置分离&#xff0c;可单独修改发布 二、ConfigMap 1.…

详细分析Pytorch中的register_buffer基本知识(附Demo)

目录 1. 基本知识2. Demo3. 与自动注册的差异3.1 torch.nn.Parameter3.2 自动注册子模块3.3 总结 1. 基本知识 register_buffer 是 PyTorch 中 torch.nn.Module 提供的一个方法&#xff0c;允许用户将某些张量注册为模块的一部分&#xff0c;但不会被视为可训练参数。这些张量…

2区“发稿大户”!SCISSCI双检,3天上线出版,在这里,不用担心创新性不足~

【SciencePub学术】眼瞅评职晋升最后期限就在眼前&#xff0c;小编今天就给大家带来了一本“百发百中”的救命神刊~ 01 期刊详情 【期刊简介】IF&#xff1a;2.0-3.0 JCR2区中科院4区 【出版社】MDPI出版社 【自引率】8.30% 【类别】医学 【INDEX】SCIE&SSCI在检 02…

es由一个集群迁移到另外一个集群es的数据迁移

迁移es的数据 改下index的索引 就可以了。 查询 用curl -u就可以查询了

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明&#xff1a;数据集里面有2/3是增强数据集&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求在下载&#xff0c;分辨率均为640x640 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件…

微店商品列表API接口实战指南

微店商品列表数据接口是一种允许开发者在其应用程序中调用微店店铺所有商品数据的 API 接口。通过这个接口&#xff0c;开发者可以获取到微店店铺内所有商品的信息&#xff0c;包括但不限于商品的 ID、标题、价格、库存、销量、详情描述、图片等。以下是对微店商品列表数据接口…

如何确保Java程序分发后不被篡改?使用JNI对Java程序进行安全校验

前言 众所周知&#xff0c;Java/Kotlin编译后会编译成smali&#xff0c;使用Jadx这类的反编译工具或者Hook工具就能很轻松的把我们的软件安全校验给破解了。 为了防止这种情况发生&#xff0c;我们一般会将核心代码使用C编写&#xff0c;然后使用JNI技术&#xff0c;使用Java…

TCP报文格式

RFC9293协议规范&#xff0c;规定的TCP格式如图1&#xff0c; 对比RFC793规定的格式&#xff0c;控制位从6bit变成了8bit 图1&#xff0c;图片来源&#xff1a;datatracker.ietf.org 图2为&#xff0c;可对照的中文版TCP格式&#xff0c;中文版参照的是RFC793 图2 重点…

htop 命令:系统状态监控

一、命令简介 ​htop ​是一个互动式的进程查看器&#xff0c;它是 top ​命令的增强版本&#xff0c;提供了更丰富的功能和更好的用户界面。htop ​显示了系统的实时进程和资源使用情况&#xff08;比如 CPU 和 memory 占用情况&#xff09;&#xff0c;允许用户进行交互式操…

基于Ubuntu的ECS实例实现OSS反向代理

阿里云OSS的存储空间&#xff08;Bucket&#xff09;访问地址会随机变换&#xff0c;您可以通过在ECS实例上配置OSS的反向代理&#xff0c;实现通过固定IP地址访问OSS的存储空间。 背景信息 阿里云OSS通过Restful API方式对外提供服务。最终用户通过OSS默认域名或者绑定的自定…

掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制

在现代应用开发中&#xff0c;数据库操作是核心环节之一。Spring Boot提供了简化数据库集成的强大工具&#xff0c;而JPA&#xff08;Java Persistence API&#xff09;和Hibernate是两种非常流行的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;可以帮助我们将对象…

CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】

CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】 适用于:V200R008至V200R019C00版本的AC,以及有空闲以太网口的AP。 说明:本示例基于“直连二层组网直接转发【AP+AC+出口网关】”场景来介绍如何增加AP下行口有线接入。 业务需求…