刚刚学完系统的编程讲座材料后,我偶然发现了内存模型以及缓存一致性协议的关键概念。尽管它们作为独立概念是有意义的,但尚不清楚它们如何结合在一起。具体来说,在查看 x86 时,我正在使用强制执行 TSO 内存模型的 ISA,以及使用 MESIF 缓存一致性协议的 CPU(对于 Intel)。
\n\n一开始,教授引入了缓存一致性协议,作为确保芯片中任何核心都访问一个大的单片内存块的手段。然后,在结束了缓存一致性之后,他继续研究内存模型,特别是 TSO(我们已经在并行编程课程中介绍了线性化/顺序一致性)。以下是直接引用有关 x86 内存模型的讲座材料:
\n\n\n\n\n\n
\n- 64 位 x86 处理器的标准\n \n
\n\n
- 有时称为总商店订购 (TSO)
\n- 早期的 32 位 x86 实现的 PRAM \xe2\x80\x93 较弱!
\n- 写入读取放宽:稍后的读取可以绕过早期的写入\n \n
\n\n
- 所有处理器都按照发出的顺序查看来自一个处理器的写入。
\n- 处理器可以看到来自不同处理器的不同写入交错。
\n
似乎我们通过在缓存层次结构中引入(又一个)层,即(有序的)存储缓冲区,“解决”了缓慢的顺序一致性问题。\n对我来说,TSO 似乎与缓存一致性的原则正交。我们非常努力地让我们的缓存匹配,只是在两者之间添加了未被缓存一致性覆盖的另一层。
\n\n问题:
\n\n提前非常感谢您的澄清!
\n\n最好,\n菲利克斯
\n正如标题所暗示的,问题是关于Linux 上 x86-64 中聚合类型的对齐。
在我们的讲座中,教授介绍了结构(及其元素)与附加幻灯片的对齐方式。因此,我会假设(根据维基百科和其他讲座材料)对于任何聚合类型,对齐是根据其最大成员。不幸的是,在以前的考试问题中似乎并非如此,它说:
“假设每个页表 [4kB,每个 PTE 64b] 都存储在内存中一个“自然对齐”的物理地址(即一个表大小的整数倍的地址),......”
为什么对于页表(它基本上是内存中的 8 字节值的数组),对齐规则不是根据最大的元素,而是根据整个表的大小?