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则共享这部分内存。

fork()和vfork()相关推荐

  1. 进程创建函数fork()和vfork()

    Linux下使用fork()创建一个新的进程,该函数不需要参数,返回值是一个进程id.对于不同的对象,分别是:新建的子进程id(返回给父进程),0(返回给创建的子进程)或者-1(子进程创建失败,返回给 ...

  2. c语言exit和return区别,在fork和vfork中使用

    转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...

  3. 5.fork和vfork

    fork和vfork函数都是用于创建子进程的系统函数. fork函数调用一次,返回两次.两次返回的返回值不同. 1)返回值等于0时,处于子进程空间. 理由:一个进程只会有一个父进程,所以子进程总是可以 ...

  4. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...

    本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID 1 进程标识符(Process Identifiers ...

  5. OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的过程就是这些数 ...

  6. Linux fork() 和 vfork()

    代码 #include <unistd.h> #include <sys/types.h> #include <iostream> #include <err ...

  7. fork和vfork,return和exit的理解

    fork和vfork的差别: 1.fork是创建一个子进程,并把父进程的内存数据copy到子进程中. vfork是创建一个子进程,并和父进程的内存数据share一起. 2.vfork是这样的工作的: ...

  8. 细究fork()和vfork()

    在linux系统下,对于程序执行的过程中,我们都会想到进程.而创建进程通常使用fork函数,当然还有vfork函数. 今天在这,我将分享一下我的学习心得:关于fork()和vfork() fork() ...

  9. fork与vfork的区别

    fork与vfork的区别 1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行.如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁. 2.fork要 ...

  10. linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用

    exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返 ...

最新文章

  1. opencv鼠标画路径点
  2. IPC$共享和其他共享(C$、D$、Admin$)
  3. [译]GC专家系列5-Java应用性能优化的原则
  4. iOS AutoLayout使用技巧
  5. Getting Started with the Table Component
  6. java缩写_Java学习-Java缩写词的意思
  7. 上海电子信息职业技术学院计算机网络技术,上海电子信息职业技术学院计算机网络技术专业...
  8. Linux Shell 编程笔记
  9. 面试问题记录 (一)
  10. Linux FTP文件服务器共享/匿名访问。别名访问。用户访问
  11. windows使用cmd(dos命令)映射网络驱动器
  12. 数字图像处理 冈萨雷斯 一些理解
  13. php 开源留言系统,PHP开源多功能留言板(SyGuestBook)
  14. 搭建基于XMPP的即时通讯系统
  15. 【双十一精选】史上最强的宝贝详情页设计思路以及操作流程
  16. 广州电子路考视频发布 2014广州电子路考考点
  17. oracle导入blob出错,oracle导出blob,clob出错的问题
  18. 【数据结构与算法】之深入解析“扫雷游戏”的求解思路与算法示例
  19. 力扣(13.278)补8.23
  20. 分布式与集群的区别到底是什么?

热门文章

  1. 来看看今天推荐的好用软件吧
  2. 重大升级!灵雀云发布全栈云原生开放平台ACP 3.0
  3. PrintWriter
  4. noise variance and power of the Band-Limited White Noise in Simulink
  5. 框架系列课程-SpringMVC课程
  6. 第1章 计算机网络概论
  7. 【Python进阶】7-数据分析概述及常用工具介绍
  8. Python实现冒泡排序
  9. android 手机资源获取失败,安卓root权限获取失败原因及解决办法
  10. canvas 荧光笔效果