进程的概念

当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程。


Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行。我们大家常用的单CPU计算机实际上在一个时间片段内只能执行一条指令。那么Linux是如何实现多进程的同时执行的呢?原来Linux使用了一种称为” 进程调度 “的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多的进程中挑选一个投入运行,其他进程暂时等待,当正在运行的那个进程时间耗尽,或者执行完毕退出,或因某种原因暂停,Linux就会重新调度,挑选一个进程投入运行,因为每个进程占用的时间片段都很短,从使用者的角度来看,就好像多个进程同时运行一样。


在Linux中,每个进程在创建的时都会被分配一个数据结构,称为进程控制块(PCB)。PCB中包含了很多重要的信息,供系统调度和进程本事执行使用,其中最重要的莫过于进程的ID,进程的ID也被称为进程标示符,是一个非负的整数,在Linux操作性系统中唯一的标志一个进程。在最常使用的I386架构上,一个非负的整数的取值是0~32767,这也是我们所可能取到的进程ID,它就是进程的身份证号码。


僵尸进程的产生
僵尸进程就是已经结束的进程,但是还没有从进程表中删除。僵尸进程太多会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用系统资源。
在进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个为位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占用任何内存空间,它需要它的父进程来给它收尸,如果父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显示的忽略该信号,那么它就一直处于僵尸状态。如果父进程结束了,那么init进程会自动接手这个子进程,为它收尸,他还是能够被清除的。但是如果父进程是一个循环,不会结束,那么子进程就一直处于僵尸状态。


僵尸进程产生的原因:
每个Linux进程在进程表中都有一个进入点(Entry),核心程序在执行该进程时使用到的一切信息都存储在进入点。当使用ps命令查看系统中的进程信息时,看到的就是进程表中的相关数据。当fork系统调用建立一个新的进程以后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表中,这些信息中有一项是父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进程表中的数据会被该进程的退出码、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,僵尸进程的出现时间实在子程序终止后,但是父进程尚未读取这些数据之前。


如何避免僵尸进程
1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起
2、如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。
3、如果父进程不关心子进程什么时候结束,那么可以用“singal(SIGCHLD),SIG_IGN”通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号。
4、还有一些技巧,就是fork()两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收,不过子进程回收还要自己做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zxnsirius

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

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

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

打赏作者

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

抵扣说明:

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

余额充值