fork


一.复制进程 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的位置发生变化,是故意的,在栈区,每运行一下,走一位,为了安全

 

 

 

 

 

   


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM