关于   小悟志   网站地图   归档   友情链接   联系   Feed

   云上小悟  +  

当前位置 : 首页 » InfoTech » fork,exec,clone的使用 正文

fork,exec,clone的使用

2017年7月1日 / 15次阅读  InfoTech
标签:Linux

拍拍贷

事实上,在Linux内核中并不存在真正意义上的线程概念。Linux将所有的执行实体(无论是线程还是进程)都称为任务(Task),每一个任务概念上都类似于一个单线程的进程,具有内存空间、执行实体、文件资源等。不过,Linux下不同的任务之间可以选择共享内存空间,因而在实际意义上,共享了同一个内存空间的多个任务构成了一个进程,这些任务也就成了这个进程里的线程。在Linux下,通过使用fork,exec,clone等系统调用来创建新的Task。

fork函数产生一个和当前进程完全一样的新进程,并和当前进程一样从fork函数里返回。

在fork函数调用之后,新的任务将启动并和本任务一起从fork函数返回。但不同的是本任务的fork将返回新任务pid,而新任务的fork将返回0。 fork产生新任务的速度非常快,因为fork并不复制原任务的内存空间,而是和原任务一起共享一个写时复制(Copy on Write, COW)的内存空间。所谓写时复制,指的是两个任务可以同时自由地读取内存,但任意一个任务试图对内存进行修改时,内存就会复制一份提供给修改方单独使用,以免影响到其他的任务使用。

写时复制(Copy on Write, COW)

写时复制(Copy on Write, COW)

fork只能够产生本任务的镜像,因此须要使用exec配合才能够启动别的新任务。exec可以用新的可执行映像替换当前的可执行映像,因此在fork产生了一个新任务之后,新任务可以调用exec来执行新的可执行文件。fork和exec通常用于产生新任务,而如果要产生新线程,则可以使用clone。

使用clone可以产生一个新的任务,从指定的位置开始执行,并且(可选的)共享当前进程的内存空间和文件等。如此就可以在实际效果上产生一个线程。

现代OS基本都采用了分页的方式管理内存,具体到fork的Copy on Write的时候,copy的是被修改的那个页,而其它没有被修改的页还是多进程共享,比如代码页是只读的,就不会被copy。

fork的一个变种vfork,不同于写时复制的fork,vfork会将父进程挂起,子进程使用父进程的地址空间。由于vfork不使用写时复制,因此如果子进程修改父进程地址空间的任何页,那么这些修改过的页在父进程重启时是可见的。

 

本文内容有部分摘自《程序员的自我修养》,强烈推荐!

本文链接:http://www.maixj.net/ict/fork-exec-clone-15864
云上小悟 麦新杰(QQ:1093023102)

-- (*^-^*) --

相关文章

评论是美德

无力满足评论实名制,评论对非实名注册用户关闭,有事QQ:1093023102.


前一篇:
后一篇:

栏目精选


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号苏ICP备14045477号-1

网站二维码
拍拍贷
go to top