- 论坛徽章:
- 2
|
本帖最后由 OwnWaterloo 于 2011-12-07 20:50 编辑
回复 19# kkmm0105
呃, 我上面说的局部貌似没说清楚…… 是这个意思:
void* thread1(void* arg)
{
int x = cx1;
for (; x< n; ++x);
cx1 = x;
return 0;
}
为什么会相关么…… 我能力有限解释不好……
假设一个简化的模型:
1. 有512字节缓存
2. 地址空间是[0,65536)
这512字节缓存不会整体映射到[0,65536) 中的某一个长度为512字节区间上;
也不是单独每个字节映射到[0,65536) 中的512个字节上;
而是被分成,比如32个块, 每块16个字节大小。
而且也不能随意映射, 而是将[0,65536)也划分成16字节大小共4096个块, 缓存的32个块可能会映射到地址空间上的某个块中。
如果 cx1 与 cx2 过于接近, 就有可能在4096个块中的同一个块中,也是在32个块中的同一块中。
对cx1 或 cx2 的写都会使该块变脏, 时间就消耗在缓存与内存之间的交换上了。
拉大它们的距离就可以避免这样的情况。 |
|