fork()在特定的CPU集上运行

时间:2016-02-10 12:09:43

标签: c linux

我有一个父进程,我用它来生成一系列子进程,每个子进程按顺序运行自己的程序。这些程序中的每一个都会随着时间的推移而改变文件,我想从这个文件中读取数据,看看每个程序运行时它是如何变化的。

我需要两组数据才能工作,文件的值在某个设定的时间间隔内(我还没有确定时间间隔),以及每个程序运行的时间,还有其他变量可以影响这些程序的执行时间,我也希望看到。

所以我想要更精确地计算子进程的时间,同时仍然从文件中读取我可以在不同的核心上运行它们。我有8个核心,我想在0-3上运行父进程,然后分叉子进程运行4-7。我不确定这是否可能在C中,并且搜索周围没有产生任何答案,这让我觉得它不是。

在Linux中,在程序之外,我可以使用taskset来执行此操作。

我计划使用内核参数isolcpus()预留4个内核。在运行子程序时,我希望尽可能少的噪音。

1 个答案:

答案 0 :(得分:1)

要求内核将CPU内核与线程或进程相关联也称为设置" affinity"核心和进程/线程之间。

在linux下,存在一组提供此功能的函数。查看manual page的其中一个功能......

man pthread_setaffinity_np

这一系列的API调用可能能够满足您的需求。 该手册页有一个"另见"链接到此系列中其他功能的部分。

通常具有处理内核进程和线程调度的这些功能,它完全取决于内核当时的情绪,无论您的请求是否得到满足或被忽略。您的里程可能是由系统负载或可用内核数量造成的。即使系统有16个内核,也可以在内核编译设置中禁用这些功能(想想虚拟机)。同样,您可能会发现有一些额外的选项可以添加到内核中,以获得比默认值更好的结果。