在我的服务器中,存在多个CPU(0-7)。我需要运行并行代码,每个进程都有一个CPU,所以我怎么知道每个进程的CPU信息?
例如,如果存在两个进程(#0和#1),则进程#0使用CPU 5,进程#1使用CPU 7。
我怎么知道用C或Fortran编程?
答案 0 :(得分:2)
使用sched_getcpu()来电。
请记住,可以自由调度进程/线程以在任何可用的cpu / core上运行,因此您的一个进程可以在核心1上运行一秒,在核心2上运行下一个毫秒。您可以使用sched_setaffinity()
限制允许进程运行的处理器答案 1 :(得分:2)
我不知道Linux上有任何系统调用,它会为您提供有关正在运行的线程的CPU的一般信息。 @nos是正确的,sched_getcpu()会告诉你一个线程正在运行哪个CPU,但仅用于调用上下文。
您可以通过查询/proc
文件系统来执行此操作。但是,如果您发现自己围绕此功能构建应用程序,则可能需要重新检查您的设计。
文件/proc/<pid>/stats
包含一个字段,为您提供进程运行的最后一个CPU。您只需要解析输出。 (使用man proc
查看字段列表。)
答案 2 :(得分:1)
通常,操作系统的任务是从应用程序中抽象出这样的东西。 通常情况下,我看到我的应用程序(就像在巨大的文件上执行grep一样简单)每隔一段时间就会更改一次CPU内核。
现在,如果要在特定核心上强制应用程序,可以手动设置CPU亲和力。
过去我写过一些非常奇怪的软件,我从来没有想过要知道和/或控制它。
为什么想要知道?
答案 3 :(得分:0)
通常,您必须更改CPU亲和性,因为进程可以在处理器之间迁移:CPU Affinity(Linux Journal,2003)。
答案 4 :(得分:0)
更一般地说,你为什么想知道? Linux内核非常擅长调度进程/线程以充分利用可用内核。