首页 > 系统相关 >【Linux】进程状态

【Linux】进程状态

时间:2024-03-14 22:02:07浏览次数:28  
标签:状态 退出 sleep Linux 进程 include id

1 Linux内核源代码

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在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 */
};
  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

2 进程状态查看

ps aux / ps axj 命令

休眠状态---进程在等待资源就绪

kill -19 暂停

kill -18 继续

T是比较纯粹的暂停,t是由于被追踪而暂停下来

3 Z(zombie)-僵尸进程

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

来一个创建维持30秒的僵死进程例子 :

#include <stdio.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id > 0)
    {  
        //parent
        printf("parent[%d] is sleeping...\n", getpid());
        sleep(30);
    }
    else
    {
        printf("child[%d] is begin Z...\n", getpid());
        sleep(5);
        exit(EXIT_SUCCESS);
    }
    return 0;
}

 

4 僵尸进程危害

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

孤儿进程 

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
  • 父进程先退出,子进程就称之为“孤儿进程”
  • 孤儿进程被1号init进程领养,当然要有init进程回收喽
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id == 0)
    {   
        //child
        printf("I am child, pid : %d\n", getpid());
        sleep(10);
    }
    else
    {
        //parent
        printf("I am parent, pid: %d\n", getpid());
        sleep(3);
        exit(0);
    }
    return 0;
}

 

标签:状态,退出,sleep,Linux,进程,include,id
From: https://blog.csdn.net/m0_74722801/article/details/136693282

相关文章

  • Linux从入门到精通(二)
    一、Linux命令格式command[-options][parameter]command命令行本身-options[可选,非必填]命令行的一些选项,可以通过选项控制命令的行为细节。parameter[可选,非必填]命令的参数,多用于命令的指向目标。语法的[],表示可选非必填的意思示例:ls-l/home/demo,ls是命令本身......
  • 进程间通信的六种方式
    每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核一、管道匿名管道通过fork()系统调用创建的子进程与父进程之间的通信通道,另外还可以通过以下操作实现非父子进程之间的通信catxxx|wc-l命名管......
  • Linux下/etc/profile、~/.bash_profile等几个文件的执行过程
    介绍/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置。/etc/bashrc:为每一个运行bashshell的用户执行此文件.当bashshell被打开时,该文件被读取(即每次新开一个终端,都会执行bashrc......
  • 没有有线网卡的笔记本如何在PVE下All in one?—NAS + Linux +win下载机
    没有有线网卡的笔记本在PVE下Allinone|NAS+Linux+Win下载机(保姆级未完成版)  目录:1、前言2、PVE的安装3、PVE联网前的准备工作4、PVE使用无线网卡进行联网5、PVE无线网卡的桥接6、PVE下创建虚拟机:NAS+Linux+Win下载机 1、前言十年前的旧笔记本,吃......
  • 数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)
    本期作者前言云原生时代下,Kubernetes已成为容器技术的事实标准, 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言, 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务, 方案的复杂度就以几何倍数增长, 例如分布式应用多个实例间的依......
  • 3/14学习进程
    大二学期第三周日报 第一天第二天第三天第四天第五天所花时间(包括上课) 210min90min 150min 0min 代码量(行) 350 200 250 0 博客量(篇) 1 1 1 1 了解到的知识点编写安卓增删改查,使用sqlite存储数据 ......
  • Linux源码安装nginx1.20.2
    下面是关于Linux源码安装nginx1.20.2的操作流程目录前言1,安装准备1.1下载安装包 1.2上传安装包1.3解压  1.4关闭防火墙和selinux2,安装 nginx依赖库以及编译环境2.1安装nginx依赖库 2.2执行configure脚本生成makefile配置文件2.2.1可能出现的错误 3,......
  • Linux用户与权限
    Linux用户与权限用户、用户组概述Linux是多用户多任务操作系统,支持多个用户在同一时间内登陆,不同用户执行不同的任务,并且互不影响。不同用户具有不同的操作权限,每个用户在权限允许的范围内完成不同的任务。权限最高的用户叫做root,称之为超级管理员用户。用户组是具......
  • Linux文件权限管理命令
    文件权限管理命令概述文件权限分为3种:读r、写w、执行x;文件归属分为3类:user、group、other;为了便于权限管理,每个权限都有对应的数字:0表示没有权限、4表示读权限、2表示写权限、1表示执行权限方式1:数字表示法chmod777-R文件|文件夹其中-R用于递归修改文件......
  • Linux软件安装
    Linux软件安装rpm包管理器概述rpm是RH系列Linux系统的包管理器(Red-HatPackageManager),也是RH系列安装的软件包后缀名。当下这套标准已经扩大成为了行业标准,不仅仅局限于RH系列Linux系统。rpm操作指的是使用rpm命令进行软件的查看、安装、卸载。rpm弊端:需要自己提前......