那些关于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保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
2)fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。
僵死进程
在UNIX术语中,一个已经停止、但其父进程尚未对其进行善后处理的进程被称作僵死进程。
在UNIX中,一个进程退出后,系统会回收内核为该进程分配的几乎所有资源,但是仍然有所保留,这些保留的信息保存者进程的基本信息,比如进程ID、运行时间、进程的退出状态。这些状态信息的释放需要该进程的父进程处理,父进程的处理是使用wait/waitpid获取子进程的退出信息状态,当父进程成功获取了子进程的退出信息,这时已经结束的子进程的资源才会全部释放。而如果子进程结束了,而父进程没有处理(不管父进程是否还活着),那么该进程我们称之为僵死进程。僵死进程占用系统内存资源是小事,但是他占用系统进程号可是大事的,所以我们要避免僵死进程的出现,因此父进程要及时正确地处理结束的子进程,不能放任其不管。
孤儿进程
孤儿进程:从父进程已经结束但是子进程还没结束,到子进程还没有被init接收之间的这段时间,该子进程被称作孤儿进程,孤儿进程没有父进程。在UNIX系统中,每当出现孤儿进程后,init进程将“收养”这个进程,init会将孤儿进程的父进程设为init自己,然后会不断地wait该进程直到完成该进程的退出后的处理工作。因此,孤儿进程的存在时间很短,出现的孤儿进程很快就被init进程接过去了,所以孤儿进程没有危害。
0 0
- 那些关于UNIX进程的话题
- 还是关于时尚的那些话题
- Unix/Linux 那些系统启动后的进程
- 那些我们忽视的话题
- 关于IDE的话题
- 关于美丽的话题
- 关于创新的话题
- 关于缓存的话题
- 关于进程和线程的那些事儿
- 关于激进帐户的话题
- 关于婴儿机票的话题
- 关于汉语汉字的话题
- 关于自学的一些话题
- 关于div居中的话题
- 关于Core Dump的话题
- 关于代码对齐的话题
- 问题?关于家乡的话题!
- 关于c++的一些话题
- Nginx进程分析(worker_process篇)
- C使用SQLite的例子
- 二叉链表的自我练习
- 娱乐与计算机
- 五子棋游戏——HGE
- 那些关于UNIX进程的话题
- 测试图片测试图片666
- php office转pdf
- ER模型哪家强
- 老男孩PYTHON及运维11.30免费公开课
- iOS开发 偷懒小技巧---自定义XCode代码片段
- 日语学习之沪江N4基础 20141122 -2
- 提高listview运行效率
- Ubuntu和Windows双系统蓝牙键盘配对