我试图了解 linux 系统调用 sched_setaffinity() 是如何工作的。这是我的问题 here 的后续内容。

我有 this guide ,它解释了如何使用系统调用并有一个非常简洁(工作!)的例子。

所以我下载了 Linux 2.6.27.19 kernel sources

我对包含该系统调用的行进行了“grep”,得到了 91 个结果。不乐观。

最终,我试图了解内核如何为特定内核(或处理器)设置指令指针。

我熟悉单核单线程程序的工作原理。人们可能会发出“jmp foo”指令,这基本上将 IP 设置为“foo”标签的内存地址。但是当有多个内核时,必须说“在内存地址 foo 处获取下一条指令,并设置内核编号 2 的指令指针以在那里开始执行”。

在汇编代码中,我们在哪里指定哪个内核执行该操作?

回到内核代码:这里重要的是什么?文件 'kernel/sched.c' 有一个名为 sched_setaffinity() 的函数,但返回类型“long”——这与其 manual page 不一致。那么这里重要的是什么?以下哪个模块显示发出的汇编指令?哪个模块正在读取“task_struct”,查看“cpus_allowed”成员,然后将其转换为指令? (我也翻阅了 glibc 源代码 - 但我认为它只是调用内核代码来完成这项任务。)

最佳答案

sched_setaffinity() 只是告诉调度程序允许进程/线程在哪些 CPU 上运行,然后调用重新调度。

调度程序实际上在每个 CPU 上运行,因此它有机会决定在该特定 CPU 上接下来要执行的任务。

如果您对如何在其他 CPU 上实际调用某些代码感兴趣,我建议您查看 smp_call_function_single() 。如果我们想在另一个 CPU 上调用某些东西,这会调用 generic_exec_single() 。后者只是将函数添加到目标 CPU 的调用队列中,并通过一些 IPI 内容(如果队列为空)强制重新安排。

底线是:_jmp_ 指令没有实际的 SMP 变体。相反,运行在其他 CPU 上的代码相互协作以完成任务。

关于c - sched_setaffinity() 如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/766395/

10-16 06:17