9,506
社区成员
发帖
与我相关
我的任务
分享
f.c
int x=0;
int inc()
{
x++;
return x;
}
汇编代码为
ff 05 00 00 00 00 incl 0x0
1.这个动态链接库中有一个全局变量,
2.当某个应用加载该库时,要对该变量重定位;并且多个应用加载该库时,库的加载起始地址可能不一致。
3.要对不同的地址空间中的这个变量进行重定位,自然要修改引用了该全局变量的代码页,内核会COW,那么每个进程就有了该页的一个副本.
1。全局变量在共享库的数据段
2。数据段共享是COW方式
3。全局变量毕竟是变量,可以在进程的运行过程中被修改,因此每个进程应当有不同的copy,因此COW是合理的。
4。如果是全局常量,则在代码段,对所有进程都是可见的,代码段只是只读共享,没有COW.
详见:
http://sheepxxyz.blog.163.com/blog/static/61116213200911101412711/
http://wildpointer.net/2010/11/28/dl-do-not-share-global-variable/comment-page-1/#comment-2534