进程、线程、子进程、僵尸进程、孤儿进程,这一篇就够了

进程、线程与子进程

1.定义

进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

线程:线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

子进程:子进程指的是由另一进程(父进程)所创建的进程。

进程和线程在与粒度不同,进程之间的资源无法共享,但是线程可以。线程一定会依附在进程上运行。

2.举例

  • 在Windows下开一个IE浏览器, 这个IE浏览器是一个进程
  • 用浏览器去打开一个pdf, IE就去调用Acrobat去打开, 这时Acrobat是一个独立的进程, 就是IE的子进程
  • IE本身同时开了2个网页, 这两个网页的执行就是IE自己通过两个线程实现的。

3.子进程创建方法

使用fork()函数在父进程内创建一个新的进程(子进程)。使用fork()函数得到的子进程是父进程的复制品,子进程完全复制了父进程的资源,包括进程上下文、代码区、数据区、堆区、栈区、内存信息、打开文件的文件描述符、信号处理函数、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等信息,而子进程与父进程的区别有进程号、资源使用情况和计时器等。


僵尸进程

1.定义

当一个子进程退出后,其父进程还在继续执行,子进程的退出信息并没有被父进程接收到,但是一个进程的退出信息必须被父进程或一些有联系的进程接收到,所以当前进程会一直处于僵死状态。

处于僵尸状态的进程会一直等待其父进程读取其退出信息。
所以,只要子进程退出,而父进程还在执行,但父进程没有读取子进程的状态信息,则子进程会变成一个僵尸进程。

2.为什么子进程的退出信息要被接收到呢?

因为一个进程的退出方式有三种(程序执行完结果正确即正常退出,程序执行完结果不正确,程序还没有执行完),父进程必须要知道子进程到底是以何种状态退出的,如果子进程不是正常退出,则父进程还要创建子进程执行这件事。

3.解决方法

因为僵尸进程会占用进程号,但是进程号是有限的。如果产生大量的僵尸进程,就会导致系统无法创建新的进程。
解决方法主要有两个:
如果是

  • 主进程不是起的服务,那么直接杀死父进程,使僵尸进程变为孤儿进程(后面会介绍),孤儿进程会由init进程回收。
  • 子进程在退出时,会给父进程传送sigchid信号,那么在父进程中建立接收sigchid信号的函数,就可以捕获子进程的状态信息,避免僵尸进程的产生。

孤儿进程

1.定义

孤儿进程是没有父进程的进程,回收孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,init进程会负责孤儿进程的回收,因此孤儿进程不会产生什么危害


参考博客

僵尸进程和孤儿进程
僵尸进程
fork子进程的执行顺序和过程1
fork子进程的执行顺序和过程2

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micheal_YCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值