C fork调用后的地址空间
当流程执行fork sys调用时,将生成一个子流程。fork调用之后的所有代码都复制到内存的新物理页,即帧。我无法可视化子进程的虚拟内存部分。因为在下面的代码中,char变量的地址在子进程和父进程中是相同的C fork调用后的地址空间,c,operating-system,fork,C,Operating System,Fork,当流程执行fork sys调用时,将生成一个子流程。fork调用之后的所有代码都复制到内存的新物理页,即帧。我无法可视化子进程的虚拟内存部分。因为在下面的代码中,char变量的地址在子进程和父进程中是相同的 #include <stdio.h> #include <sys/types.h> int main(void) { pid_t pid; char y='Y'; char *ptr; ptr=&y; pid = fo
#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);
}
}
根据我的说法,在你运行“execve”命令后,你会看到区别。在此之前,子对象与父对象共享相同的图像和空间。根据我的说法,在运行“execve”命令后,您将看到差异。在此之前,子进程与父进程共享相同的映像和空间。两个进程中的虚拟地址相同,但物理地址不同。您的进程只允许访问虚拟内存。在具有虚拟内存功能的机器中,内存管理单元将虚拟地址转换为物理地址 通常,操作系统使用写时拷贝方案来实现分叉。这意味着它们将拥有相同的物理地址,直到有东西试图写入内存页。当你把:
y = 'Z'
操作系统复制了y所在的内存页,并将该虚拟地址重新分配给新的物理地址。两个进程中的虚拟地址相同,但物理地址不同。您的进程只允许访问虚拟内存。在具有虚拟内存功能的机器中,内存管理单元将虚拟地址转换为物理地址 通常,操作系统使用写时拷贝方案来实现分叉。这意味着它们将拥有相同的物理地址,直到有东西试图写入内存页。当你把:
y = 'Z'
操作系统复制了y所在的内存页,并将该虚拟地址重新分配给新的物理地址。您的问题是什么?每个虚拟地址中的虚拟地址都指向不同的物理内存位置。您的问题是什么?每个虚拟地址中的虚拟地址指向不同的物理内存位置。物理地址不一定非要不同。内存可以在写入时复制,并在写入之前一直分页到相同的物理空间。@Michael McGuire谢谢,很好的解释,我也这么认为物理地址不一定不同。内存可以在写入时复制,并在写入之前一直分页到相同的物理空间。@Michael McGuire谢谢,很好的解释,我也这么想