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则共享这部分内存。
fork()和vfork()相关推荐
- 进程创建函数fork()和vfork()
Linux下使用fork()创建一个新的进程,该函数不需要参数,返回值是一个进程id.对于不同的对象,分别是:新建的子进程id(返回给父进程),0(返回给创建的子进程)或者-1(子进程创建失败,返回给 ...
- c语言exit和return区别,在fork和vfork中使用
转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...
- 5.fork和vfork
fork和vfork函数都是用于创建子进程的系统函数. fork函数调用一次,返回两次.两次返回的返回值不同. 1)返回值等于0时,处于子进程空间. 理由:一个进程只会有一个父进程,所以子进程总是可以 ...
- UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...
本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID 1 进程标识符(Process Identifiers ...
- OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的过程就是这些数 ...
- Linux fork() 和 vfork()
代码 #include <unistd.h> #include <sys/types.h> #include <iostream> #include <err ...
- fork和vfork,return和exit的理解
fork和vfork的差别: 1.fork是创建一个子进程,并把父进程的内存数据copy到子进程中. vfork是创建一个子进程,并和父进程的内存数据share一起. 2.vfork是这样的工作的: ...
- 细究fork()和vfork()
在linux系统下,对于程序执行的过程中,我们都会想到进程.而创建进程通常使用fork函数,当然还有vfork函数. 今天在这,我将分享一下我的学习心得:关于fork()和vfork() fork() ...
- fork与vfork的区别
fork与vfork的区别 1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行.如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁. 2.fork要 ...
- linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用
exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返 ...
最新文章
- opencv鼠标画路径点
- IPC$共享和其他共享(C$、D$、Admin$)
- [译]GC专家系列5-Java应用性能优化的原则
- iOS AutoLayout使用技巧
- Getting Started with the Table Component
- java缩写_Java学习-Java缩写词的意思
- 上海电子信息职业技术学院计算机网络技术,上海电子信息职业技术学院计算机网络技术专业...
- Linux Shell 编程笔记
- 面试问题记录 (一)
- Linux FTP文件服务器共享/匿名访问。别名访问。用户访问
- windows使用cmd(dos命令)映射网络驱动器
- 数字图像处理 冈萨雷斯 一些理解
- php 开源留言系统,PHP开源多功能留言板(SyGuestBook)
- 搭建基于XMPP的即时通讯系统
- 【双十一精选】史上最强的宝贝详情页设计思路以及操作流程
- 广州电子路考视频发布 2014广州电子路考考点
- oracle导入blob出错,oracle导出blob,clob出错的问题
- 【数据结构与算法】之深入解析“扫雷游戏”的求解思路与算法示例
- 力扣(13.278)补8.23
- 分布式与集群的区别到底是什么?