在计算的同步/阻塞模型中,我们通常会说等待IO任务完成时,执行线程将等待(阻塞)。
我的问题是,这通常会导致CPU核心执行线程空闲,还是等待IO的线程通常会被上下文切换出来并进入等待状态,直到IO准备好被处理?
答案 0 :(得分:20)
CPU内核通常不专用于一个特定的执行线程。内核不断地切换进出CPU的进程。 CPU当前正在执行的进程位于"运行"州。等待轮到他们的进程列表已经准备好了#34;州。内核可以非常快速地切换这些内容。现代CPU功能(多核,同时多线程等)尝试增加一次可以物理执行的执行线程数。
如果进程被I / O阻塞,内核将把它放在一边(把它放在"等待"状态),甚至不考虑在CPU中给它时间。当I / O完成后,内核会将阻塞的进程从"等待"陈述"准备好"状态因此它可以在CPU中转动("运行")。
因此,被阻止的执行线程仅阻止:执行线程。 CPU和CPU内核继续将其他执行线程切换进出,并且不会空闲。
答案 1 :(得分:0)
对于大多数以标准方式使用的编程语言,答案是它会阻塞你的线程,而不是你的CPU。
您需要为1个线程明确保留特定线程(亲缘关系)的CPU以阻止整个CPU。为了更明确,请参阅此question:
您可以在每个进程上调用SetProcessAffinityMask,但是您的掩码只会排除“属于”您的进程的核心,并在您的进程上使用它将其设置为仅在此核心上运行(或者甚至更好) ,SetThreadAffinityMask就在执行时间关键任务的线程上。
答案 2 :(得分:0)
如果我们假设它不是异步,那么我会说,在这种情况下,拥有该线程的线程将被置于等待队列中,并且状态将是"等待"
上下文切换明智,IMO,它可能需要更多解释,因为术语上下文切换可能意味着/涉及许多事情(交换/输出,页表更新,寄存器更新等)。根据当前的执行状态,可能会计划运行属于同一进程的第二个线程,同时在IO操作上阻塞的线程仍在等待。
例如,然后上下文切换很可能仅限于更改CPU上关于内核的寄存器值(但如果没有太多内存,则可能甚至会转换拥有进程)。
答案 3 :(得分:-1)
不,在Java中,块线程未参与调度