僵尸进程和孤儿进程

目录

  • 引言
  • 僵尸进程
    • 僵尸进程的状态
    • 僵尸进程周边知识
  • 孤儿进程
    • 孤儿进程的状态
  • 进程中的其他状态
    • ①.R---表示进程运行状态。
    • ②.S---表示进程的休眠状态。(进程什么都没做)
    • ③T 和 t
  • 进程的运行、阻塞和挂起
    • 运行
    • 阻塞
    • 挂起状态:

引言

今天我们来将僵尸进程和孤儿进程以及其他的周边知识:进程的状态和进程的运行,阻塞和挂起。

僵尸进程

上个博客我们提到了进程,并且细致了说了什么事进程,所以我们今天就不在赘述了。那么什么又是僵尸进程呢?
定义:僵尸进程指进程已经退出,但资源并没有完全被释放
可能还是很懵,那么我们就用代码演示。
代码分析:
我们要捏造一个代码已经退出了,但是资源没有释放的场景,那么我们就可以用fork()来创建子进程,并且让子进程先退出,查看它的状态。

#include <stdio.h>                        
#include<unistd.h>
#include<sys/types.h>
int main()
{pid_t id=fork();if(id<0) return -1;//小于0表示创建子进程失败if(id==0){//创建子进程成功int cnt=5;while(cnt--){printf("我是一个子进程,我的pid是%d,ppid%d\n",getpid(),g  etppid());sleep(1);}}else{//父进程while(1){printf("我是一个父进程,我的pid是%d,ppid%d\n",getpid(  ),getppid());sleep(1);}}}

僵尸进程的状态

如下图,会发现子进程和父进程同时推进,但是在cnt为0的时候,子进程已经结束,但是父进程是死循环,并不会退出,会发现子进程STAT的状态变成了Z+。
Z:表示僵尸进程状态,+号表示在前台运行。
在这里插入图片描述

僵尸进程周边知识

子程序已经运行完毕,但是还需要维持自己的退出信息,在自己的进程task_struct会记录自己退出信息,未来让父进程来读取。如果没有父进程读取,僵尸进程会一直在。如果一直没有回收,就会引起内存泄漏问题僵尸进程不能被杀死,因为僵尸进程已经死了,无法杀死

孤儿进程

孤儿进程我们从他的名字也能看得出来,是父进程先退出,但是子进程没有退出导致的。
定义:它的父进程已经终止(退出),但该进程本身仍在运行。当父进程提前结束时,操作系统内核会自动将孤儿进程的父进程重新设置为init进程(在Unix/Linux系统中,init进程通常是PID为1的进程,现代系统中可能是systemd)。
孤儿进程没有父亲会被init进程领养。

孤儿进程的状态

以下代码,会让父进程先退出。从运行截图,我们发现一开始子进程和父进程都是S+,但是当父进程退出的时候,子进程变成了S。这个时候就表示子进程变成了孤儿进程且已经被领养。孤儿进程会被转到后台运行

#include <stdio.h>                        
#include<unistd.h>
#include<sys/types.h>
int main()
{pid_t id=fork();if(id<0) return -1;//小于0表示创建子进程失败if(id==0){//创建子进程成功int cnt=10;while(cnt--){printf("我是一个子进程,我的pid是%d,ppid%d\n",getpid(),g  etppid());sleep(1);}}else{//父进程int cnt=5;while(cnt--){printf("我是一个父进程,我的pid是%d,ppid%d\n",getpid(  ),getppid());sleep(1);}}}

在这里插入图片描述

问题: 为什么孤儿进程要被领养?
答:因为保证子进程正常被回收。

进程中的其他状态

状态的种类

①.R—表示进程运行状态。

如图他是运行状态,但是大部分当输出一段话的时候会发现是S+,这是为什么呢?原因是我们的CPU太快了,Linux的原则是一切皆文件,显示器也不例外,他也是一个文件,当你的代码将内容显示到屏幕上,CPU一下子就解决了,但是从磁盘到内存到CPU很慢,所以你的CPU一直在等待。
在这里插入图片描述

②.S—表示进程的休眠状态。(进程什么都没做)

所谓的休眠状态就是进程太等待,可能是因为cpu太快了。 本质:进程在等待 “资源” 就绪。 且S是可中断睡眠。(ctrl+c)

③T 和 t

T ---让进程暂停,等待被进一步唤醒。   kill  -19(暂停)/-18(继续) /-9(杀死进程)

在这里插入图片描述
在这里插入图片描述

t ---进程被追踪暂停。(调试情况,遇到断点就暂停)

在这里插入图片描述

④. ./可执行文件 +& —>表示在前台运行。没有+表示在前台。
⑤.x—死亡状态。
⑥.D— 深度睡眠/不可中断睡眠。 D的存在主要是保护重要进程不被干掉。如果非要中断有两种情况:断点重启和等待进程结束。

进程的运行、阻塞和挂起

这张图大家看着都很熟悉,很多教材都有,但是我们这里说的并不全面,只会说运行、阻塞和挂起。
在这里插入图片描述

运行

(1).进程运行时一定是在cpu上运行。每一个cpu都需要维护一个运行队列(数据结构)。
(2).进程在运行队列中,该进程的状态就是R状态(运行状态)。
(3).进程是基于时间片进程轮转调度的。让多个进程以切换的方式进行调度,在一个时间段内同时得以推进代码,这就叫做并发。

阻塞

问题:我们C语言中的scanf在等待你输入是属于什么状态呢?暂停吗?
答:是阻塞状态,S属于阻塞状态。等待某资源是都就绪

(1).不止有CPU才有运行队列,各个设备也有自己的等待队列。
(2).阻塞指一个进程从进程队列里剥离下来,列到其他设备的队列里。
(3).当阻塞结束,把进程从其他设备的队列,在列会进程队列中交唤醒。

挂起状态:

(1).挂起就是将操作系统的暂时不用的进程,交换到磁盘中swap区。你在需要调度的时候,在换出。
(2).频繁地换入换出会导致效率问题。

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

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

相关文章

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

【前端】es-drager 图片同比缩放 缩放比 只修改宽 只修改高

【前端】es-drager 图片同比缩放 缩放比 ES Drager 拖拽组件 (vangleer.github.io) 核心代码 //初始宽 let width ref(108)//初始高 let height ref(72)//以下两个变量 用来区分是单独的修改宽 还是高 或者是同比 //缩放开始时的宽 let oldWidth 0 //缩放开始时的高 let o…

【好用】推荐10套后端管理系统前端模板

后台管理系统前端模板是开发者在构建后台管理系统时使用的一种工具&#xff0c;它提供了预先设计好的界面和组件&#xff0c;以帮助开发者快速搭建出功能完善、用户体验良好的管理系统。以下是V哥整理的10款流行的后台管理系统前端模板&#xff0c;它们基于不同的技术栈和设计理…

【研发日记】CANoe自动化测试的配置方式(三)——SystemVariables数组方式

文章目录 前言 一、例程功能 二、仿真ECU 三、SystemVariables数组&#xff1a; 四、测试模块 五、测试运行效果 六、分析和应用 总结 前言 近期在做的一个自动化测试项目&#xff0c;尝试了一种以前没用过的测试配置方式&#xff0c;感觉效果还不错。然后又回顾了一下以…

Redis数据持久化 AOF RDB

Redis数据持久化 AOF RDB 1、单点 redis 的问题2、主从复制2.1 命令传播 3、Redis的持久化3.1 AOF写回策略重写机制后台重写 3.2 RDB&#xff08;默认方式&#xff09;RDB 方式&#xff1a;执行快照时&#xff0c;数据能被修改吗&#xff1f;RDB 方式总结 3.3 RDB 和 AOF 组合&…

场景:如何做数据清理

如果数据清理简单粗暴按时间进行清理&#xff0c;同时时间字段并没有增加索引就会出问题 如果没有增加索引&#xff0c;他就会进行全表扫描&#xff0c;并且会给全表的数据上一个x锁 会阻塞其他的线程 解决方案参考阿里云DMS数据清理方案 这个SQL查询的目的是从名为table_hol…

Unity之PUN实现多人联机射击游戏的优化(Section 3)

目录 &#x1f4a3;一、准备工作 &#x1f4a3;二、生成弹头脚本的编写 &#x1f4a3;三、实现发射和伤害同步 手雷都加了在给狗剩加个火箭筒不过分吧。效果看GIF动图&#xff0c;分别是单机和联机的效果。 添加火箭筒依旧是在原有的基础上更改&#xff0c;我查看火箭筒模型…

模板初阶的学习

目录&#xff1a; 一&#xff1a;泛型模板 二&#xff1a;函数模板 三&#xff1a;类模板 1&#xff1a;泛型模板 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 以交换函数为列进行讲解&#xff1a; void Swap(…

博客系统项目测试(selenium+Junit5)

在做完博客系统项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#xff08;全…

SQL执行流程图文分析:从连接到执行的全貌

SQL执行总流程 下面就是 MySQL 执行一条 SQL 查询语句的流程&#xff0c;也从图中可以看到 MySQL 内部架构里的各个功能模块。 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在…

智能零售:引领购物新时代

智能零售通过整合人工智能、物联网、大数据和机器学习等技术&#xff0c;正在彻底改变传统的购物模式&#xff0c;为消费者和零售商提供前所未有的效率和个性化体验。 智能零售利用消费者数据分析来提供个性化的购物推荐。无论是在线平台或是实体店内&#xff0c;智能系统都能…

【JS】获取接口返回 EventStream 结构的数据(即接收读取 stream 流)

文章目录 EventStream 是一种服务器推送的数据格式&#xff0c;可以用于实时数据传输。 接口返回的示例图 获取示例&#xff1a; // 这里的 url 为虚拟的&#xff0c;仅供演示用 fetch(https://test.cn.com/api/agent/2, {method: POST,headers: {Content-Type: applicatio…