fork()和vfork()

Hello,今天Val和大家分享操作系统中关于进程创建有关的内容。

一、进程创建背景知识
1、传统Unix操作系统统一对待所有进程: 子进程拷贝父进程所拥有的所有资源,这种方法创建慢且效率低,因为子进程需要拷贝父进程所拥有的所有资源,实际上,子进程几乎不必读或修改父进程所拥有的所有资源,很多情况下,子进程立即调用execve(),并清除父进程仔细拷贝过来的地址空间。
2、 现代Unix内核三种方式:
写时复制技术允许父子进程读相同物理页,只要两者中有一个试图写一个物理页,内核就把这个页的内容拷贝到一个新的物理页,并把这个物理页分配给正在写的进程。
轻量级进程允许父子空间共享进程在内核的许多数据结构,如页表(整个用户态地址空间)、打开文件表及信号处理。
vfork()系统调用创建的进程能够共享其父进程的内存地址空间。为了防止父进程重写子进程重要数据,阻塞父进程的执行,一直到子进程退出或执行一个新的程序为止。
3、fork与clone的区别:
fork()是全部复制,clone()将资源有选择的复制给子进程,没有复制的数据结构则通过指针的复制让子进程共享。 在极端情况下,一个进程可以clone()出一个线程,系统调用fork()是无参数的,而clone()带有参数.

二、
1、Linux中,轻量级进程是由名为clone()的函数创建的。
2、fork函数
fork()创建一个新进程,并为它创建新的地址空间;
fork()函数通过系统调用创建一个与原来进程完全相同的进程。也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
fork函数 #include pid_t fork(void); 一个现有进程可以调用fork创建一个新进程。 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1。

在fork之后处理的文件描述符有两种常见的情况:
1. 父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进程终止后,子进程对文件偏移量的修改已执行的更新。
2. 父子进程各自执行不同的程序段。这种情况下,在fork之后,父子进程各自关闭他们 不需要使用的文件描述符,这样就不会干扰对方使用文件描述符。这种方法在网络服务进程中经常使用。

父子进程之间的区别:
1. fork的返回值
2. 进程ID不同
3. 具有不同的父进程ID
4. 子进程的tms_utime、tms_stime、tms_cutime及tms_ustime均被设置为0
5. 父进程设置的文件锁不会被子进程继承
6. 子进程的未处理闹钟被清除
7. 子进程的未处理信号集被设置为空集 fork有下面两种用法:
(1) 一个父进程希望复制自己,使父子进程同时执行不同的代码段。如:父进程等待 客户端请求,生成子进程来处理请求。
(2) 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。
fork调用失败的原因: 1. 系统中有太多的进程 2. 实际用户的进程数超过了限制

3、fork()函数
vfork()函数用来创建一个新进程,而这个新进程的目的是exec一个新程序。它不会把父进程的地址空间复制到子进程中,因为子进程会立即调用exec函数。
在子进程调用exec或exit之前,它在父进程 的空间中运行,也就是说会更改父进程的数据段、栈和堆。vfork和fork另一区别在于 :vfork保证子进程先运行,在它调用exec或(exit)之后父进程才可能被调度运行。

三、fork和vfork的区别
1、fork特点:
fork创建进程时,子进程完全复制父进程的资源,子进程独立于进程,具有良好的并发性,二者之间需要专门的通信机制。
如果某进程fork出一个子进程只是为了调用exec执行另一个文件,那fork过程对于虚拟地址空间的复制是多余的过程。
fork优点:父子进程相互独立,子进程对父进程中同名变量进行修改并不会影响其在父进程中的值。

2、vfork特点:
vfork创建的子进程与父进程共享地址空间,即子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间的修改同样为父进程所见,用vfork创建子进程后,父进程会被阻塞到子进程调用exec或exit。
vfork避免了(fork函数子进程被创建后,仅仅为调用exec执行另一个程序,它对地址空间的复制是多余的)这个问题,减少了不必要的开销。

vfork保证子进程先运行,它调用exec或exit后父进程才能调度运行,fork的父子进程运行顺序不定,取决于内核的调度算法。

父进程中的数据空间和堆、栈可能会产生副本,具体情况要看使用的是fork还是vfork,fork产生副本,vfork则共享这部分内存。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值