等待 IO 的线程是否也会阻塞核心?

Does a thread waiting on IO also block a core?

在synchronous/blocking计算模型中,我们通常说执行线程在等待IO任务完成时会等待(阻塞)。

我的问题很简单,这通常会导致执行线程的 CPU 内核空闲,还是等待 IO 的线程通常会被上下文切换并进入等待状态,直到 IO 准备就绪待处理?

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

您需要明确地为特定线程(关联)保留 CPU,以便 1 个线程阻塞整个 CPU。更明确地说,请参阅此 question:

You could call the SetProcessAffinityMask on every process but yours with a mask that excludes just the core that will "belong" to your process, and use it on your process to set it to run just on this core (or, even better, SetThreadAffinityMask just on the thread that does the time-critical task).

一个CPU核心通常不专用于一个特定的执行线程。内核不断地切换正在执行的进程进出 CPU。 CPU当前正在执行的进程处于"running"状态。等待轮到它们的进程列表处于 "ready" 状态。内核非常快速地切换这些进出。现代 CPU 功能(多核、同步多线程等)试图增加可以同时物理执行的执行线程数。

如果一个进程被I/O阻塞,内核将把它放在一边(将其置于"waiting"状态),甚至不会考虑在CPU中给它时间。 I/O 完成后,内核将阻塞的进程从 "waiting" 状态移动到 "ready" 状态,以便它可以在 [=24] 中轮到它("running") =].

所以你阻塞的执行线程只会阻塞:执行线程。 CPU 和 CPU 核心继续让其他执行线程切换进出它们,并且没有空闲。

如果我们假设它不是异步的,那么我会说,在那种情况下,您拥有该线程的线程肯定会被放入等待队列,并且状态将为 "waiting".

上下文切换明智,IMO,可能需要更多解释,因为术语上下文切换可以 mean/involve 很多事情(交换 in/out,页面 table 更新,注册更新等)。根据当前的执行状态,属于同一进程的第二个线程可能会被调度到 运行,而在 IO 操作上被阻塞的线程仍在等待。

例如,上下文切换很可能仅限于更改 CPU 上关于核心的寄存器值(但如果没有剩余内存,拥有进程甚至可能被换出)。

没有,在java中,阻塞线程没有参与调度