自学内容网 自学内容网

【Linux】僵尸进程、进程状态简介

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【K8s】专题十五(3):Kubernetes 网络之 Calico 插件理论


目录

一、僵尸进程

二、进程状态


一、僵尸进程

在 Linux 系统中,僵尸进程(Zombie Process)是一种特殊的进程状态,是指一个子进程执行完成后,其父进程尚未读取其退出状态、没有对其资源和状态信息进行回收,导致该子进程一直存在的特殊状态。

僵尸进程的产生通常有以下两种原因:

  • 父进程未回收子进程资源
    • 当一个子进程终止时,会向其父进程发送一个 SIGCHLD 信号,向父进程通知其退出状态。如果父进程没有调用 wait() 或 waitpid() 来读取子进程的退出状态并回收资源,子进程就会成为僵尸进程
  • 父进程先于子进程结束
    • 当一个子进程还未终止时,其父进程先于该子进程结束,则该子进程会变为孤儿进程,进而产生僵尸进程
    • 比较特殊的是,孤儿进程可以被系统的 init 进程(进程号为 1)接管,init 进程可以清理这些孤儿进程产生的僵尸进程

僵尸进程虽然不再占用 Linux 系统的 CPU 资源,但仍然会占用内存资源,并在系统进程表中占用位置以保留部分信息(如 PID、退出状态等)。如果系统中存在大量僵尸进程,可能导致进程表耗尽,从而无法创建新的进程,进而影响系统性能和稳定性。


二、进程状态

在 Linux 系统中,进程(Process)和线程(Thread)均由 task_struct{} 结构表示。

task_struct{} 结构实质上表示任务(Task),是 Linux 系统中调度的基本单位,通常为了简明将其统称为进程。

Linux 进程从创建(Fork)到终止(Exit)的状态转换过程如下图。

Linux 进程状态转换(来自《Linux 内核开发》)

从图中可以看到,当一个进程创建并进入活动周期后,可以在以下两种状态之间进行转换:

  • 运行状态 (Running State)
    • 运行状态通常表明进程可能处于以下两种情况
      • 进程正在运行中(已经获取到 CPU 资源)
      • 进程位于运行队列中(已经就绪,随时可以运行)
    • 通过 ps ef 命令查看时,处于该状态的进程具有 “R” 标识
  • 休眠状态 (Sleeping State)
    • 休眠状态通常表明进程正在等待特定资源(如磁盘 I/O),可以细分为 2 种子状态
      • TASK_INTERRUPTIBLE:该状态可以中断。通过 ps ef 命令查看时,处于该状态的进程具有 “S” 标识
      • TASK_UNINTERRUPTIBLE:该状态无法中断。通过 ps ef 命令查看时,处于该状态的进程具有 “D” 标识

当一个进程终止并调用 do_exit() 期间,还有两种与进程终止相关的状态:

  • EXIT_DEAD:此状态表示进程真正退出的时间
  • EXIT_ZOMBIE:此状态就在 EXIT_DEAD 之前发生,这就是通常所说的 zombie 进程


原文地址:https://blog.csdn.net/2401_82795112/article/details/143893586

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!