进程、线程与子进程
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
|