1

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

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

4

2 回答 2

3

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

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

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

于 2012-11-15T12:36:34.697 回答
0

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

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

于 2012-11-13T20:39:28.710 回答