当前位置: 技术问答>linux和unix
父子进程中数据地址的问题
来源: 互联网 发布时间:2016-09-15
本文导语: int main() { int test = 0; pid_t fork_resault; fork_resault = fork(); if(fork_resault == 0){ sleep(5); test++; printf("child: test = %d, &test = %Xn",test, &test); } else { t...
int main()
{
int test = 0;
pid_t fork_resault;
fork_resault = fork();
if(fork_resault == 0){
sleep(5);
test++;
printf("child: test = %d, &test = %Xn",test, &test);
} else {
test ++;
printf("parent: test = %d, &test = %Xn",test, &test);
}
}
Ubuntu 8.10 运行输出结果:
parent: test = 1, &test = BFBD7048
child: test = 1, &test = BFBD7048
问题:parent和child中&test怎么都一样的呢?
linux中不是对进程中的页是写时复制的么,那在++后子进程中数据应该到新的页框中去了,那&test的结果不就应该不同了么?请高手帮忙,谢谢。
|
一条一条的给你分析:
1.如果test的地址是一样的,也即是说parent和child中的test是同一个,那么,无论parent和child那个
进程先运行,test++的结果不可能等于1.也就是说,必须有一个test == 2 才对
2.每个进程都有自己一个独立的栈,以及内存区,parent和child是不会共享的.
In Linux, fork() is implemented through the use of copy-on-write pages. Copy-on-write (or COW) is a technique to delay or altogether prevent copying of the data. Rather than duplicate the process address space, the parent and the child can share a single copy. The data, however, is marked in such a way that if it is written to, a duplicate is made and each process receives a unique copy
COW,就是复制到各个进程自己的内存空间里去。所以。parent中的 BFBD7048和child中的 BFBD7048
不是同一个地址,只是相对改进程地址空间的offset或者,其实就是一个虚拟地址。child和parent,在他们
自己看来,自己拥有了全部的内存空间,而感觉不到其他的进程的存在,child感觉不到parent也同样有一块
内存空间。
希望你能理解我上面的解释。
1.如果test的地址是一样的,也即是说parent和child中的test是同一个,那么,无论parent和child那个
进程先运行,test++的结果不可能等于1.也就是说,必须有一个test == 2 才对
2.每个进程都有自己一个独立的栈,以及内存区,parent和child是不会共享的.
In Linux, fork() is implemented through the use of copy-on-write pages. Copy-on-write (or COW) is a technique to delay or altogether prevent copying of the data. Rather than duplicate the process address space, the parent and the child can share a single copy. The data, however, is marked in such a way that if it is written to, a duplicate is made and each process receives a unique copy
COW,就是复制到各个进程自己的内存空间里去。所以。parent中的 BFBD7048和child中的 BFBD7048
不是同一个地址,只是相对改进程地址空间的offset或者,其实就是一个虚拟地址。child和parent,在他们
自己看来,自己拥有了全部的内存空间,而感觉不到其他的进程的存在,child感觉不到parent也同样有一块
内存空间。
希望你能理解我上面的解释。
|
楼上正解