首页 > 其他 > 详细

fork

时间:2021-04-16 17:50:40      阅读:30      评论:0      收藏:0      [点我收藏+]

一.复制进程 fork

1.函数返回类型 pid_t 实质是 int 类型,
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。
2.技术分享图片

   pcb穿起来会形成一个链表,整个进程中的运行数,则看有几个pcb,(链表有多少个结点) 

   pcb可当做一个结构体,名字为struct task_struct,

   有多少进程,就有多少结点

3.父进程的返回值为它的id号,子进程则为0

4.技术分享图片 技术分享图片

    fork复制之后,子进程从fork之后的语句开始进行,子进程的fork不会再执行、

    父子进程并发进行(同时进行),两者互不影响

5.例题1

技术分享图片 技术分享图片

 

1). i=0, 进入for循环,进入fork ,复制两个进程,父进程打印一个A,子进程打印一个A,i=1时,父进程进入for循环,复制完父进程再打印一个A,复制的子进程打印一个A,子进程同样。

 2). 技术分享图片四个进程,,6个A

 

例题2

技术分享图片 技术分享图片

没有\n后,执行后,A没有打出去,还在进程中,再次执行时,整体复制给子进程,子进程中也有一个A,往下执行时,还没有打出A,A存放在缓冲区,子进程中也在存放一个A,另一个子进程方法同。

 6.技术分享图片 技术分享图片

 

         此时为逻辑地址,不是物理地址

 7.技术分享图片

 

    fork复制之后的子进程是从fork之后开始执行的,把内存空间复制一份,代码从fork后执行,但fork前的值仍与父进程相同。

8.0到4G地址空间

  技术分享图片

9.写时拷贝:在发生修改的时候,才会将父进程的内容复制给子进程,没发生修改的不复制,

写时拷贝使fork复制的更少,fork效率提高                 

在fork时候,原本需要将所有父进程复制给子进程,现在是将父子没有进行修改的页面先进共享,等到父和子要进行修改的时候在进行复制,

10.技术分享图片 技术分享图片 技术分享图片 技术分享图片

 

     程序进行编译之后,逻辑地址已经有了,用nm去观察,运行之后地址仍是原来的地址,所以这为逻辑地址, a,b的位置发生变化,是故意的,在栈区,每运行一下,走一位,为了安全

 

 

 

 

 

   

fork

原文:https://www.cnblogs.com/xpei-1124/p/14666367.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!