当前位置: 技术问答>linux和unix
关于fork()进程的一个简单问题!!!!!!!!!!!!!!!!
来源: 互联网 发布时间:2016-10-21
本文导语: #include #include int main() { char buf[3]="AB"; char *str=buf; if(fork()>0) wait(); else *str='M'; printf("%x:%sn",(unsigned int)str,str); return 0; } linux2.6环境下编译运行,结果是: bfc807bd:MB...
#include
#include
int main()
{
char buf[3]="AB";
char *str=buf;
if(fork()>0)
wait();
else
*str='M';
printf("%x:%sn",(unsigned int)str,str);
return 0;
}
linux2.6环境下编译运行,结果是:
bfc807bd:MB
bfc807bd:AB
我的疑问是:
子进程和父进程输出的str 地址都是bfc807bd,子进程修改了bfc807bd内存单元的值,为什么父进程输出的还是AB??
在父进程创建子进程后,子进程获得父进程的一个副本,包括数据段,栈空间,指令段等,既然str指向的都是同一个地址,为什么数据不同? 难道与进程的虚拟地址空间有关?
|
不需要深入理解都该明白,不同进程有各自的虚拟内存空间,两个地址都是虚拟的而已。应该系统地学习下。
|
str 地址都是bfc807bd ,它是两套系统内的地址,各自算各自的。
|
虚拟地址。
他们各自有各自的地址空间。
COW,写时复制。
然后各自有各自的地址空间。
他们各自有各自的地址空间。
COW,写时复制。
然后各自有各自的地址空间。
|
cow全称copy on write:
linux下面有一个规定fork后的共享数据不会马上拷贝给子进程,而是当子进程在写数据区的时候会才开始拷贝父进程的数据,上面运行的结果也说明了这一点,父进程没有变化,子进程出现了变化。
|
1.基于效率的考虑,子进程创建时仅复制父进程的页表,因此子进程可以共享父进程的内存,只有子进程要更改内存数据时,操作系统才会复制对应的内存页。
2.程序里看到的地址都是虚拟地址,即使两个进程往同一个地址写,实际会映射到不同的地方.
2.程序里看到的地址都是虚拟地址,即使两个进程往同一个地址写,实际会映射到不同的地方.
|
我觉得是这样的,子进程执行时间可能在父进程的前面 也可能在后面,楼主可以尝试多执行几次。可能会有不同的结果、、、
|
虚拟地址撒,子进程和父进程都有独立的地址空间
|
ni ba thread he process gao hun luan le.
|
推荐 深入理解计算机系统 这本书,你看了之后就明白了。
|
不同进程有各自的虚拟内存空间。。。
学习了
学习了
|
差不多是这样
|
当你试图写的时候就会分配一个空间了 不和父进程共享了 读的时候不会 写时复制
|
当你写的时候就会重新非配一个空间不和父进程共享了 如果只是读读不会:写时复制