unix内核概述-进程管理

fork()和_exit()系统调用分别用来创建一个新进程和终止一个进程,而调用exec类系统调用则是装入一个新程序。这样当一个系统调用执行玩以后,进程就在所装入程序的全新地址空间恢复执行。

调用fork的进程是父进程,而新进程是他的子进程。父子进程能互相找到对方,因为每个进程的描述符都包含有两个指针,一个指向他的父进程,另一个指向他的子进程。

实现fork的一个天真形式就是讲父进程的数据和代码都复制,并且拷贝赋予子进程。_exit()调用终止一个进程。内核对这个进程的处理是释放进程所拥有的资源并向父进程发送SIGCHLD信号(默认操作忽略)来实现。

僵死进程:wait4系统调用允许进程等待,知道其中的一个子进程结束;它返回已终止的子进程的进程标识符pid。内核在执行这个系统调用时,检查子进程是否已经终止。引入僵死进程的目的是为了表示终止的进程:父进程在执行完wait4调用之前,进程就一直停留在那种状态。系统调用处理程序从进程描述符字段获取有关资源的一些数据;一旦得到数据,就可以释放进程描述符。当进程执行完wait4系统调用时如果没有子进程结束,内核通常把进程设为等待状态,一直到子进程结束。

在父进程发出wait4调用之前,让内核保存子进程的信息是一个良好的习惯,但是假设父进程没有发出wait4系统调用呢,这些信息一直保存在内存中,显然这是不愿意看到的。

一个解决方法是:使用一个名为init的特殊系统进程,他在系统初始化的时候创建,当一个进程结束时,内核改变其所有现有子进程的进程描述符指针,使这些子进程成为init的孩子,init监控所有子进程的执行,并且按常规发布wait4系统调用,其副作用就是除掉所有的僵死的进程。

进程组:每个进程描述符包括一个包含进程ID的字段。每一个进程组可以有一个领头的进程。新建的进程最初被插入到父进程的进程组中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值