每次看到多进程时,子进程复制了父进程的所有数据(代码段、数据段、BSS、堆、栈),我们想当然的认为:子进程开辟了一块新的空间,把父进程的所有数据都复制过来。
而且每次我们改变名字相同的变量的值,输出的变量的结果都是不一样的。这也就更加坚定了我们的信心。但是,事实真的是这样吗?
运行下面这段代码,你会发现父子进程相同的变量输出的值不一样,但是地址却是一样的,看下面代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
main

子进程通常复制父进程的虚拟地址空间,但并非物理内存。相同地址的不同值源于逻辑地址到物理地址的映射差异。这种现象称为写时复制,即在数据被修改时才会真正复制页面,有效降低系统开销。
最低0.47元/天 解锁文章
700

被折叠的 条评论
为什么被折叠?



