You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
总体上说,若要以忙等方式进行等待,首先要保证忙等是有意义的,不然就只是单纯的在浪费 CPU 资源。怎样才算是有意义的忙等呢?那就是 **在忙等的时候被等待的条件有可能从不满足变为满足** 。比如说,一个线程占据 CPU 资源进行忙等的同时,另一个线程可以在另一个 CPU 上执行,外设也在工作,它们都可以修改内存使得条件得到满足。这种情况才有等待的价值。于是可以知道, **在单核环境下且等待条件不涉及外设的时候,一个线程的忙等是没有意义的** ,因为被等待的条件的状态不可能发生变化。
748
748
749
-
在忙等有意义的前提下,忙等的优势是在条件成立的第一时间就能够进行响应,对于事件的响应延迟更低,实时性更好。它的缺点则是不可避免的会浪费一部分 CPU 资源在忙等上。因此,如果我们能够预测到条件将很快得到满足,在这种情况下使用忙等是一个好主意。如果条件成立的时间无法预测或者所需时间比较长,那还是及时交出 CPU 资源更好。
749
+
在忙等有意义的前提下,忙等的优势是在条件成立的第一时间就能够进行响应,对于事件的响应延迟更低,实时性更好,而且不涉及开销很大的上下文切换。它的缺点则是不可避免的会浪费一部分 CPU 资源在忙等上。因此,如果我们能够预测到条件将很快得到满足,在这种情况下使用忙等是一个好主意。如果条件成立的时间无法预测或者所需时间比较长,那还是及时交出 CPU 资源更好。
在操作系统的协助下,我们可以对于等待进行更加精细的控制。为了避免等待事件的线程在事件到来之前被调度到而产生大量上下文切换开销,我们可以新增一种 **阻塞** (Blocking) 机制。当线程需要等待事件到来的时候,操作系统可以将该线程标记为阻塞状态 (Blocked) 并将其从调度器的就绪队列中移除。由于操作系统每次只会从就绪队列中选择一个线程分配 CPU 资源,被阻塞的线程就不再会获得 CPU 使用权,也就避免了上下文切换。相对的,在线程要等待的事件到来之后,我们需要解除线程的阻塞状态,将线程状态改成就绪状态,并将线程重新加入到就绪队列,使其有资格得到 CPU 资源。这就是与阻塞机制配套的唤醒机制。在线程被唤醒之后,由于它所等待的事件已经出现,在操作系统调度到它之后它就可以继续向下运行了。
0 commit comments