问题描述
- 关于linux写时复制的一个疑问,C程序
-
linux写时复制的机制就是,当fork出一个子进程的时候,子进程并不立刻复制数据段,而是当子进程要修改数据时才分配相应内存给变量。按照这样的原理,我用C写了一个程序,声明一个全局变量并初始化,然后在进程里fork出一个进程,这时在父子进程输出全局变量的地址都是一样的,我在子进程修改变量值后,同样在父子进程输出变量地址,却地址还是一样的!这到底是为什么?写的时候不是要分配内存的吗?怎么地址值还是一样!路过的朋友帮我解解惑ˊ_>ˋ
解决方案
你这个都是虚拟地址,它这个修改的是地址的内容。地址没有变化
解决方案二:
考虑32位情况,linux内核为每个app分配0到3g的用户空间,而这3g用户空间是逻辑地址空间,而逻辑地址空间通过系统页式管理映射到物理空间,所以你打印出来的是逻辑地址空间,它们是可以一样的,毕竟映射时根据进程PCB的不同而映射到不同的物理地址空间。
解决方案三:
考虑32位情况,linux内核为每个app分配0到3g的用户空间,而这3g用户空间是逻辑地址空间,而逻辑地址空间通过系统页式管理映射到物理空间,所以你打印出来的是逻辑地址空间,它们是可以一样的,毕竟映射时根据进程PCB的不同而映射到不同的物理地址空间。
时间: 2024-10-30 11:17:30