欢迎任何建议/讨论!
问题实际上是简短的标题,但我会解释为什么我需要实际地址.
背景:
这些天我对缓存和多核架构着迷,现在我很好奇缓存如何影响我们的程序,在并行环境下.
在某些CPU型号(例如,我的英特尔酷睿双核T5800)中,L2缓存在核心之间共享.所以,如果程序A正在访问像物理地址那样的内存
0x00000000, 0x20000000, 0x40000000...
和程序B访问数据
0x10000000, 0x30000000, 0x50000000...
由于这些地址共享相同的后缀,因此L2缓存中的相关集将经常刷新.我们期望看到两个程序相互争斗,从内存缓慢读取数据而不是缓存,尽管它们在不同的核心中分开.
然后我想在实践中验证结果.在这个实验中,我必须知道物理地址而不是虚拟地址.但我怎么能应付这个呢?
第一次尝试:
从堆,面具吃一大块空间,并获得一定的地址.
我的CPU有一个L2缓存,大小= 2048KB,关联性= 8,因此物理地址类似于0x12340000, 0x12380000, 0x123c0000L2缓存中的第一个设置.
int HEAP[200000000]={0};
int *v[2];
int main(int argc, char **argv) {
v[0] = (int*)(((unsigned)(HEAP)+0x3fffc) & 0xfffc0000);
v[1] = (int*) ((unsigned)(v[0]) + 0x40000);
// one program pollute v[0], another polluting v[1]
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,在虚拟内存的"帮助"下,变量HEAP在物理内存中并不总是连续的.v[0]并且v[1]可能与不同的缓存集有关.
第二次尝试
访问/proc/self/mem,并尝试获取内存信息.
嗯......似乎结果仍然是关于虚拟内存.
我的问题与此类似,但我问的是有点不同.
很明显,可以将第一个std::vector元素的地址用作C类型数组.这意味着在虚拟内存中,std::vector元素是连续的.但是,如果物理内存碎片化,则可能std::vector实际上将其拆分为物理内存中的许多部分.
我的问题是:std::vector元素在物理内存(以及虚拟内存)中是否连续?
我正在测试Linux上接口的吞吐量.我正在使用DMA todo进行数据传输.DMA需要连续的内存位置.但是kmalloc无法分配超过1MB.有没有其他方法可以创建高达100M字节的大缓冲区位置?
据我所知,堆栈内存在虚拟内存地址中是连续的,但是堆栈内存在物理上也是连续的?这与堆栈大小限制有关吗?
编辑:
我曾经认为堆栈内存不必在物理上是连续的,但是为什么我们认为堆栈内存总是比堆内存快?如果它在物理上不是连续的,那么堆栈如何利用缓存的更多优势?还有另一件事总是让我感到困惑,cpu在数据段中执行指令,该指令不在虚拟内存中的堆栈段附近,我认为操作系统不会使堆栈段和数据段在物理上彼此靠近,因此这可能会损害缓存效果,您认为呢?
再次编辑:
也许我应该举一个例子来更好地表达自己,如果我们想对大量数字进行排序,使用数组存储数字要比使用列表更好,因为每个列表节点都可以由构造malloc,因此没有充分利用缓存,这就是为什么我说堆栈内存比堆内存快。
linux ×2
c ×1
c++ ×1
caching ×1
cpu-cache ×1
heap-memory ×1
linux-kernel ×1
memory ×1
performance ×1
stack-size ×1
vector ×1