Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 缓存可以保存来自多个进程的数据吗?_Multithreading_Caching_X86_Multiprocessing - Fatal编程技术网

Multithreading 缓存可以保存来自多个进程的数据吗?

Multithreading 缓存可以保存来自多个进程的数据吗?,multithreading,caching,x86,multiprocessing,Multithreading,Caching,X86,Multiprocessing,我们知道缓存使用虚拟地址。那么,当涉及多个进程时,特别是对于共享缓存(如共享二级缓存),或者甚至对于本地一级缓存,当进程切换时(如在同步(超)多线程中),这是如何工作的呢?您可以在同一物理核上运行来自两个不同进程的线程。当涉及来自不同进程的线程时,超线程有什么好处吗?或者,它只能在涉及同一进程的线程时提高性能吗?没有一种主要的x86 CPU微体系结构使用虚拟寻址缓存。它们都使用虚拟索引/物理标记(VIPT)L1缓存。VIPT是一种性能黑客,它允许在TLB查找的同时获取集合中的标记 用作索引的地址

我们知道缓存使用虚拟地址。那么,当涉及多个进程时,特别是对于共享缓存(如共享二级缓存),或者甚至对于本地一级缓存,当进程切换时(如在同步(超)多线程中),这是如何工作的呢?您可以在同一物理核上运行来自两个不同进程的线程。当涉及来自不同进程的线程时,超线程有什么好处吗?或者,它只能在涉及同一进程的线程时提高性能吗?

没有一种主要的x86 CPU微体系结构使用虚拟寻址缓存。它们都使用虚拟索引/物理标记(VIPT)L1缓存。VIPT是一种性能黑客,它允许在TLB查找的同时获取集合中的标记

用作索引的地址位在物理地址和虚拟地址中是相同的。(即,它们是4k页面内偏移量的一部分,因此不需要TLB进行翻译)。这意味着它的行为与phys/phys(PIPT)缓存完全相同,避免了虚拟寻址的所有问题

这是通过保持缓存小并且有足够的方法实现的。Intel的L1缓存为32kiB,8路关联,64B行。这说明了所有页内地址位。(有关图表和更详细的说明,请参阅其他参考资料。)

由于x86 CPU避免了缓存混叠(同义词/同音词问题),因此超线程可以在单独的进程中正常工作。它们就像物理寻址的缓存一样工作。不过,两个不共享任何内存的内存密集型进程在进行超读时可能会比不进行超读时运行得慢。竞争性共享缓存可能比一个进程在另一个进程完成后运行更糟糕,如果这是一种选择的话

对于在超线程共享的资源以外的资源上出现瓶颈的进程,HT当然有帮助。e、 g.分支预测失误。此外,由于无法预测对大型工作集的访问而导致缓存未命中,如果不进行超读,该工作集仍会经常未命中


使用virt/virt缓存的cpu确实需要在上下文开关上使它们失效,或者使用额外的标记来跟踪它们用于哪个PID。这就像缓存当前支持虚拟化所做的:它们用VM ID标记,因此它们知道它用于哪个VM的物理地址。virt/virtl1意味着您不需要快速TLB:它只在一级未命中时才需要,因此一级缓存也在缓存转换

有些设计必须使用phys/phys L1,但我不知道任何具体的例子。virt/phys技巧在高性能cpu中非常常见,因为一个具有足够方法使之成为可能的L1无论如何都是一个好主意

请注意,只有L1曾经使用virt地址


其他链接:

  • 这条线索涉及到一系列关于缓存的细节和问题。大卫·坎特的帖子倾向于以可读的方式解释事情。我还没有读完整条线索。RWT论坛现在可以搜索了!因此,如果你在谷歌上搜索更多细节,你可能会在那里看到多年论坛帖子的更多点击率

  • :它具有虚拟寻址缓存的缺点,但没有任何优点。(,并给出了极其深奥的原因:即使是TLB也太大,无法在发射极耦合逻辑中实现,因此他们实现TLB片,以便只转换足够的物理索引位。鉴于这一限制,PIPT和VIPT不是选项,他们决定使用PIVT而不是VIVT


您确定x86缓存使用虚拟地址吗?我的回答有所不同。这是特定于体系结构的。如果缓存是虚拟索引/物理标记的,则根本没有问题。两个不同的线程可以使用相同的虚拟地址进行查找,但只有具有匹配物理地址的进程才会受到影响。这样的取消锁定高级抽象结构和低级现实力学的混合永远不会产生一个有意义的问题。这不是一个C问题。