进程这辈子

我见过许多描述进程周期的说法,觉得以下描述颇具意思,希望分享。

                     |(fork)-----------------------|(exec)-------|(return,exit,..)-------|(完全消失)

不存在的生命->生命的开始,但只是克隆体->生命的升华->生命的结束,只剩尸体->完全消失

                                                              图1

进程也是有生命的,它有它的一辈子。最开始它完全不存在,某个时刻某个进程内执行了一次fork(),于是一个新生命就诞生了,他有自己的ID号(pid),它知道自己的父亲是谁(ppid),但是它只是父亲的一个克隆体,从父亲那儿继承了父亲的大部分财产,但是它只是一个父亲的克隆,没有太多生命的意义。直到某天自身的一次exec(),给它带来了新的生命力,生命得到升华,进入了生命的黄金阶段。后来生命结束了,也许是自然死亡(程序运行结束),也许是被意外死亡(exit,return),什么财产也没有了,只剩下一句尸体(zombie),以及一些其他进程看不懂的遗书,而这个遗书只有前来验尸的wait或waitpid才能看懂。父亲进程会去询问wait或waitpid孩子死前留下的遗言,也许不去理会。当验尸完后,进程也就从这个世界上的消失了。

一般来说,死去的进程都会让wait或waitpid来验尸,然后才让它消失。但是那么一些进程很苦,生下来就被这个世界忽略忽视,生下来之前就被signal(SIGCHLD,SIGIGN)处理过了,它们死后马上消失,不会留尸体和任何的遗言。

传统的进程是幸福的,父亲那有什么东西,它就去索取相同的一份,所有东西都完全的克隆拷贝成另外一份。但后来系统觉得这样不公平,不允许这种资源的浪费。孩子完全可以共享父亲的资源啊,没必要自己也要去弄一份,除非孩子实在不喜欢父亲的某样东西了,想要去改变它时,系统才会给它相应的资源。所以这就是系统在产生子孩子时候惯用的一招写时拷贝策略(copy-on-write)。

有人会问,wait和waitpid是何许人也,只有他们有资格看死进程的遗书?因为它们是公务员(系统调用)啊,在sys/wait.h sys/types.h部门工作,人家有该权利。如果它们不负责,只是走过场,就会在开始的时候带WNOHANG的牌子,表明看一眼就走,这时候即使进程还没死,当叫到它们的时候,它们就简单的看一眼就走了。除非不要给它们带WNOHANG这个标记,那么它们就规规矩矩的一直等着进程死,并验尸完后,才能走。当然久等之下的它们肯定会有些抱怨,不如说这个死进程和你没任何关系啊之类的,关于这两个公务员的细节可以查看文档。

猜你喜欢

转载自scofield06.iteye.com/blog/1680119