How does sched_setaffinity() work?

后端 未结 4 1032
生来不讨喜
生来不讨喜 2020-12-08 22:49

I am trying to understand how the linux syscall sched_setaffinity() works. This is a follow-on from my question here.

I have this guide, which explains how to use th

相关标签:
4条回答
  • 2020-12-08 23:28

    Where, in the assembly code, are we specifying which core performs that operation?

    There is no assembly involved here. Every task (thread) is assigned to a single CPU (or core in your terms) at a time. To stop running on a given CPU and resume on another, the task has to "migrate" (also this). When a task migrates from one CPU to another, the scheduler picks the CPU which is more idle among the CPUs allowed by sched_setaffinity().

    There is no magic assembly instructions issued. The kernel has a more low-level view of the hardware, each CPU is a separate object, very different than how it looks like for user-space processes (in user-space, CPUs are almost invisible).

    0 讨论(0)
  • 2020-12-08 23:28

    Check this out: B Operating System Programming Guidelines

    0 讨论(0)
  • 2020-12-08 23:29

    I think the thing you are not understanding is that the kernel is running on all the CPU cores. At every timer interrupt (~1000 per second), the scheduler runs on each CPU and chooses a process to run. There is no one CPU that somehow tells the others to start running a process. sched_setaffinity() works by just setting flags on the process. The scheduler reads these flags and will not run that process on its CPU if it is set not to.

    0 讨论(0)
  • 2020-12-08 23:41

    sched_setaffinity() simply tells the scheduler which CPUs is that process/thread allowed to run on, then calls for a re-schedule.

    The scheduler actually runs on each one of the CPUs, so it gets a chance to decide what task to execute next on that particular CPU.

    If you're interested in how you can actually call some code on other CPUs, I suggest you take a look at smp_call_function_single(). In case we want to call something on another CPU, this calls generic_exec_single(). The latter simply adds the function to the target CPU's call queue and forces a reschedule through some IPI stuff (if the queue was empty).

    Bottom line is: there no actual SMP variant of the _jmp_ instruction. Instead, code running on other CPUs cooperates in order to accomplish the task.

    0 讨论(0)
提交回复
热议问题