kunis 发表于 2014-05-24 13:07

关于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????

timespace 发表于 2014-05-24 19:24

打印的地址是虚拟内存地址,不是物理地址。
页: [1]
查看完整版本: 关于Linux -Copy-on-write机制的疑惑