在Windows中,CPU在阻塞时会做什么

时间:2013-10-31 20:03:51

标签: windows blocking

每当CPU等待某个系统响应时,一个人就会阻塞呼叫,例如等待互联网请求。在这些调用期间CPU是否真的浪费时间(我不知道除了无操作之外是否存在与CPU实际上浪费时间相对应的机器指令)。如果没有,它在做什么?

3 个答案:

答案 0 :(得分:3)

当操作系统调度程序寻找切换到核心的工作时,简单地跳过该线程。由于非常普遍的结果,不需要做任何事情。然后,处理器内核执行HLT指令。

在HALT状态下,它几乎不消耗电力。需要中断才能恢复活动状态。最常见的是时钟中断,默认情况下每秒会发送64次。它可能是设备中断。然后,调度程序再次查找要执行的工作。冲洗并重复。

答案 1 :(得分:2)

基本上,内核维护运行队列或类似于调度线程的东西。每个线程都会收到一个时间片,它会在其中执行,直到它过期或者它自动产生其片段。当一个线程产生或其片段到期时, scheduler 决定下一个要执行的线程。

阻塞系统调用会导致产量。它还会导致线程从运行队列中删除并置于睡眠/暂停队列中,在该队列中它不符合接收时间片的条件。它将保持在睡眠/暂停队列中,直到满足一些标准(例如计时器滴答,插座上可用的数据等)。一旦满足条件,它就会被放回到运行队列中。

Sleep(1); // Yield, install a timer, and place the thread in a sleep queue.

只要任何运行队列中有任务(每个处理器核心可能有多个,通常一个),调度程序将继续分发时间片。根据调度程序设计和硬件约束,这些时间片的长度可能不同。

当运行队列中没有任务时,核心可以进入省电状态,直到收到中断为止。

从本质上讲,处理器从不浪费时间。它执行其他线程,服务中断或处于省电状态(即使持续时间很短)。

答案 2 :(得分:1)

当一个线程被阻塞时,特别是如果一个线程被阻塞在一个有效的等待对象上,该对象将阻塞的线程置于休眠状态,那么CPU正忙于为系统中的其他线程提供服务。如果没有运行应用程序线程,则始终运行系统线程。 CPU永远不会真正闲置。