0. 前言
嗨害嗨,来了嗷~,无论是在Linux操作系统中,还是在Windows操作系统中,进程管理都是十分重要的一环,这篇文章呢?我想来聊聊在Linux操作系统下对于进程的管理中,进程状态的这一部分。
先附上一个通用操作系统概念下的进程的状态的图片:(这图百度找的~)
1. Linux操作系统下进程状态
运行状态(R : running):
Linux操作系统会给每个CPU提供一个RunQueue(运行队列),当进程PCB(task_struct)连入RunQueue中,我们就说这个进程处于运行状态
阻塞状态(S : sleeping):
Linux操作系统为了管理外部设备(先描述,在组织),每个设备在内核中会有一个struct device,每个struct device中会有一个struct task_struct *wait_queue属性,当操作系统将一个进程从CPU的RunQueue队列中剥离出来,连入wait_queue中,CPU不再对该进程进行调度,此时,我们称为该进程的状态是阻塞状态。
D : dist sleeping 深度睡眠
为什么会有这个进程?
当进程在完成一些大数据量的读写操作(读或者写500G类似这样的操作)
操作系统不会杀死这样的进程,因为如果在读写的过程中出现了问题,这样的进程又被杀死了,会造成大量数据的丢失。(很严重!!!)
T : stopped
非法但不致命的操作,就可能会被操作系统终止掉。
kill -19 pid
kill -18 pid
t : tracing stopped 追踪停止状态
断点
gdb打断点让程序停下来的本质是当前进程停下来了
调试器进程启动,调试器进程中启动另一个进程。
Z : zombie X : dead
$? 最后程序退出时的退出信息
为什么需要这两个状态:
因为一个进程被创建出来,一定是带着任务来的,任务完成的怎么样?要告诉父进程。
Z : zombie
父进程活着不回收子进程,子进程结束,
Defunct 失效的 代表进程已经退出
会导致系统级别的内存泄漏,操作系统是常驻进程,内存泄漏很危险。
孤儿进程的父进程
1 systemd(initd) 系统 会领养孤儿进程。
孤儿进程会变成后台进程
systemd(initd)为什么不会领养僵尸进程呢?
systemd(initd)主要用于接收正在运行的程序,僵尸进程已经死亡,任务已经完成。
2. 谈一个另外的概念
挂起:
内存资源严重不足,PCB留着,代码和数据换出到磁盘中,操作系统在将PCB放入runqueue中之前,将阻塞该运行,将代码和数据唤入内存。swap交换分区专用于换出唤入
被换出的进程,此时的状态是阻塞挂起状态
还会有运行时挂起的机制,处于runqueue中较后面的位置,风险比较大
用时间换空间!在服务器计算机中一般swap分区功能是被禁止的。
标签:状态,struct,一览,内存,Linux,进程,操作系统 From: https://blog.csdn.net/2401_89383526/article/details/144376012