版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、fork简介:fork英文原意是分岔,分支”的意思,而在操作系统中,乃是著名的Unix(或类Unix,如Linux.Minix)中用于创建子进程的系统调用。【NOTE1】fork()的作用是什么?换句话说,你用fork()的目的是什么?一一是为了产生一个新的进程,地球人都知道:)产生一个什么样的进程?一一和你本来调用fork()的那个进程基本一样的进程,其实就是你原来进程的副本;真的完全一样吗?当然不能完全一样,你要两个除了pid之外其它一模一样的进程干什么,就算memory再多也不用这么摆谱吧?哪里不一样?一一当然最重要的是fork()之后执行的代码不一样,youknow,iknow:)怎么
2、实现呢?如果是Windows,它会让你在fork()里面提供一大堆东西,指明这个那个什么的我用的是unix啊一一所以很简单,unix会让两个进程(不错,原来是一个,unix替你复制了一个,现在有两个)在fork()之后产生不同:返回值不同。其中一个进程(使用新的pid)里面的fork()返回零,这个进程就是子进程”;而另一个进程(使用原来的pid)中的fork()返回前面那个子进程的pid,他自己被称为“父进程”然后呢?一一写代码的人又不笨,当然就根据返回值是否非零来判断了,现在我是在子进程里面呢,还是在父进程里面?在子进程里面就执行子进程该执行的代码,在父进程里面就执行父进程的代码有铁杆wi
3、ndowsfans借此说明,windows好啊,子进程用子进程的代码,父进程用父进程的,你unix笨了吧,子进程包含父进程、子进程的代码,父进程包含父进程子进程的代码,岂不是多占用内存了吗?据我所知,unix代码段都是可重入代码,也就是说,进程复制,并不复制代码段,若干个进程共享同一代码段,增加的只是全局共享数据和对文件描述符的引用等,另外就是堆栈。你一个代码长达10M的进程,fork()出三四个子进程,只是增加一点内存占用(如果你没有使用很多全局变量的话),而不是占用40M以上的内存。【NOTE2】程序从fork开始分支(称分支不准确),一路是主进程pid0(pid是子进程ID)路是子进程p
4、id=0自此分成两个任务其实fork的时候已经两个分支了,数据段被复制了一份,因此pid有两份执行pid=fork()时,返回值赋给pid在两个进程中运行,fork会返回给父进程的那个0的值,告诉调用者新建进程的pid子进程的fork返回值是0更不用说if.else的比较也是在两个进程中都做的了【NOTE3】fork的精辟剖析程序如下:#include;#include;main()pid_tpid;pid=fork();if(pidpid_tfork();当一个进程调用了fork以后,系统会创建一个子进程这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样就象父进程克隆(
5、clone)自己一样当然创建两个一模一样的进程是没有意义的为了区分父进程和子进程,我们必须跟踪fork的返回值.当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则fork的返回值有重要的作用对于父进程fork返回子进程的ID,而对于fork子进程返回0我们就是根据这个返回值来区分父子进程的.父进程为什么要创建子进程呢?前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源.一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而
6、父进程阻塞,直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用.总结一下有三:派生子进程的进程,即父进程,其pid不变;对子进程来说,fork返回给它0,但它的pid绝对不会是0;之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;fork之后父子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。认为子进程结束后父进程才从fork返回的,这是不对的,fork不是这样的,vfork才这样。【NOTE4】首先必须有一点要清楚,函数的返回值是储存在寄存器eax中的。其次,当fork返回时,新进程会返回0是因为在初始化任务结构时,将
7、eax设置为0;在fork中,把子进程加入到可运行的队列中,由进程调度程序在适当的时机调度运行。也就是从此时开始,当前进程分裂为两个并发的进程。无论哪个进程被调度运行,都将继续执行fork函数的剩余代码,执行结束后返回各自的值。【NOTE5】对于fork来说,父子进程共享同一段代码空间,所以给人的感觉好像是有两次返回,其实对于调用fork的父进程来说,如果fork出来的子进程没有得到调度,那么父进程从fork系统调用返回,同时分析sys_fork知道,fork返回的是子进程的id。再看fork出来的子进程,由copy_process函数可以看出,子进程的返回地址为ret_from_fork(和
8、父进程在同一个代码点上返回),返回值直接置为0。所以当子进程得到调度的时候,也从fork返回,返回值为0。关键注意两点:l.fork返回后,父进程或子进程的执行位置。(首先会将当前进程eax的值做为返回值)2.两次返回的pid存放的位置(eax中)进程调用copy_process得到lastpid的值(放入eax中,fork正常返回后,父进程中返回的就是lastpid)子进程任务状态段tss的eax被设置成0,fork.c中p-tss.eax=0;(如果子进程要执行就需要进程切换,当发生切换时,子进程tss中的eax值就调入eax寄存器,子进程执行时首先会将eax的内容做为返回值)当子进程开始
9、执行时,copy_process返回eax的值。fork()后,就是两个任务同时进行,父进程用他的tss,子进程用自己的tss,在切换时,各用各的eax中的值.所以,“一次调用两次返回”是2个不同的进程!看这一句:pid=fork()当执行这一句时,当前进程进入fork()运行,此时,fork()内会用一段嵌入式汇编进行系统调用:int0 x80(具体代码可参见内核版本0.11的unistd.h文件的133行_syscall0函数)。这时进入内核根据此前写入eax的系统调用功能号便会运行sys_fork系统调用。接着,sys_fork中首先会调用C函数find_empty_process产生一
10、个新的进程,然后会调用C函数copy_process将父进程的内容复制给子进程,但是子进程tss中的eax值赋值为0(这也是为什么子进程中返回0的原因),当赋值完成后,copy_process会返回新进程(该子进程)的pid,这个值会被保存到eax中。这时子进程就产生了,此时子进程与父进程拥有相同的代码空间,程序指针寄存器eip指向相同的下一条指令地址,当fork正常返回调用其的父进程后,因为eax中的值是新创建的子进程号,所以,fork()返回子进程号,执行else(pid0);当产生进程切换运行子进程时,首先会恢复子进程的运行环境即装入子进程的tss任务状态段,其中的eax值(copy_p
11、rocess中置为0)也会被装入eax寄存器,所以,当子进程运行时,fork返回的是0执行if(pid=0)。【NOTE5】理解它关键在于理解堆栈的切换和压栈,弹栈!关于子进程的返回:子进程复制了父进程的栈内容,从高到低SSESPEFLAGSCSEIP-此是int0 x80的下一条指令,也是子进程开始执行的地方DSESFSEDXECXEBXGSESIEDIEBPEAX(0)由于EAX=0,所以子进程返回0给fork.注:新进程的用户栈设为其父进程的用户栈(最后弹出的SS,ESP)。如果父子进程以copy_on_write方式共用用户堆栈(Linux之下就是这样的),而且在此之前父进程修改了该堆
12、栈(如果父进程先返回,这几乎是肯定的),那么,系统已经为父进程创建了该用户栈的副本,父进程原来的用户栈留给了子进程。那么新进程的系统栈已经清空,新进程回到了用户态,返回到了函数fork。【NOTE6】关于fork的讨论与评价:fork好不好?相比其他操作系统如Windows.Windows会有诸如CreateProcess这样的函数来创建一个与生俱来两手空空的独立的新进程。然后还有一大堆参数,指手画脚的告诉你这个那个是什么。烦K.I.S.S.(Keepitsimple,stupid.)是Unix的至高原则。fork起源于Unix操作系统。那是贝尔实验室的K&R(这两人是Unix和C语言之父)的一项天才发明Linux由于与生俱来就与Unix血浓于水,所以继承了它的这个天才发明。这种方法效率是很高的。因为复制的代价是很低的。在计算机网络的实现中,以及在client/server系统中的server一方的实现中,fork常常是最自然,最有效,最适宜的手段。很多人甚至怀疑,到底是先有fork还是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育机构校长劳动合同3篇
- 新版项目软件合同3篇
- 提前终止月嫂合同3篇
- 安装工程合同中的技术解析3篇
- 数码相机购买合同3篇
- 摩托车位转让合同模板3篇
- 教育培训机构店长劳动合同3篇
- 旅游产品销售员招聘合同3篇
- 新版银行抵押贷款合同3篇
- 新媒体合作协议书3篇
- 医院廉洁购销合同
- 2024年汽车修理工职业技能考试练习题(含答案)
- 乡村振兴课件模板
- 专题11 名著阅读之《童年》(考题猜想)(期中真题速递20题)(含答案解析)
- TSGD7002-2023-压力管道元件型式试验规则
- 尝试与猜测 (说课稿)-2024-2025学年五年级上册数学北师大版
- 素描试卷家长会
- 电动车着火应急预案
- 风电场项目关键质量点控制清单
- 系统运行维护方案
- 转子找静平衡方法
评论
0/150
提交评论