在IO上等待的线程是否也会阻塞内核?

问题描述:

在计算的同步/阻塞模型中,我们通常会说等待IO任务完成时,一个执行线程将等待(等待阻塞)。在IO上等待的线程是否也会阻塞内核?

我的问题是,这通常会导致执行线程的CPU内核处于空闲状态,或者等待IO的线程通常会被上下文切换出来并进入等待状态,直到IO准备好被处理?

+0

@瑞恩,我猜你可能会有很多关于这个主题的论文,但我只是对可能和通常会发生什么的一般理解。 – JamieP

+0

我不需要一个资格只是一个普通的驾驶;) – JamieP

+0

对不起,我误解了。 –

CPU内核通常不专用于某个特定的执行线程。内核一直在切换执行进出CPU的进程。 CPU当前正在执行的进程处于“运行”状态。等待轮到的进程列表处于“准备就绪”状态。内核非常快速地切换这些进出。现代CPU特性(多核,同时多线程等)尝试增加一次可以实际执行的执行线程数。

如果一个进程被I/O阻塞,内核会将它放在一边(置于“等待”状态),甚至不考虑在CPU中给它一些时间。当I/O完成时,内核将被阻止的进程从“等待”状态移动到“就绪”状态,以便它可以在CPU中轮流(“运行”)。

因此,您阻止的执行线程只会阻止:执行的线程。 CPU和CPU内核继续有其他执行线程切入和切出,并且不会闲置。

+0

@RyanVincent:用户空间进程可以直接使用内存,而无需进行系统调用。 [等待缓存未命中的进程仍然占用一个CPU内核](http://*.com/questions/19980070/which-one-will-workloadusage-of-the-cpu-core-if-there-is-一个永久缓存-MI)。如果使用繁忙等待螺旋锁进行线程同步,则也是如此。在等待其他任何事情时,内核会收到通知。它会唤醒正在等待该磁盘块或网络数据包的线程。 –

+0

另外,Linux上低prio任务总是会得到一些CPU。最小值prio不是“只有当CPU处于空闲状态时”,才能避免死锁,如果低级prio进程占用资源或其他东西。显然支持真正的空闲优先级会使调度程序更加复杂,因为它必须检查何时完全停止进程是安全的。所以即使不使用它,这也会稍微放慢调度速度,因此Linux不包含它。所以每一个没有等待的过程都会收到一些时间片。 –

+0

@PeterCordes,感谢您的解释 - 它有帮助。 –

对于大多数以标准方式使用的编程语言,答案是它会阻塞你的线程,但不会阻塞你的CPU。

您需要为1个线程的特定线程(亲和性)明确预留一个CPU来阻塞整个CPU。为了更加明确,请参阅本question

你可以把SetProcessAffinityMask上的每个过程,但你用排除只是将“属于”你的过程中,核心口罩,并用它在你的程序设置它只在这个核心上运行(或者,甚至更好,只是在执行时间关键任务的线程上运行SetThreadAffinityMask)。

+0

亲和力与此相反:它将一个线程标记为只能在有限的CPU上运行。它*不会停止使用该CPU的其他任务。最近有一个关于如何为最近的流程预留核心的问题,但我找不到它。 –

+0

您可以使用关联来排除运行线程的核心上运行的其他进程。 – DevShark