一尘不染

sched_setaffinity()如何工作?

linux

我正在尝试了解linux syscallsched_setaffinity()的工作方式。这是我在这里提出的问题的后续。

我有本指南该指南说明了如何使用syscall并有一个非常简洁(工作!)的示例。

因此,我下载了Linux 2.6.27.19 内核源代码

我对包含该系统调用的行进行了“ grep”操作,得到了91个结果。没有希望。

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

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

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

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


阅读 619

收藏
2020-06-03

共1个答案

一尘不染

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

调度程序实际上在每个CPU上运行,因此有机会决定在该特定CPU上下一步执行什么任务。

如果您对如何在其他CPU上实际调用某些代码感兴趣,建议您参考一下smp_call_function_single()。如果我们要在另一个CPU上调用某个东西,则调用generic_exec_single()。后者只是将函数添加到目标CPU的调用队列中,并通过一些IPI东西(如果队列为空)来强制重新计划。

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

2020-06-03