sched_setaffinity()如何工作?

我想了解linux系统调用sched_setaffinity()如何工作。 这是我的问题在这里的一个后续。

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

于是我下载了Linux 2.6.27.19 内核源码 。

我为包含该系统调用的行做了一个“grep”,并得到了91个结果。 没有希望。

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

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

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

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

Solutions Collecting From Web of "sched_setaffinity()如何工作?"

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

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

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

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

我认为你不了解的是内核在所有的CPU内核上运行。 在每个定时器中断(〜1000每秒),调度程序在每个CPU上运行,并选择一个进程运行。 没有一个CPU以某种方式告诉其他人开始运行一个进程。 sched_setaffinity()通过在进程上设置标志来工作。 调度程序读取这些标志,如果不设置,则不会在CPU上运行该进程。

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

这里没有涉及组件。 每个任务(线程)一次被分配给单个CPU(或核心)。 要停止在给定的CPU上运行,并在另一个CPU上恢复,任务必须“ 迁移 ”(也是这个 )。 当一个任务从一个CPU迁移到另一个时,调度程序会在sched_setaffinity()允许的CPU中选择更为空闲的CPU。

没有发布魔术装配说明。 内核对硬件有更低级别的看法,每个CPU是一个独立的对象,与用户空间过程(在用户空间中,CPU几乎看不见)有很大不同。

请查看: B操作系统编程指南