免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1338 | 回复: 1
打印 上一主题 下一主题

[Linux] 关于Linux -Copy-on-write机制的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-24 13:07 |只看该作者 |倒序浏览
代码如下:
#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[2242] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:256 address:0x0x804a024,*pbuf = 1
parent task[2242] value:257 address:0x0x804a024,*pbuf = 2
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:258 address:0x0x804a024,*pbuf = 3
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:259 address:0x0x804a024,*pbuf = 4
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:260 address:0x0x804a024,*pbuf = 5
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:261 address:0x0x804a024,*pbuf = 6
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:262 address:0x0x804a024,*pbuf = 7
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:263 address:0x0x804a024,*pbuf = 8
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] 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????

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-05-24 19:24 |只看该作者
打印的地址是虚拟内存地址,不是物理地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP