Linux-僵尸进程、孤儿进程、守护进程

 

1、进程分类

1.1 什么是进程?

从操作系统角度,进程就是操作系统对运行中程序的描述,通过这个描述可以对程序进行控制,进程相当于一个PCB(进程控制块)。

如何描述进程?

Linux下,PCB实际上是一个 struct task_struct { … }结构体,存在于Linux内核,会被装载到RAM(随机存取存储器)里,包含着进程的信息。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

进程如何描述运行中的程序?
  1. 内存指针:放的是程序在内存中加载的地址,让操作系统能够通过这个描述找到程序在哪里。
  2. 程序计数器:CPU的分时机制,CPU在每一个进程上只运行很短一段时间,进行轮询调度。CPU在调度的时候,需要将指令和数据要加载到寄存器中,一旦切换调度,就会覆盖上一个进程的这些数据,造成轮询再次回来就不知道上一次将这个进程执行到哪里了。因此每一次CPU的轮转,都要记录CPU下一次执行的指令地址。
  3. 上下文数据:保存程序上一次在CPU上执行的数据
  4. 标识符PID:进程ID
  5. 状态:任务状态、退出代码、退出状态等
  6. 优先级:交互式进程优先级max;批处理进程优先级min
  7. 记账信息:进程在CPU上运行的时间
  8. IO信息:包括显示的I/O请求、分配给进程的I/O设备、和被进程使用的文件列表
  9. 其他信息
查看进程:

如何查看进程?
答:ps -ef / ps -aux / ps -axj 查看进程信息

ps -ef 中,UID:用户     PID:进程ID     PPID:父进程ID     STIME:运行起始时间     TTY:终端,TTY是?的进程没有终端,是后台进程。命令-tty:查看当前终端是几号终端     TIME:在CPU上所运行的时间 CMD:程序名称

ps -aux 中,%CPU:CPU使用率     %MEM:内存使用率     VSZ:虚拟内存使用大小     RSS:物理内存使用大小     TTY:终端     STAT:当前进程状态
STAT一栏中,如果后面有+,则表示该进程是前台进程,在终端上运行的进程
                       如果后面没有+,则表示该进程是后台进程

3种进程状态:运行、就绪、阻塞

Linux下的进程状态:

1、运行态R(运行、就绪)    2、可中断休眠状态S    3、不可中断休眠状态D    4、停止状态T    5、僵死状态Z    6、死亡状态X    7、追踪状态T



1.2 僵尸进程

僵尸进程:是处于僵死状态的进程。(进程已退出,但是资源没有完全被释放)

僵死状态:是一种特殊状态,只要子进程退出,父进程还在运行,但是父进程没有读取子进程的退出状态,那么子进程就进入僵死状态,成为僵尸进程,僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程来读取它的退出状态码。

僵尸进程的产生过程:

1、子进程先结束,父进程还在继续运行(产生僵尸进程):子进程退出时,为了保存退出原因,资源并没有被完全释放,操作系统会通知父进程来获取子进程的退出原因,并释放子进程的所有资源。但是如果父进程没有关注子进程的退出状态(没有调用wait/waitpid),则子进程进入僵死状态,成为僵尸进程。
2、父进程先结束,子进程再退出(不会产生僵尸进程):父进程并没有等待子进程结束而自己先结束,不会产生僵尸进程,因为:当每个进程结束时,系统都会查看当前系统中运行的所有进程,查看是否存在刚刚结束进程的子进程还在运行,如果存在,就由init进程来接管该子进程,成为它的父进程。

僵尸进程举例:


先杀死子进程:kill PID
在这里插入图片描述
子进程处于僵死状态,该子进程就是僵尸进程。


先杀死父进程:kill PID
在这里插入图片描述在这里插入图片描述
杀死父进程后,子进程还存在,并没有成为僵尸进程。


总结:只有子进程先退出,父进程在运行,并且父进程没有调用wait/waitpid时,子进程才能成为僵尸进程。


强杀能否杀死僵尸进程?

在这里插入图片描述

总结
kill PID:杀死这个进程。
kill -9 PID:强杀杀死这个停止进程
kill -9 PID:强杀杀不死这个僵尸进程。只有杀掉父进程,僵尸进程才能退出。



僵尸进程的避免:进程等待
僵尸进程的处理:退出父进程

僵尸进程杀不死,但杀掉父进程,僵尸进程就没了。因为想要僵尸进程退出,就要通知父进程,父进程挂了,就不用退出了,僵尸进程自然就没了。

僵尸进程的危害:
  1. 进程的退出状态必须被维持下去,父进程一直不读取,子进程就一直处于僵死状态。
  2. 维护退出状态本身就是需要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,僵死状态一直不退出,PCB一直都要维护。
  3. 由于数据结构对象本身就要占内存,这会造成内存资源浪费。
  4. 内存泄漏。



1.3 孤儿进程
孤儿进程的产生:

父进程先于子进程退出,子进程就会成为孤儿进程,被1号进程收养,运行在后台。
子进程的PPID是1:
在这里插入图片描述
被下面这个1号进程收养了:
在这里插入图片描述
引申:ps -ef
PID=1:孤儿院进程
PID=2:内核进程
在这里插入图片描述在这里插入图片描述
大部分不带[ ]的进程其父进程都是1号进程;
大部分带[ ]的进程其父进程都是2号进程(内核进程)。


查看孤儿进程:

子进程变成孤儿进程,ps   -aux 中STAT(当前进程状态)后面的+没有了,运行在后台;但是用 ps   -ef 查看,PPID依然存在,所以孤儿进程依然有父进程,只不过它的父进程是孤儿院;PID==1的进程就是孤儿院,领养了该孤儿进程,成为它的父进程。


孤儿进程并不会成为僵尸进程!

因为1号进程尽职尽责,子进程退出后直接就回收了,不会成为僵尸进程。


init 1 号进程

1 号进程都会时刻扫描其子进程的状态,发现是僵尸进程就会马上去释放它的资源;
但是,父进程是1号进程的进程也是有可能成为僵尸进程的:比如:该进程还在被其他进程使用;该进程主线程死掉了,其他线程还在执行…




1.4 守护进程 / 精灵进程
守护进程的产生:

守护进程是特殊的孤儿进程,它在孤儿进程的基础上,脱离终端脱离登录会话,通常运行在后台,默默地工作,不希望受到终端会话断开的影响

查看守护进程:

ps -aux中,进程信息以d(deamon)结尾的都是守护进程 — 后台服务。
在这里插入图片描述
xshell能够远程操作虚拟机,就是通过sshd远程登录服务完成的。
在这里插入图片描述
引申:&命令
作用:在后台运行程序
cp -r /usr/* test & :将/usr目录下的所有子目录及文件复制到/root/test目录下的工作放在后台运行。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值