本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
一、僵尸进程
在 Linux 系统中,僵尸进程(Zombie Process)是一种特殊的进程状态,是指一个子进程执行完成后,其父进程尚未读取其退出状态、没有对其资源和状态信息进行回收,导致该子进程一直存在的特殊状态。
僵尸进程的产生通常有以下两种原因:
- 父进程未回收子进程资源
- 当一个子进程终止时,会向其父进程发送一个 SIGCHLD 信号,向父进程通知其退出状态。如果父进程没有调用 wait() 或 waitpid() 来读取子进程的退出状态并回收资源,子进程就会成为僵尸进程
- 父进程先于子进程结束
- 当一个子进程还未终止时,其父进程先于该子进程结束,则该子进程会变为孤儿进程,进而产生僵尸进程
- 比较特殊的是,孤儿进程可以被系统的 init 进程(进程号为 1)接管,init 进程可以清理这些孤儿进程产生的僵尸进程
僵尸进程虽然不再占用 Linux 系统的 CPU 资源,但仍然会占用内存资源,并在系统进程表中占用位置以保留部分信息(如 PID、退出状态等)。如果系统中存在大量僵尸进程,可能导致进程表耗尽,从而无法创建新的进程,进而影响系统性能和稳定性。
二、进程状态
在 Linux 系统中,进程(Process)和线程(Thread)均由 task_struct{} 结构表示。
task_struct{} 结构实质上表示任务(Task),是 Linux 系统中调度的基本单位,通常为了简明将其统称为进程。
Linux 进程从创建(Fork)到终止(Exit)的状态转换过程如下图。
从图中可以看到,当一个进程创建并进入活动周期后,可以在以下两种状态之间进行转换:
- 运行状态 (Running State)
- 运行状态通常表明进程可能处于以下两种情况
- 进程正在运行中(已经获取到 CPU 资源)
- 进程位于运行队列中(已经就绪,随时可以运行)
- 通过 ps ef 命令查看时,处于该状态的进程具有 “R” 标识
- 运行状态通常表明进程可能处于以下两种情况
- 休眠状态 (Sleeping State)
- 休眠状态通常表明进程正在等待特定资源(如磁盘 I/O),可以细分为 2 种子状态
- TASK_INTERRUPTIBLE:该状态可以中断。通过 ps ef 命令查看时,处于该状态的进程具有 “S” 标识
- TASK_UNINTERRUPTIBLE:该状态无法中断。通过 ps ef 命令查看时,处于该状态的进程具有 “D” 标识
- 休眠状态通常表明进程正在等待特定资源(如磁盘 I/O),可以细分为 2 种子状态
当一个进程终止并调用 do_exit() 期间,还有两种与进程终止相关的状态:
- EXIT_DEAD:此状态表示进程真正退出的时间
- EXIT_ZOMBIE:此状态就在 EXIT_DEAD 之前发生,这就是通常所说的 zombie 进程