jedihy
2019-09-13 03:49:12 +08:00
其实这个问题本质上是在问 kernel 如何通知 usermode app 事件的完成。
以 Windows 为例:
那这个实际上是有轮询的,但不是简单的轮询,是一个很复杂的,由 kernel thread scheduler 参与的等待过程。
kernel 通知 usermode app 的情况,app 一定 pending 在 KeWaitForSingleObject,等待 kernel return。
( callstack: WaitForSingleObject->NtWaitForSingleObject->KeWaitForSingleObject )
简单的说,在这个等待过程开始时,kernel 会设置 thread 的 scheduling state 为 waiting,然后将此 thread 放入一个 waiting list,当你 singal 一个 event 的时候,kernel 会在这个 list 中找出这个 thread,然后把它移出,然后 KeWaitForSingleObject 返回。这个时候你就知道你等待的事件被 signal 了。
Linux 不太清楚,但现代 OS 设计大致都应该如此。Busy loop 会直接跑满一个 logical processor,所以不会有 OS 这样设计的。