我正在寻找一些基于线程访问的数据的调度选项。有什么方法可以找到特定线程访问的缓存页面。如果我有来自两个不同进程的两个线程,是否可以找到两个线程访问的公共数据/页面
1 回答
来自同一进程的两个线程可能共享整个进程内存空间。如果程序不限制线程对某些内存区域的访问,则可能很难确切知道应该将哪个线程分配给哪个 cpu。
对于更多的线程,问题变得更加困难,因为一个线程可能与几个不同的线程共享不同的数据,并创建一个关系网络。如果两个线程之间的关系要求它们与给定的 cpu 核心具有亲和力,则通过传递性,它们关系网络的所有线程也应该绑定到同一个核心。也许关系的数量或某种形式的聚类分析(双连通性)会有所帮助。
关于您的具体问题,如果两个线程正在共享数据,但来自不同的进程,那么这些进程必然会通过使用shm_open
(创建共享内存段)和mmap
(将该段映射到进程内存中)自愿共享这些页面。否则不可能在进程之间共享数据页面,除非(再次)隐含地(再次)使用操作系统用于分叉进程的写时复制机制,在这种情况下,每个页面都保持共享,直到一个进程对其进行写入。
页面的显式共享 (by shm_open
) 可用于以编程方式为两个线程定义相同的 CPU 亲和性——可能是按照两个程序中的约定将相关线程与第一个核心相关联,或者通过在某个点建立的小型握手协议通过共享内存对象(例如,内存段的第一个字节可以设置为选择的 cpu 编号 + 1 由第一个线程访问它,0 表示还没有亲和性)。
不幸的是,posix 线程 API 没有提供为线程设置 cpu 亲和性的方法。您可以使用 linux 平台上提供的不可移植的扩展pthread_attr_setaffinity_np
,以及cpuset
一系列函数来配置线程亲和性。
参考: