关于Linux -Copy-on-write机制的疑惑
代码如下:#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
volatile static int g_value = 0xFF;
static int *pbuf =NULL;
void child_task()
{
sleep(10);
while(1){
printf("child task[%d] value:%d address:0x%p,*pbuf = %d\n",getpid(),g_value,&g_value,*pbuf);
sleep(2);
}
exit(0);
}
int main(int argc,char *argv[])
{
pid_t pid = -1;
pbuf = (int *)malloc(4);
*pbuf = 0;
pid = fork();
if(pid == 0){
child_task();
}
while(1){
printf("parent task[%d] value:%d address:0x%p,*pbuf = %d\n",getpid(),g_value,&g_value,*pbuf);
g_value++;
*pbuf = *pbuf +1;
sleep(4);
}
exit(0);
return 0;
}
parent task value:255 address:0x0x804a024,*pbuf = 0
parent task value:256 address:0x0x804a024,*pbuf = 1
parent task value:257 address:0x0x804a024,*pbuf = 2
child task value:255 address:0x0x804a024,*pbuf = 0
child task value:255 address:0x0x804a024,*pbuf = 0
parent task value:258 address:0x0x804a024,*pbuf = 3
child task value:255 address:0x0x804a024,*pbuf = 0
parent task value:259 address:0x0x804a024,*pbuf = 4
child task value:255 address:0x0x804a024,*pbuf = 0
child task value:255 address:0x0x804a024,*pbuf = 0
parent task value:260 address:0x0x804a024,*pbuf = 5
child task value:255 address:0x0x804a024,*pbuf = 0
child task value:255 address:0x0x804a024,*pbuf = 0
parent task value:261 address:0x0x804a024,*pbuf = 6
child task value:255 address:0x0x804a024,*pbuf = 0
child task value:255 address:0x0x804a024,*pbuf = 0
parent task value:262 address:0x0x804a024,*pbuf = 7
child task value:255 address:0x0x804a024,*pbuf = 0
child task value:255 address:0x0x804a024,*pbuf = 0
parent task value:263 address:0x0x804a024,*pbuf = 8
child task value:255 address:0x0x804a024,*pbuf = 0
child task value:255 address:0x0x804a024,*pbuf = 0
编译运行的环境为Ubuntu 10.04.4 LTS/Linux 2.6.32-38-generic
从log来看 子进程继承了父进程变量以及heap。
根据网上COW的解释,子进程再去写内存的时候才会复制一份父进程的物理内存,如果不写,则子进程的page table表用的是父进程。
现在很困惑,既然以上程序 子进程没有写g_value,按理讲子进程g_value的值应该跟父进程指向同一个物理地址。
或者COW的理解为只要是父进程或子进程的任何一个去写变量,都会触发copy page table???? 打印的地址是虚拟内存地址,不是物理地址。
页:
[1]