当前位置: 首页 > news >正文

Linux进程概念僵尸进程孤儿进程

文章目录

    • 一、什么是进程
    • 二、进程的状态
    • 三、Linux是如何做的?
      • 3.1 R状态
      • 3.2 S状态
      • 3.3 D状态
      • 3.4 T状态
      • 3.5 t状态
      • 3.6 X状态
      • 3.7 Z状态
    • 四、僵尸进程
      • 4.1 僵尸进程危害
    • 五、孤儿进程

一、什么是进程

  • 对于进程理解来说,在Windows上是也可以观察到的,右键状态栏的任务管理器就可以看到

在这里插入图片描述

  • 运行一个进程是需要占用CPU和内存的
  • 在我们平时运行一个进程的时候(Windows)直接双击后,系统将磁盘里的exe文件加载到内存当中,这个时候就当运行起来的时候就开启了一个进程,这里要注意,加载到内存中中是不算进程的,只有当运行起来后才算是进程 -->进程 = PCB + 自己的代码和数据
  • 对应的每一个进程都有一个PCB结构体,操作系统需要通过此结构体找对应的二进制
  • 当有多个进程被运行起来的时候,就会产生多个PCB结构体,这个时候需要组织(可以是链表或者其他更高效的数据结构)起来进行管理,这就产生一个重要的概念------->先描述,再组织

在这里插入图片描述

  • 每个进程都对应的每个PCB结构体,当运行的时候需要进行排队,CPU就可以通过PCB找到原代码,再把代码交给CPU运行

在这里插入图片描述

二、进程的状态

  • 每个进程都有自己的一个状态,告诉操作系统正在干什么,将来要干什么?也就是说,进程的多种状态,本质都是为了满足未来的某种使用场景。

  • 就比如Windows上的任务管理器也有显示进程的状态

在这里插入图片描述


  • 在操作系统上有三种状态
    • 运行状态
    • 挂起状态
    • 阻塞状态

  • 运行状态:从计算机的硬件出发,我们所写的代码在硬盘中,要让程序运行起来就要加载到内存当中, 每一个程序(进程)都会有一个属于自己的PCB,通过PCB来进行排队,等待CPU的调度,为了方便调度管理,操作系统会维护一个运行队列,所有就绪状态的进程的PCB会被加入到这个队列当中, CPU在调度执行时就会通过这个运行队列拿到进程的PCB,进而调度执行该进程,在排队的时候就是运行状态。

  • 挂起状态:内存满负荷时,又要增加新的进程显然是不行的。所以操作系统会观察内存中的哪些进程没有被放在任何一个队列里面(在内存里面啥也不干),找到以后就把此进程的代码和数据短期内置换到磁盘上,仅保留此进程的PCB。腾出的这一块空间供新的进程使用。针对于这种情况,操作系统会将阻塞进程的代码和数据置换到外设,此时该进程的状态就被称为挂起状态;

    • 其中阻塞进程的代码和数据一般会存放在磁盘的swap分区,当进程被操作系统调度时,被置换到外设的代码和数据又会重新加载到内存;

    • 一般情况下,swap分区的大小不会太大,大概等于内存的大小,过大的swap分区会导致操作系统过于依赖swap分区,导致效率变低;


  • 阻塞状态:在CPU执行一个进程的时候,可能会需要访问系统的某些资源,就比如在C语言中写的scanf(),在使用这个函数的时候,需要调用键盘,等待键盘输入数据,当进程需要键盘资源的时候,会将进程的PCB加入到硬件设备结构描述的等待队列当中,并且把PCB设置为阻塞状态,当PCB在这个等待队列中等待数据资源时,这个状态就叫做阻塞状态;

三、Linux是如何做的?

  • 在Linux内核中是这样定义的:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {"R (running)", /* 0 */"S (sleeping)", /* 1 */"D (disk sleep)", /* 2 */"T (stopped)", /* 4 */"t (tracing stop)", /* 8 */"X (dead)", /* 16 */"Z (zombie)", /* 32 */
};
  • 先简单描述一下这些状态:

    • R (Running):该进程正在运行中。
    • S (Sleep):该进程目前正在睡眠状态,但可以被唤醒。
    • D :不可被唤醒的睡眠状态,通常这个进程可能在等待I/O的情况。
    • T :停止状态,发送一个暂停信号给进程,进程就暂停了。
    • t :追踪停止状态,通常在断点调试时,进程处于此状态。
    • X :死亡状态,这个状态是用来告诉操作系统的,所以我们观察不到此状态。
    • Z (Zombie):僵尸状态,进程已经死亡,但是却无法被删除至内存外。

  • 下面我们挨个介绍一下,以下用Linux来查看:

