Linux —— 进程状态

目录

一,进程状态分类

二,僵尸进程

三,孤儿进程


一,进程状态分类

        进程状态反应进程执行过程中的变化,状态会随外界条件的变化而转换;

  • 三态模型,运行态、就绪态、阻塞态;
  • 五态模型,新建态、终止态、运行态、就绪态、阻塞态;

查看内核路径:..\linux-6.4.3\fs\proc\array.c

  • R(running),运行状态;
    • 进程不一定在运行中,可在运行中或在运行队列;
  • S(sleeping,也可称可中断睡眠interruptible sleep),睡眠状态(浅度睡眠);
    • 进程在等待事件完成;可被再次唤醒;是一种等待状态;
  • D(disk sleep,也可称不可中断睡眠uninterruptible sleep),磁盘休眠状态(深度睡眠);
    • 通常会等待I/O的结束;且不可被杀死,即使是操作系统;是一种等待状态;
  • T(stopped),停止状态;
    • 可发送SIGSTOP信号停止进程,也在可发送SIGCONT恢复进程继续运行;
  • X(dead),死亡状态
    • 只是返回状态,不会在任务列表中看到;
//查看进程状态命令
ps aux / ps axj
[wz@192 ~]$ ps axj | head -1 && ps axj | grep bash$
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
  2906   2922   2922   2922 pts/0      2922 Ss+   1000   0:00 bash
  2906   2980   2980   2980 pts/1      3253 Ss    1000   0:00 bash

//运行状态
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
  8090   8096   8090   2922 pts/0      8090 R+    1000   0:04 ./target
//浅度睡眠 S+前台运行
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
  8090   8096   8090   2922 pts/0      8090 S+    1000   0:02 ./target
//浅度睡眠 S后台运行(可命令后加&,使用kill退出)
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
  2922   8902   8902   2922 pts/0      2922 S     1000   0:02 ./target

[wz@192 Desktop]$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
//暂停进程操作,19是暂停信号标签,13482进程PID
[wz@192 ~]$ kill -19 13482 
//暂停后会出现以下提示
[1]+  Stopped                 ./target
//唤醒进程操作,18是暂停信号标签,13482进程PID
[wz@192 ~]$ kill -19 13482 
//停止状态
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
  2922  13482  13482   2922 pts/0      2922 T     1000   0:14 ./target

二,僵尸进程

        僵尸状态(zombie)是一个比较特殊的状态;进程已结束,但其父进程并没有及时回收其资源(如调用wait或waitpid等函数),形成“僵尸”状态;即当进程退出而父进程没有读取子进程退出的返回代码;

  • 僵死进程会以终止状态保持在进程列表中,且会一直在等待父进程读取退出状态代码;
  • 子进程退出,父进程还在运行,但父进程未读取子进程的状态,即子进程进入Z状态;
  • 进程退出状态会一直维持下去,一直处于Z状态;
  • 维护退出状态本身需数据维护(属进程基本信息,保存在task_struct);
#include <stdio.h>
#include <stdlib.h>

int main()
{
    pid_t id = fork();

    if(id < 0)
    {
        perror("fork");
        return 1;
    }
   else if(id > 0)    
   {    
       printf("farther[%d] is sleeping...\n", getpid());    
       sleep(30);    
   }    
   else    
   {    
       printf("child[%d] is begin Z...\n", getpid());    
       sleep(5);    
       exit(EXIT_SUCCESS);                                                           
   }    
   return 0;    
}  
//运行并监视
[wz@192 ~]$ while :; do ps aux | grep target | grep -Ev 'grep|pulseaudio'; sleep 1; echo
"###########"; done 
###########
wz         5766  0.0  0.0   4216   352 pts/0    S+   19:04   0:00 ./target
wz         5767  0.0  0.0      0     0 pts/0    Z+   19:04   0:00 [target] <defunct>

僵尸进程危害

  • 占用系统资源,会造成内存资源浪费,内存泄露;
  • 影响系统性能;
  • 安全漏洞;

避免僵尸

  • 及时回收;
  • 避免长时间运行;
  • 注册信号处理函数;

三,孤儿进程

  • 父进程提前退出,其子进程就会成为“孤儿进程”;
  • 孤儿进程会被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)
    {
        printf("I am child, pid : %d\n", getpid());
        sleep(10);
    }
    else
    {
        printf("I am parent, pid: %d\n", getpid());
        sleep(3);
        exit(0);
    }
    return 0;
}
//运行并监视
[wz@192 ~]$ while :; do ps axj | head -1 && ps axj | grep target | grep -Ev 'grep|pulseaudio'; sleep 1; echo "###########"; done 
###########
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
  2922   6740   6740   2922 pts/0      6740 S+    1000   0:00 ./target
  6740   6741   6740   2922 pts/0      6740 S+    1000   0:00 ./target
###########
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     1   6741   6740   2922 pts/0      2922 S     1000   0:00 ./target

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值