《Linux从练气到飞升》No.13 Linux进程状态

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

文章目录

    • 前言
    • 先看看Linux内核源代码怎么说
    • 认识进程状态
      • 新建
      • 阻塞
      • 运行
      • 挂起
      • 终止
    • 进程状态查看命令
    • Linux内核中的进程状态
      • R
      • S
      • D
      • S与D的区别:
      • T
      • X
      • Z
    • R+/S+/T+中的+是什么意思?
        • 僵尸进程危害
      • 孤儿进程
    • 后记

前言

前面我们讲述了进程的基本概念以及如何描述、组织、查看进程,如何使用fork函数创建子进程等内容,本篇将讲述进程的各种状态。

先看看Linux内核源代码怎么说

下面的状态在kernel源代码里的定义:

/*
* 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 */
};

认识进程状态

在我们讲述Linux内核中的进程状态之前,我们先在看一下网上是怎么个样子。

如下:
在这里插入图片描述

我们依次来解释一下它的含义

新建

新建:字面意思,就是创建以后还没有进入运行队列(如fork后)

阻塞

阻塞:我们都知道进程的代码数据在内存中,但是系统还有其他资源,如网卡、磁盘等…所以系统不止有一种队列,不同的队列速度不同,所以就会有时间差,阻塞状态就是CPU等待非CPU资源就绪的状态。

我们来验证一下:
比如有下面代码:

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d",&a);
	return 0;
}

这个等待输入的状态就是阻塞状态

运行

比如之前讲的task_struct结构在队列中排队就叫做运行态

挂起

和阻塞有点类似,但是它的区别是挂起状态会将进程的代码和数据换出到磁盘上,而阻塞时的进程代码数据仍在内存

终止

它是XZ两种状态的综合体,具体之后再讲~

进程状态查看命令

ps aux / ps axj 命令

在这里插入图片描述

Linux内核中的进程状态

R

R即表示运行态,并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

测试代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
    while(1)
    {

    }
    return 0;
}

运行结果:
在这里插入图片描述

S

阻塞态,意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。

我们都知道进程的代码数据在内存中,但是系统还有其他资源,如网卡、磁盘等…所以系统不止有一种队列,不同的队列速度不同,所以就会有时间差,阻塞状态就是CPU等待非CPU资源就绪的状态。

如下图:
在这里插入图片描述
这并不是真的S状态,为什么这么讲?因为你访问了外设,一旦访问外设的话,这个外设不一定说是立马给你准备好,即便是给你准备好了,其实你也要有一个让他那么获取你数据的过程。然后其实外设就比较慢,要等的话,其中你的进程状态大部分都是 s,所以你看到当前,它的状态就是 s 状态。

D

磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),它不可被中断、不可被动唤醒,在这个状态的进程通常会等待IO的结束。

S与D的区别:

  • 它们都是睡眠状态,几乎等价,但是S是可中断的,D不可中断。

那么D的意义是什么?
在操作系统中,当内存不足时,会自动杀死一些不用的进程,但是有些进程一旦终止,便可能造成数据丢失,操作系统就需要知道哪些不能被自动杀死,于是在S的基础上就有了D状态。

T

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

要注意和阻塞态的区别,它不用等待资源,比如打断点时。

测试断点:
在这里插入图片描述
在这里插入图片描述
上图中的 t 就是暂停状态。

X

死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态,它的作用是供给操作系统回收的,因为操作系统不会每时每刻都回收,而是过一段时间回收一次来提高效率。

到现在为止,我们对进程的概念停留在两个方面:

一、必须把自己的可执行程序和代码加载到内存中。

二、操作系统为了管理众多进程,它必须给每个进程都创建对应的PCB。

接下来我们来讲解两种特殊的进程,僵尸进程孤儿进程

Z

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程或者操作系统来进行回收。

只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

我们可以这样理解它,僵尸进程可理解为他们的代码和数据已经被释放掉,但PCB没有释放。

eg:假如有一个恶意程序。运行后就是让子进程退出,但父进程不回收他这样就会导致僵尸问题,让操作系统速度卡顿

验证代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
    pid_t pid=fork();
    if(pid<0)
    {
        perror("fork");
        return 1;
    }
    else if(pid==0)
    {
        while(1)
        {
            printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());
            sleep(3);
            break;
        }
        exit(0);
    }
    else
    {
        while(1)
        {
            printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());
            sleep(1);
        }
    }
    printf("you can see me!\n");

    return 0;
}

运行结果:
在这里插入图片描述
查看状态:
在这里插入图片描述
图中的Z就是僵尸状态,子进程已退出,但父进程还在运行,处于等待回收的被检测状态。

