找到线程访问的页面

时间:2013-04-15 06:15:47

标签: caching memory operating-system scheduling shared-memory

我正在寻找一些基于线程访问的数据的调度选项。有没有办法找到特定线程访问的缓存页面。 如果我有来自两个不同进程的两个线程,是否可以找到两个线程访问的公共数据/页面

1 个答案:

答案 0 :(得分:1)

来自同一进程的两个线程可能共享整个进程内存空间。如果程序没有限制对线程的某些内存区域的访问,则可能很难确切地知道应该将哪个线程分配给哪个cpu。

对于更多线程,问题变得更加困难,因为线程可能与多个不同的线程共享不同的数据,并创建关系网络。如果两个线程之间的关系要求它们与给定的cpu核心具有亲和性,那么通过传递性,它们关系网络的所有线程也应该绑定到同一个核心。 也许关系的数量或某种形式的聚类分析(biconnectivity)会有所帮助。


关于您的具体问题,如果两个线程共享数据但来自不同的进程,则这些进程必须使用shm_open(创建共享内存段)和{{1}自愿共享这些页面。 (在进程内存中映射该段)。不可能在进程之间共享数据页,否则(再次)与操作系统用于分叉进程的写入机制复制有关,在这种情况下,每个页面保持共享,直到一个进程写入它为止。

页面的显式共享(通过mmap)可用于以编程方式为两个线程定义相同的CPU亲和性 - 可能通过两个程序中的约定将相关线程与第一个核心相关联,或者通过一个小的通过共享内存对象在某一点建立握手协议(例如,内存段的第一个字节可以被第一个线程设置为所选择的cpu号+ 1来访问它,0表示没有亲和性)。

不幸的是,posix线程API没有提供为线程设置cpu亲和性的方法。您可以使用Linux平台shm_open上提供的非可移植扩展,使用pthread_attr_setaffinity_np函数系列来配置线程关联。

的引用: