进程复制
九.进程复制
1.逻辑地址与物理地址关系
2.通过逻辑地址查找物理地址
用逻辑地址%4k = 商 余数
商:页数
余数:在物理地址上的偏移量
3.进程复制
3.1 两个进程的关系
父子关系,被复制的进程叫父进程,复制后的进程叫子进程。
复制后的新进程的pid比前一个进程加一,其他进程状态等相同
3.2 fork函数
头文件#include<sys/types.h>
复制进程,返回值如果大于0则为父进程,返回值等于0则为子进程
pid_t fork();
typedef int pid_t;//对int进行的重命名
pid_t pid = fork();//返回值:当为父进程时返回值>0,当为子进程是返回值==0
3.3 getpid函数
获取当前进程id
3.4 getppid函数
获取父进程id
3.5 写时拷贝概念
概念:写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝
如果不更改变量值,则子进程共享父进程数据,则物理内存相同
如果更改了变量的值,则子进程页表中改变值的页的偏移量会改变,他们的物理地址就不同了
3.6 笔试题
3.6.1 fork与缓冲区
问下面代码会输入出几个A
int main()
{
for(int i=0;i<2;i++)
{
fork();
printf("A");
}
return 0;
}
答案为8,
在分裂时,缓冲区也会复制一份
3.6.2 fork返回值
问下面代码会输出几个A
fork()||fork()
printf("A\n");
答案为3