在windows中,CPU在阻塞时做什么

在windows中,CPU在阻塞时做什么,windows,blocking,Windows,Blocking,每当CPU等待某个系统响应时(例如,等待internet请求),就会有阻塞调用。CPU在这些调用过程中是否真的在浪费时间(我不知道是否存在与CPU浪费时间相对应的除no op之外的机器指令)。如果没有,它在做什么?当一个线程被阻塞时,特别是当它在一个有效的等待对象上被阻塞,使被阻塞的线程进入睡眠状态时,CPU正忙于为系统中的其他线程提供服务。如果没有应用程序线程在运行,则始终有系统线程在运行。CPU永远不会真正空闲。当线程被阻塞时,特别是当它在一个有效的等待对象上被阻塞,该对象使被阻塞的线程进入

每当CPU等待某个系统响应时(例如,等待internet请求),就会有阻塞调用。CPU在这些调用过程中是否真的在浪费时间(我不知道是否存在与CPU浪费时间相对应的除no op之外的机器指令)。如果没有,它在做什么?

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

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

基本上,内核维护运行队列或类似于调度线程的东西。每个线程都会收到一个时间片,在该时间片上执行,直到过期或自动生成其时间片为止。当一个线程产生或其切片过期时,调度程序决定下一个执行哪个线程

阻塞系统调用将导致屈服。这还将导致线程从运行队列中删除,并被放置在睡眠/挂起队列中,在该队列中,线程没有资格接收时间片。它将保持在睡眠/挂起队列中,直到满足某个临界点(例如计时器滴答声、套接字上的可用数据等)。一旦满足条件,它将被放回运行队列

Sleep(1); // Yield, install a timer, and place the thread in a sleep queue.
只要在任何运行队列中都有任务(可能不止一个,通常每个处理器核心一个),调度程序就会继续分发时间片。根据调度器设计和硬件约束,这些时间片的长度可能会有所不同

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


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

基本上,内核维护运行队列或类似于调度线程的东西。每个线程都会收到一个时间片,在该时间片上执行,直到过期或自动生成其时间片为止。当一个线程产生或其切片过期时,调度程序决定下一个执行哪个线程

阻塞系统调用将导致屈服。这还将导致线程从运行队列中删除,并被放置在睡眠/挂起队列中,在该队列中,线程没有资格接收时间片。它将保持在睡眠/挂起队列中,直到满足某个临界点(例如计时器滴答声、套接字上的可用数据等)。一旦满足条件,它将被放回运行队列

Sleep(1); // Yield, install a timer, and place the thread in a sleep queue.
只要在任何运行队列中都有任务(可能不止一个,通常每个处理器核心一个),调度程序就会继续分发时间片。根据调度器设计和硬件约束,这些时间片的长度可能会有所不同

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


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

当操作系统调度程序查找要移交给内核的工作时,该线程被跳过。结果是什么都不需要做。处理器核心然后执行HLT指令


在停止状态下,它几乎不消耗电力。需要中断才能使其恢复活动状态。最典型的是时钟中断,默认情况下,它每秒滴答64次。这可能是一个设备中断。然后调度程序再次寻找要做的工作。冲洗并重复。

当操作系统调度程序查找要移交给内核的工作时,线程将被跳过。结果是什么都不需要做。处理器核心然后执行HLT指令


在停止状态下,它几乎不消耗电力。需要中断才能使其恢复活动状态。最典型的是时钟中断,默认情况下,它每秒滴答64次。这可能是一个设备中断。然后调度程序再次寻找要做的工作。冲洗并重复。

请看,我问这个问题的部分原因是我想让一些代码尽可能高效。这是否意味着如果您的应用程序有多个线程,至少其中一些线程没有被阻止,那么使用非阻止调用就没有好处了(因为阻止调用只会导致上下文切换到其他非阻止线程之一)?@JohnRobertson这在很大程度上取决于程序的性质。例如,如果您在套接字A上阻塞,直到其可读为止,那么您就不能从同一个线程,即,为套接字B提供服务。E线程只是在睡眠队列中花费时间,在未知的时间内不会再次被调度。通过为每个线程提供一个套接字服务,您将增加上下文切换和内存占用的开销。@John“尽可能高效”本身并不意味着什么。效率就什么?表演耗电量?可用性?内存消耗?你必须做出决定。我问这个问题的部分原因是我想让一些代码尽可能的高效。这是否意味着如果您的应用程序有多个线程,至少其中一些线程没有被阻止,那么使用非阻止调用就没有好处了(因为阻止调用只会导致上下文切换到其他非阻止线程之一)?@JohnRobertson这在很大程度上取决于程序的性质。例如,如果您在套接字A上阻塞,直到其可读为止,那么您不能