R+/S+/T+中的+是什么意思?

  • 带 + 为前台任务,一旦开始,就会占用bash对话框执行命令就没有任何效果了,而且可以被Ctrl + c 终止。
  • 如果要让它在后台运行,则使用./mycode & [任务号] pid,此时bash就看不到它的运行了,变成了R状态,终止命令:kill -9 pid,暂停命令:kill -19 pid,继续命令:kill -18 pid

僵尸进程危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。
可父进程如果一直不读取,那子进程就一直处于Z状态?
是的!

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,
换句话说,Z状态一直不退出,PCB一直都要维护?是的

那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?
是的!因为数据结构对象本身就要占用内存,想想C语言中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

是否会内存泄漏?是的!比如。 C语言写的程序中malloc后的资源不回收,此时导致的僵尸问题就是内存泄漏。

孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

父进程先退出,子进程就称之为“孤儿进程”

我们知道子进程一般由父进程回收,但是如果是上面这种情况,孤儿进程会被1号init进程领养,当然要由init进程回收喽。

为什么要被领养?

当子进程退出时,父进程已不在,需要由领养进程来进行回收。

验证一下:

#include<stdio.h>
#include <unistd.h>
int main()
{
	pid_t id = fork();
	if(id==0)
	{
		//child
		while(1){}
	}
	else
	{
		int cnt=5;
		while(cnt)
		{
			cnt--;
			sleep(1);
		}
	}
	return 0;
}
ps axj | head -1 && ps ajx | grep mycode

ps axj | head -1 && ps ajx | grep 2194

在这里插入图片描述

在这里插入图片描述

在一些较新的Linux发行版中,引入了--user选项,该选项会创建一个用户级的systemd实例,用于管理用户级别的服务和进程。

这个用户级的systemd实例的进程ID可能会出现在其他进程的PPID字段中,包括孤儿进程。

虽然孤儿进程的父进程通常是1号进程,但在这种情况下,用户级systemd实例的主进程可能会被记录为孤儿进程的父进程。

后记

本篇从操作系统常见的进程状态来引入到Linux内核中的进程状态,他们中的状态有所不同,但是其内核是一样的。比如R表示运行态、S表示阻塞态、D表示磁盘休眠态、 T表示暂停状态、X表示死亡状、 G表示相似状态、他们组合起来,分别对应的阻塞、运行、挂起、终止这些状态。我们还讲述了在我们查看进程状态时看到的加号是什么意思?以及讲述了两种特殊的进程状态,僵尸进程和孤儿进程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年国赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

aspose 使用ftl模板生成word和pdf

1 先找到word模板&#xff0c;用${}&#xff0c;替换变量&#xff0c;保存&#xff0c;然后另存为xml,最后把xml后缀改成ftl。 如下图&#xff1a; word 模板文件 ftl模板文件如下: 2 代码生成 下面函数将ftl填充数据&#xff0c;并生成word和pdf /*** * param dataMap 模板…

找到链表的第一个入环节点

1.题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

Docker 基本管理(一)

目录 一、虚拟化简介 1.1.虚拟化概述 1.2.cpu的时间分片&#xff08;cpu虚拟化&#xff09; 1.3.cpu虚拟化性性能瓶颈 1.4.虚拟化工作原理 1.5 虚拟化类型 1.6 虚拟化功能 ​二、Docker容器概述 2.1 docker是什么&#xff1f; 2.2 使用docker有什么意义&#xff…

正则表达式试炼

序 我希望在这里列出我很多想写的正则表达式&#xff0c;很多我想写&#xff0c;但是不知道怎么写的。分享点滴案例。未来这个文章会越来越长 前言 互联网时代&#xff0c;除了文本还有更好的学习方式&#xff0c;下面是几个不错的练习网站&#xff0c;如果你想系统地学习&a…

【C语言实战项目】通讯录

一.了解项目功能 在本次实战项目中我们的目标是实现一个通讯录: 该通讯录可以用来存储1000个人的信息 每个人的信息包括&#xff1a;姓名、年龄、性别、住址、电话 通讯录提供功能有&#xff1a; 添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有…

python中两个数据框之间的遍历

1.输入文件1 文件1&#xff1a;第一列是基因名字&#xff0c;列2&#xff1a;外显子起始位置&#xff0c;列3&#xff1a;外显子终止位置&#xff0c;列4&#xff1a;外显子的序号 2.输入文件2&#xff1a; 备注&#xff1a;列1&#xff1a;基因id&#xff1b;列2&#xff1a;…

Verdi_如何dump信号的驱动强度

