进程控制随笔

从程序员角度来说,我们可以认为进程总是处于以下3个状态之一:

  • 运行。进程要么在CPU上运行,要么在等待被执行且最终会被内核调度。
  • 停止。进程的执行被挂起suspend,且不会被调度。当收到SIGSTOP,SIGTSTP,SIDTTIN或者SIGTTOU信号时,进程就停止,并且保持到该进程收到一个SIGCONT信号的时候,在这个时刻,该进程才再次开始运行。
  • 终止。进程永远的停止了。进程停止的原因有三种:1)收到一个信号,该信号的默认行为是终止进程,2)从主程序返回,3)调用exit函数。

 

  fork函数创建子进程后,子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份拷贝,包括文本段,数据和bss段,堆以及用户栈,也就是说父进程和子进程所做的任何改变都是独立的,不会反应在另一个进程中。 此外子进程还将获得父进程任何打开文件描述符相同的拷贝,这就意味着子进程可以读写父进程中打开的任何文件。下图是Linux进程的内存空间模型。

                                       IMG_20120710_230537.jpg-1

 

                        wps_clip_image-16697

 

 

 

回收子进程

 

 

 

 

当一个进程由于某种原因结束的时候,内核并不是立即把它从系统中清楚。相反,进程被保持在一种已终止的状态中,直到被他的父进程回收。当父进程回收已终止的子进程的时候,内核将子进程的退出状态传递给父进程,然后抛弃已终止的子进程,从此刻开始,该进程才在内核中真正的消除。否则一个终止了但是还未被回收的进程成为僵尸进程。

关于进程与子进程

    新创建的子进程几乎但不完全与父进程相同。子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份拷贝,包括文本,数据和bss段,堆以及用户栈。子进程还获得了与父进程任何打开文件描述符相同的拷贝。

    父进程与子进程是并发执行的独立进程。内核可以以任意方式交替执行他们的逻辑控制流中的指令。

    再次强调,父子进程的地址空间是相同的,但是也是独立的。他们都有自己的私有的地址空间。父进程对数据的任何改变不会在子进程中体现出来。

posted @ 2012-07-13 09:05  鼻子很帅的猪  阅读(296)  评论(0编辑  收藏  举报