什么是"忙等待"与"睡眠"的权衡?

Viv*_*rma 22 c linux operating-system

这是对我之前的问题的延伸

unix/linux套接字中的阻塞模式如何工作?

我现在从互联网收集的内容,所有调用阻塞调用的进程都会进入休眠状态,直到调度程序找到解除阻塞的原因.原因可以从缓冲区空到缓冲区满到任何其他条件.

但是,这可以成为实时的有效方式,让我们说硬/实时应用程序?由于当解除阻塞条件成立时,进程未被解锁,而是当调度程序给出他的CPU切片时,并且解除阻塞条件都为真.

好像你想要一个响应式解决方案,我不这样做"旋转锁"或"忙等待"是正确的方法,CPU切片被浪费,整个系统将无法响应或可能响应不佳.

有人可以清楚这个相互矛盾的想法.

Chr*_*isW 40

在调度程序唤醒你之前一直睡觉是正常/首选的事情.

旋转(等待的替代方式,不睡觉)不太常见,并具有以下效果:

  • 保持CPU忙,并防止其他线程使用CPU(直到/除非旋转线程完成其时间片并被预先设定)

  • 你正在等待的事情发生的那一刻就可以停止旋转(因为你不断检查那个事件,你不需要花时间醒来,因为你已经醒了)

  • 不调用进入睡眠状态并再次唤醒所需的CPU结构

如果延迟的长度非常短(例如,如果延迟仅执行100个CPU指令所花费的时间),则旋转可以比进入睡眠更有效(更少的总CPU ).

  • +****延迟的长度非常短** (16认同)

J-1*_*DiZ 0

首先,你有一个错误的认识:

阻塞调用不是“忙等待”或“自旋锁”。阻塞调用是可睡眠的——这意味着 CPU 可以处理其他任务,不会浪费 CPU。

关于你关于拦截来电的问题

阻塞调用更容易——它们更容易理解、更容易开发、更容易调试。

但他们是资源消耗者。如果不使用线程,就会阻塞其他客户端;如果使用线程,每个线程都会占用内存和其他系统资源。即使你有足够的内存,切换线程也会使缓存变冷并降低性能。

这是一个权衡——更快的开发和可维护性?或可扩展性。