[英]How does sched_setaffinity() work?
我试图了解linux系统调用sched_setaffinity()的工作原理。 这是我在这里提出的问题的后续内容。
我有这个指南 ,它解释了如何使用系统调用,并有一个非常整洁(工作!)的例子。
所以我下载了Linux 2.6.27.19 内核源代码 。
我对包含该系统调用的行进行了'grep',得到了91个结果。 没有前途。
最后,我试图了解内核如何为特定内核 (或处理器)设置指令指针。
我熟悉单核单线程程序的工作原理。 有人可能发出'jmp foo'指令,这基本上将IP设置为'foo'标签的内存地址。 但是当一个有多个内核时,必须说“在内存地址foo处获取下一条指令,并设置内核编号2的指令指针以便在那里开始执行。”
在汇编代码中,我们指定哪个核心执行该操作?
回到内核代码:这里重要的是什么? 文件'kernel / sched.c'有一个名为sched_setaffinity()的函数,但返回类型为“long” - 这与其手册页不一致。 那么重要的是什么? 这些模块中的哪一个显示了组装说明? 什么模块正在读取'task_struct',查看'cpus_allowed'成员,然后将其转换为指令? (我还翻阅了glibc源代码 - 但我认为它只是调用内核代码来完成这项任务。)
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上运行该进程。
检查一下: B操作系统编程指南
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.