CPU affinity 是跨系统调用强制执行的吗?

Is CPU affinity enforced across system calls?

因此,如果我使用以下方法设置进程的 CPU 关联:

sched_setaffinity()

然后使用该进程执行其他一些系统调用,系统调用是否也保证在 sched_setaffinity 强制执行的相同 CPU 上执行?

本质上,我试图强制一个进程和它进行的系统调用在同一个核心上执行。显然,我可以使用 sched_setaffinity() 强制执行 userspace 代码将仅在一个 CPU 上执行,但是同一个系统调用是否强制执行该进程上下文中的 kernel-space 代码?也在同一个核心上?

谢谢!

系统调用实际上只是您从用户模式切换到内核模式的进程代码。正在运行的任务根本没有改变,它只是暂时进入内核模式执行系统调用然后returns回到用户模式。

任务可以被调度程序抢占并移动到不同的 CPU,这可能发生在正常用户模式代码的中间,甚至发生在系统调用的中间。

通过使用 sched_setaffinity() 将任务亲和力设置为单个 CPU,您消除了这种可能性,因为即使任务被抢占,调度程序也别无选择,只能保留它 运行ning 在同一个 CPU 上(它当然可能会改变当前的 运行ning 任务,但是当你的任务恢复时它仍然会在同一个 CPU 上)。

所以回答你的问题:

does that same system call enforce kernel-space code in that process context will execute on the same core as well?

是的,确实如此。


现在,解决 @Barmar 的评论:在可以 "sleep" 的系统调用的情况下,这并不意味着如果亲和力不存在,任务可以更改 CPU允许它。

系统调用休眠时发生的事情,只是系统调用代码告诉调度程序:"hey, I'm waiting for something, just run another task while I wait and wake me up later"。当系统调用恢复时,它会检查请求的资源是否可用(它甚至可以准确地告诉内核何时它想被唤醒),如果不可用,它要么再次等待,要么 returns 到用户代码说 "sorry, I got nothing, try again"。资源当然可以通过某些中断使中断处理程序在不同的 CPU 上 运行 可用,但这是另一回事,这并不重要。简单地说:中断代码根本不在进程上下文中 运行。对于执行系统调用的任务而言,当恢复执行时,资源就神奇地存在了。