Verdi_如何dump信号的驱动强度 需求背景 在Verilog语法标准中&#xff0c;0和1各自被分成了8个强度等级&#xff1b; Strength NameStrength NameStrength Levelsupply 0supply 17strong 0strong 16pull 0pull 15large 0large 14weak 0weak 13medium 0medium 12small 0small…

软件测试用例设计方法之因果图法

基本概念 因果图是一种利用图解法分析输入的各种组合情况&#xff0c;从而设计测试用例的方法&#xff0c;它适合于检查程序输入条件的各种组合情况。 设计测试用例的步骤 分析软件规格说明描述中, 哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件), 并给每…

『C语言初阶』第九章 -结构体

前言 今天小羊又来给铁汁们分享关于C语言的结构体&#xff0c;在C语言中&#xff0c;结构体类型属于一种构造类型&#xff08;其他的构造类型还有&#xff1a;数组类型&#xff0c;联合类型&#xff09;&#xff0c;今天我们主要简单了解一下结构体。 一、结构体是什么&#x…

Redis_缓存1_缓存类型

14.redis缓存 14.1简介 穿透型缓存&#xff1a; 缓存与后端数据交互在一起&#xff0c;对服务端的调用隐藏细节。如果从缓存中可以读到数据&#xff0c;就直接返回&#xff0c;如果读不到&#xff0c;就到数据库中去读取&#xff0c;从数据库中读到数据&#xff0c;也是先更…

基于微服务+Java+Spring Cloud +Vue+UniApp +MySql实现的智慧工地云平台源码

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移…

node.js+Vue+Express学生宿舍校舍系统-ggr80

关键词&#xff1a;智慧学生校舍&#xff1b;简洁方便直观&#xff1b; 本次的毕业设计主要就是设计并开发一个智慧学生校舍系统。使用数据库mysql。系统主要包括个人中心、学生管理、教师管理、宿管管理、外来人员管理、维修人员管理、学生信息管理、学生签到管理、学生物品管…

因果推断(四)断点回归(RD)

因果推断&#xff08;四&#xff09;断点回归&#xff08;RD&#xff09; 在传统的因果推断方法中&#xff0c;有一种方法可以控制观察到的混杂因素和未观察到的混杂因素&#xff0c;这就是断点回归&#xff0c;因为它只需要观察干预两侧的数据&#xff0c;是否存在明显的断点…

利用ChatGPT绘制思维导图——以新能源汽车竞品分析报告为例

随着人们对环境保护的日益关注和传统燃油汽车的限制&#xff0c;全球范围内对新能源汽车的需求不断增长。新能源汽车市场的激烈竞争使得了解各个竞品的特点和优劣成为关键。然而&#xff0c;针对这一领域的详尽竞品分析却常常需要大量时间和精力。 在此背景下&#xff0c;人工智…

音视频 vs2017配置FFmpeg

vs2017 ffmpeg4.2.1 一、首先我把FFmpeg整理了一下&#xff0c;放在C盘 二、新建空项目 三、添加main.cpp&#xff0c;将bin文件夹下dll文件拷贝到cpp目录下 #include<stdio.h> #include<iostream>extern "C" { #include "libavcodec/avcodec.h&…

【计算机网络】Udp详解

前言 上几文章我们讲解了应用层协议Http和Https&#xff0c;要知道应用层协议有很多&#xff0c;这些都是程序员自己定制的&#xff0c;而真正要传输的时候&#xff0c;是要在操作系统的传输层进行的&#xff0c;今天我们就来学习一下传输层协议Udp的 标识一个通信 要进行跨…

OSI七层模型和TCP/IP四层模型

OSI七层模型和TCP/IP四层模型 七层模型(OSI) OSI七层模型&#xff08;Open Systems Interconnection Reference Model&#xff09;是一个用于计算机网络体系结构的标准化框架&#xff0c;旨在定义网络通信中不同层次的功能和协议。 各个层次具体如下&#xff1a; 物理层&am…

MongoDB的下载和安装

一、MongoDB下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 二、安装 因为选择下载的是 .zip 文件&#xff0c;直接跳过安装&#xff0c;一步到位。 选择在任一磁盘创建空文件夹&#xff08;不要使用中文路径&#xff09;&#xff0c;解压之后把…

DaVinci Resolve Studio 18 for Mac 达芬奇调色

DaVinci Resolve Studio 18是一款专业的视频编辑和调色软件&#xff0c;适用于电影、电视节目、广告等各种视觉媒体的制作。它具有完整的后期制作功能&#xff0c;包括剪辑、调色、特效、音频处理等。 以下是DaVinci Resolve Studio 18的主要特点&#xff1a; - 提供了全面的视…