进程状态补充
💦、补充说明
1、 S and S+
一般在命令行上,如果是一个前台进程,那么它运行时状态后会跟 +。
也就是说前台进程一旦执行,bash 就无法进行命令行解释,ls、top 等命令都无法执行,只有 Ctrl + C 来进行终止:
如果想把一个进程放在后台可以 ./mytest &
:
其中对于后台进程,bash 可以对命令行解释:
但是你会发现 Ctrl + C 无法终止后台进程,只能对该进程发送第 9 号信号来结束进程:
2、 OS 描述的状态 and 具体的 Linux 进程状态
其中新建没有对应的 Linux 进程状态;就绪可对应到 Linux 进程中的 R;运行也可对应到 Linux 进程中的中的 R;退出可对应到 Linux 进程中的 Z/X;阻塞可对应到 Linux 进程中的 S/D/T;
所以 Linux 状态的实现和操作系统的实现是有点差别的。操作系统的所描述的概念是所有操作系统都遵守这样的规则,而 Linux 就是一种具体的操作系统规则。
3、僵尸进程的危害
- 进程的退出状态必须被维持下去,因为它要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于 Z 状态。
- 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在
task_struct(PCB)
中,换句话说,Z 状态一直不退出,PCB 一直都要维护。 - 那一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费,因为数据结构对象本身就要占用内存,想想 C 中定义一个结构体变量(对象),就是要在内存的某个位置进行开辟空间。
- 内存泄漏。
- 如何避免,后面再谈。
4、孤儿进程
父进程如果提前退出,那么子进程就是 孤儿进程
,那么子进程退出,进入 Z
之后,该怎么处理 ❓
可以看到 5 秒前有 2 个进程,5 秒后父进程死亡了(这里没有被僵尸的原因是父进程也有父进程 23178 -> bash),只有 1 个子进程。这里我们称没有父进程的子进程为孤儿进程
,此时孤儿进程
会被 1号进程
领养,它是 systemd(操作系统),此时操作系统就可以直接对我回收资源。 且进程状态会由前台转换为后台,后台进程可以使用 第 9 号信号
来结束进程。
5、1 号进程
操作系统启动之前是有 0号进程
的,只不过完全启动成功后,0号进程
就被1号进程
取代了,具体的取代方案,后面学习 进程替换
时再谈。可以看到 pid 排名靠前的进程都是由 root 来启动的。注意在 Centos7.6 下,它的 1号进程
叫做systemd
,而 Centos6.5 下,它的 1号进程
叫做initd
。
- 点赞
- 收藏
- 关注作者
评论(0)