每个进程如何由调度程序固定到特定的核心(Linux)

我现在正在研究Linux的调度程序。 关于CPU核心的亲和力,我想知道以下几点:

1)每个进程(线程)如何被固定到一个核心?

有一个系统调用sched_setaffinity来更改执行进程的核心关联。 但是在内部,当进程(或线程)生成时,默认的Linux调度器如何将进程(线程)分配给特定的内核? 我修改了sched_setaffinity系统调用来转储有关从一个核心移动到另一个核心的任务的信息。

printk(KERN_INFO "%d %d %ld %lu %sn", current->pid, current->tgid,
                                       current->state, current->cpus_allowed,
                                       current->comm);

看起来在/var/log/messages没有上述信息的转储。 所以默认的调度程序以不同的方式固定每个进程,但我无法弄清楚。

2)是否可以通过PID或其他信息获取核心ID?

这是我想在Linux内核中实现的。 在task_struct ,有一个名为cpus_allowed的成员。 但这是设置关联的掩码,而不是核心ID。 我想检索一个标识指定进程正在运行的核心的数据。

谢谢,


每个CPU都有自己的runqueue,AFAIK,我们可以通过查找它所属的runqueue来找出进程当前的CPU。 给定task_struct *p ,我们可以通过struct rq = task_rq(p)得到它的runqueue,而struct rq有一个名为cpu的字段,我想这应该是答案。

我在实践中没有尝试过,只是在网上阅读了一些代码,并不确定它会不会起作用。 希望它可以帮助你。


您可以通过使用其task_struct来确定正在运行线程的CPU ID:

#include <linux/sched.h>

task_struct *p;
int cpu_id = task_cpu(p);

/proc/pid/stat字段39告诉进程的当前核心/ CPU。

例如:

#cat /proc/6128/stat
6128 (perl) S 3390 6128 3390 34821 6128 4202496 2317 268 0 0 1621 59 0 0 16 0 1 0 6860821 10387456 1946 18446744073709551615 1 1 0 0 0 0 0 128 0 18446744073709551615 0 0 17 8 0 0 0

进程6128在核心8上运行。

链接地址: http://www.djcxy.com/p/9589.html

上一篇: How is each process pinned to a specific core by scheduler (Linux)

下一篇: How to change the output color of echo in Linux