Caching 虚拟地址匹配在共享内存IPC中是否重要?

Caching 虚拟地址匹配在共享内存IPC中是否重要?,caching,cpu,shared-memory,x86-64,Caching,Cpu,Shared Memory,X86 64,我在同一台机器上的两个进程(Linux x86_64 shmget和friends)之间实现IPC,并试图最大化进程之间的数据吞吐量:例如,我限制两个进程仅在同一个CPU上运行,以便利用硬件缓存 我的问题是,每个进程将共享对象放在虚拟地址空间的哪个位置重要吗?例如,在两个过程中将对象映射到同一位置是否有利?为什么?为什么不?我不是这里的专家,但鉴于没有其他答案,我将尝试一下。我不认为这真的会有什么不同,因为虚拟地址不一定与物理地址对应。换句话说,操作系统将虚拟地址映射到的底层物理地址并不依赖于操

我在同一台机器上的两个进程(Linux x86_64 shmget和friends)之间实现IPC,并试图最大化进程之间的数据吞吐量:例如,我限制两个进程仅在同一个CPU上运行,以便利用硬件缓存


我的问题是,每个进程将共享对象放在虚拟地址空间的哪个位置重要吗?例如,在两个过程中将对象映射到同一位置是否有利?为什么?为什么不?

我不是这里的专家,但鉴于没有其他答案,我将尝试一下。我不认为这真的会有什么不同,因为虚拟地址不一定与物理地址对应。换句话说,操作系统将虚拟地址映射到的底层物理地址并不依赖于操作系统提供给您的虚拟地址


再说一次,我不是记忆大师。对不起,如果我离这里太远了。

这与操作系统无关。如果没有在上下文切换之间刷新TLB缓存,则在两个进程中使用相同的基址将是有利的。Translation Lookaside Buffer(TLB)缓存是一个小型缓存,用于缓存各个页面的虚拟到物理地址转换,以减少从进程页表读取的昂贵内存的数量。每当发生上下文切换时,TLB缓存都会被刷新—您不希望进程能够读取其他进程的一小部分内存,因为它的页表条目仍然缓存在TLB中

在不同内核上运行的进程之间不会发生上下文切换。但每个核心都有自己的TLB缓存,其内容与另一个核心的TLB缓存内容完全不相关。在同一进程的线程之间切换时,不会发生TLB刷新。但是线程仍然共享它们的整个虚拟地址空间

只有在传递指向共享内存段内部区域的绝对指针时,才能将共享内存段附加到同一虚拟地址。例如,想象一下共享内存中的链表结构。通常的做法是使用块开头的偏移量,而不是aboslute指针。但这是缓慢的,因为它涉及额外的指针算法。这就是为什么使用绝对指针可能会获得更好的性能,但在两个进程的虚拟地址空间中找到合适的位置可能不是一件容易的任务(至少不是以可移植的方式),即使是在x86-64这样具有大量VA空间的平台上