use*_*809 1 c operating-system fork
当进程执行fork()sys调用时,会从中生成子进程.fork()调用之后的所有代码都被复制到内存的新物理页面,即帧.我无法可视化子进程的虚拟内存部分.因为在下面的代码中,char变量的地址在child和parent中是相同的.
#include <stdio.h>
#include <sys/types.h>
int main(void)
{
pid_t pid;
char y='Y';
char *ptr;
ptr=&y;
pid = fork();
if (pid == 0)
{
y='Z';
printf(" *** Child process ***\n");
printf(" Address is %p\n",ptr);
printf(" char value is %c\n",y);
sleep(5);
}
else
{
sleep(5);
printf("\n ***parent process ***\n",&y);
printf(" Address is %p\n",ptr);
printf(" char value is %c\n",y);
}
}
Run Code Online (Sandbox Code Playgroud)
及其输出:
*** Child process ***
Address is 69002894
char value is Z
***parent process ***
Address is 69002894
char value is Y
Run Code Online (Sandbox Code Playgroud)
两个进程中的虚拟地址相同,但物理地址不同.您的进程只允许访问虚拟内存.在具有虚拟内存功能的机器中,内存管理单元将虚拟地址转换为物理地址.
通常,操作系统使用写时复制方案来实现分叉.这意味着它们将具有相同的物理地址,直到某些东西试图写入内存页面.当你把:
y = 'Z'
Run Code Online (Sandbox Code Playgroud)
操作系统复制了y所在的内存页面,并将该虚拟地址重新分配给新的物理地址.