那些关于UNIX进程的话题

来源:互联网 发布:阿里云备案系统 编辑:程序博客网 时间:2024/05/16 07:29

fork和vfork的区别

  • fork是什么,干嘛用的?
    一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的副本,这意味着父子进程间不共享这些存储空间。UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。
  • vfork是什么,干嘛用的?
    根据上述的fork描述可知,子进程持有父进程的副本,需要将父进程的相关东西复制一份给子进程,但是如果子进程执行exec类似的函数后,上述拷贝工作是浪费的、无效的,因为exec会重新建立新的进程环境,而不需要父进程的任何信息,由此看来,之前的拷贝确实是多余的,为了解决这个多余的事情,所以有了vfork。vfork区别于fork之一就是子进程不再是父进程的副本,子进程是父进程的一部分,直接持有父进程并在父进程的环境中运行,所以导致父进程需要进入阻塞状态,直到子进程调用exec或者exit,然后父进程才会接着运行。(这里可能有死锁的彩蛋)
  • fork和vfork区别
    1)vfork保证子进程先运行,在它调用execexit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
    2)fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用execexit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。

僵死进程

在UNIX术语中,一个已经停止、但其父进程尚未对其进行善后处理的进程被称作僵死进程。

在UNIX中,一个进程退出后,系统会回收内核为该进程分配的几乎所有资源,但是仍然有所保留,这些保留的信息保存者进程的基本信息,比如进程ID、运行时间、进程的退出状态。这些状态信息的释放需要该进程的父进程处理,父进程的处理是使用wait/waitpid获取子进程的退出信息状态,当父进程成功获取了子进程的退出信息,这时已经结束的子进程的资源才会全部释放。而如果子进程结束了,而父进程没有处理(不管父进程是否还活着),那么该进程我们称之为僵死进程。僵死进程占用系统内存资源是小事,但是他占用系统进程号可是大事的,所以我们要避免僵死进程的出现,因此父进程要及时正确地处理结束的子进程,不能放任其不管。


孤儿进程

孤儿进程:从父进程已经结束但是子进程还没结束,到子进程还没有被init接收之间的这段时间,该子进程被称作孤儿进程,孤儿进程没有父进程。在UNIX系统中,每当出现孤儿进程后,init进程将“收养”这个进程,init会将孤儿进程的父进程设为init自己,然后会不断地wait该进程直到完成该进程的退出后的处理工作。因此,孤儿进程的存在时间很短,出现的孤儿进程很快就被init进程接过去了,所以孤儿进程没有危害。


0 0