在这里插入图片描述

  • 这里我们还需要了解一个概念,进程是有依赖的,就比如我运行这个C语言程序,其父进程是bash,pid是本进程的id,ppid是父进程的id

在这里插入图片描述

3.1 R状态

  • 下面我们编写这样一段代码,是一个死循环,这样可以观察到进程
#include<stdio.h>
#include<unistd.h>
int main()
{while(1){}return 0;
}
  • 普通查看进程可以这样查看
ps -aux | head -1 &&ps -aux | grep a.out

在这里插入图片描述

  • 我们还可以用shell命令来一直刷新观察
while :; do ps ajx | head -1 && ps ajx | grep a.out | grep -v grep; sleep 1; done

在这里插入图片描述

  • 这里看到是R+是代表在前台运行,在运行的时候可以使用ctrl+c进行中断,中断后进程也就退出了

  • 我们可以让此程序到后台运行

    • 在命令后面加“&”符号

    • 这里的pid进程id是唯一的,标识此进程,ppid代表父进程

在这里插入图片描述

  • 在运行起来后看到那个+号就没有了,说明是在后台运行中

在这里插入图片描述

  • 想要杀死这个程序就需要使用kill命令来进行杀死
kill -9 27165
  • 这里使用kill -9命令比较麻烦需要找到进程的id,我们还有一个命令
killall -9 a.out
  • 这样就可以不用输入进程id输入此进程的名字即可

  • 我们再补充一个概念,每一个进程运行起来的时候都有一个文件被创建

  • 在根目录下的proc

在这里插入图片描述


3.2 S状态

  • 这个状态表示此进程正在睡眠,但是可以被唤醒

  • 下面可以进行演示一下:

#include<stdio.h>
#include<unistd.h>
int main()
{while(1){printf("hello world\n");}return 0;
}
  • 在上面的那段代码中添加了一个printf打印函数,同样是运行,但是这里为什么是S状态呢?

在这里插入图片描述

  • 这是因为CPU运行的速度很快,一直需要请求显示器响应,CPU多数的时候是在等待,所以就显示S

  • 这里我使用了实体机器的ubuntu验证了一下,是对的,一遍在疯狂的打印helloword,由于打印的速度也很快,CPU的速度也很快,所以有再看进程有的时候就会显示R状态,有的时候显示S状态~~

在这里插入图片描述


3.3 D状态

  • 此状态是深度休眠状态,不可被唤醒,是为磁盘准备的

  • 当进程需要大量的数据写入磁盘的时候,等待磁盘写入的进程状态就是休眠,上面也将过了,

  • 在内存严重不足的情况下,操作系统没办法时会通过杀死进程的方式来节省资源;如果在等待的过程中进程被操作系统杀掉,并且磁盘写入数据失败,那么就会导致数据无法再加载(数据丢失);为了避免这种情况,就可以把等待数据写入的进程状态设为D状态;

  • D状态无法被杀掉(OS也不行),只能等待执行完毕后状态转换;


这个D状态不好验证,如果看到此状态说明计算机就要快挂了~~


3.4 T状态

  • 此状态是停止状态,可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行

在这里插入图片描述

在这里插入图片描述

  • 可以使用kill -l命令查看一下发送信号的类型

在这里插入图片描述


3.5 t状态

  • 这个小写的t状态也是停止状态

  • 主要出现在程序Debug时,在Debug的时候,遇到断点,进程就暂停,此时就是t状态

  • D状态、T状态、t状态其实都是阻塞状态,阻塞可以等待硬件资源也可以等待软件资源


3.6 X状态

  • X状态(死亡状态),就是我们常说的终止状态,它是一个瞬时状态,不会在任务列表里看到这个状态

3.7 Z状态

  • 最后就是Z(zombie)僵尸状态,僵尸状态较为复杂,Linux系统中的僵尸进程状态也是一种特殊的进程状态,通常是指一个子进程已经结束运行,但其父进程还未对其进行善后处理。如果不及时清理僵尸进程,会导致系统资源泄漏,影响系统性能甚至造成系统崩溃;

四、僵尸进程

  • 当有一个进程要退出的时候,它是直接原地消失、释放空间的吗?

  • 当进程退出的时候,它是不会立即释放空间的,它的PCB会保存一段时间让父进程或者操作系统读取,让父进程或操作系统知道这个进程即将退出了,然后父进程或者操作系统释放掉进程占用的资源和空间。一般情况下,清理进程资源空间的操作都是父进程。

  • 那么僵尸进程,指的是什么呢?就是进程退出时,依然会在内存里面待一段时间,如果父进程没有能力将此进程完整地释放掉,造成这个进程一直在内存里面,此时这个进程就是僵尸进程


  • 下面我们创建一个子进程来看一看
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{pid_t id = fork();       while(1){if(id == 0){printf("我是子进程,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}else if(id > 0){printf("我是父进程,pid:%d,ppid:%d\n",getpid(),getppid());sleep(2);}}                                                                                  return 0;
}
  • 使用man 的2号手册可以看到fork的用法,fork有两个返回值
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

在这里插入图片描述

  • return val这里可以看到返回值,如果成功返回0,失败返回-1,

  • 在程序上面的那个程序的时候,杀死子进程后,子进程的状态就变成了僵尸进程

在这里插入图片描述

  • 僵尸进程通常是无法再进行管理的,所以我们不能直接杀kill掉它,而是交给操作系统来处理这个进程。

4.1 僵尸进程危害

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

五、孤儿进程

  • 孤儿进程,顾名思义,没有父亲的进程就是孤儿进程,也就是,父进程创建了一个子进程,而父进程先退出了,就留下了子进程,这个时候这个进程就叫做孤儿进程

  • 我们再用上面的代码可以演示一下,运行起来后,杀死父进程,就留下一个子进程

在这里插入图片描述

  • 父进程是2200,当杀死父进程后,子进程的ppid就变成了1,就被操作系统接管了

本文介绍了Linux的进程概念,补充了一些概念,最后讲解了僵尸进程和孤儿进程是什么原因造成的

相关文章:

Linux进程概念僵尸进程孤儿进程

文章目录 一、什么是进程二、进程的状态三、Linux是如何做的&#xff1f;3.1 R状态3.2 S状态3.3 D状态3.4 T状态3.5 t状态3.6 X状态3.7 Z状态 四、僵尸进程4.1 僵尸进程危害 五、孤儿进程 一、什么是进程 对于进程理解来说&#xff0c;在Windows上是也可以观察到的&#xff0c…...

实体店如何引流成交裂变?打造流量新引擎的秘诀

在数字化浪潮席卷的今天&#xff0c;实体店经营面临着前所未有的挑战与机遇。社区店作为连接居民日常生活的桥梁&#xff0c;如何在激烈的市场竞争中脱颖而出&#xff0c;实现引流、成交与裂变&#xff0c;成为摆在每一位实体店创业者面前的重要课题。 作为一名鲜奶吧开店5年的…...

蓝桥杯(日期问题纯暴力)

纯纯暴力&#xff0c;写的想吐&#xff0c;玛德服了。 但是复习了vector去重方法&#xff0c;日期的合法性判断。 #include <iostream> #include <vector> #include <cstring> #include <algorithm>using namespace std; vector<int> res; st…...

ES: ES+Kibana 环境部署

ESKibana 部署 机器信息 10.10.8.62 10.10.8.63 10.10.8.64版本选择&#xff1a;6.8.1 基础环境优化 所有节点 # 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service# 查看selinux getenforce # 关闭selinux setenforce 0 # 永久关闭se…...

Find My产品越来越得到市场认可,伦茨科技ST17H6x芯片赋能厂家

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…...

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…...

Python办公自动化之PDF(二)

Python操作PDF二 1、PyMuPDF简介2、 1、PyMuPDF简介 PyMuPDF&#xff08;也称Fitz&#xff09;开源&#xff0c;提供了一整套用于处理PDF文件的综合工具。使用PyMuPDF&#xff0c;用户可以高效地执行打开PDF、提取文本、图像和表格、操作旋转和裁剪等页面属性、创建新PDF文档以…...

登录失败重试次数安全设计方案

1、登录失败重试次数设计方案 1、无论是账号还是密码错误&#xff0c;统一提示&#xff1a;用户名或密码错误&#xff0c;账号剩余登录次数N&#xff01; 2、同一账号连续登录失败5次&#xff0c;锁定该账号5分钟&#xff0c;5分钟后可以再重试登录。 开发设计 key&#xff…...

Django——模板

Django——模板 Django 提供一种动态生成 HTML 页面 —— 模板 1、模板语言 模板语言(DTL): 变量 &#xff0c; 注释 &#xff0c; 标签 &#xff0c; 过滤器 &#xff0c; 模板继承 1、变量 <body> <!-- 这个是前端中的注释 --> {# 这种是Django中模板语言的…...

角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…...

Windows下 OracleXE_21 数据库的下载与安装

Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮&#xff0c;进去到下载页面&#xff08;选择对…...

新手如何快速上手学习单片机?

读者朋友能容我&#xff0c;不使博文负真心 新开专栏&#xff0c;期待与诸君共享精彩 个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《单片机》 学习单片机是一个有趣且有挑战性的过程。单片机是一种微控制器&#xff0c;广泛应用于各种电子设备和嵌入式系统中。在这…...

grpc的验证器

简介 在使用grpc库时候 ,很多时候我们需要对反序列化的参数进行校验,代码中有很多参数校验的代码&#xff0c;如果手动实现&#xff0c;会非常繁琐&#xff0c;对于grpc来说&#xff0c;在定义proto的时候使用直接定义参数的限制规则是一种更合理、更优雅的方式&#xff0c;插…...

无法找到concrt140.dll怎么办?concrt140.dll丢失的5种解决方法

在我们使用计算机的时候&#xff0c;偶尔会遭遇一些技术问题&#xff0c;其中一个比较常见的问题就是出现了"丢失concrt140.dll文件"的提示。当我们的电脑告诉我们缺少了concrt140.dll文件时&#xff0c;常常是因为某些程序无法找到这个文件而导致了程序的运行异常。…...

Elasticsearch 分享

一、Elasticsearch 基础介绍 ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎&#xff0c;简称&#xff08;ES)&#xff0c; 成立于2012年&#xff0c;是一家来自荷兰的、开源的大数据搜索、分析服务提供商&#xff0c;为企业提供实时搜索、数据分析服务&#xff0c;…...

cpu masks的初始化

在内核中&#xff0c;有几个位图变量是用作标识cpu数量和状态的&#xff0c;它们分别是&#xff1a; 变量名称用途循环所使用的宏cpu_possible_mask系统中有多少个可以运行的cpu核for_each_possible_cpucpu_present_mask系统中有多少个可处于运行状态的cpu核for_each_present_…...

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…...

视频极速切割无损工具免费版,亲测好用!

问题描述 最近想兼职做自媒体&#xff0c;最初想法是想把视频资源下载到本地&#xff0c;本地做一些剪辑和图文配音发布到自媒体app上&#xff0c;但是要把视频(腾讯视频qlv转mp4看我上一篇文章&#xff0c;也是免费版)切割成一小段的片段用手机剪太费劲了&#xff0c;网上好多…...

LightDB ecpg 支持 exec sql execute ... end-exec【24.1】【oracle 兼容】

LightDB 从24.1 版本开始支持 oracle pro*c 中执行匿名块的语法&#xff08;之前可以通过do 语句执行匿名块&#xff09;&#xff1a; EXEC SQL EXECUTEanonymous block END-EXEC;因为匿名块不是SQL标准的一部分&#xff0c;所以此用法也不存在于SQL标准中。 示例 #include …...

菜品检测,基于YOLOV8

菜品检测&#xff0c;基于YOLOV8NANO&#xff0c;训练得到模型PT&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C/PYTHON/ANDROID开发菜品检测&#xff0c;基于YOLOV8&#xff0c;能检测五种菜品&#xff0c;水豆腐、豆腐干、空心菜、豆芽菜、茄子...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...