目录
1、fork是什么
2、 fork复制原理
3、逻辑地址与物理地址
4、计算fork()输出次数
1、fork是什么
2、 fork复制原理
- 父进程有pcb,父进程内调用fork()函数,fork复制一份父进程的pcb,然后申请一个PID,把子进程的pcb里的pid的加1,父进程的返回值为子进程的pid,子进程的返回值为0,如下图所示:
- 总结:
- 子进程的PID=父进程的PID+1
-
父进程的返回值为子进程的PID,子进程的返回值为0。该返回值是后续代码判断当前进程是父进程还是子进程的依据。fork调用失败返回-1,并设置errno
3、逻辑地址与物理地址
-
父进程fork后产生的子进程,逻辑地址一致,物理地址不一致。
- 在进程中看到的地址都是逻辑地址
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,分配的是逻辑地址。要使用地址时再去寻找空闲的地址——物理地址。
- 有些时候,父子进程的某个变量的输出地址可能相同,只可能是其逻辑地址相同,要想知道它们在内存中的物理地址,就必须根据逻辑地址判断页表号(如下图所示),再根据各自的页表进行映射,找到其在内存中的具体位置——物理地址。不同进程的逻辑地址没有可比性,但是如果在同一个进程中,若地址相同,那就证明其在同一段物理内存中。
4、计算fork()输出次数
例题分析——打印几个A?
- 解:
-
去掉"\n"
- 在该例中,输出结果为BAA
- 分析:
- main函数内第一句,把A放到缓冲区,然后打印B, fork又把复制一次,两个缓冲区的A都被打印出来,因此输出结果依次为BAA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)