忙等待和轮询有什么区别?

时间:2012-05-15 05:07:39

标签: multithreading polling condition-variable busy-waiting

来自Polling

上的维基百科文章
  

计算机科学中的轮询或轮询操作是指客户端程序将外部设备的状态作为同步活动进行主动采样。轮询通常用于输入/输出(I / O),也称为轮询I / O或软件驱动的I / O.

     

轮询有时与忙等待轮询(忙等待)同义使用。在这种情况下,当需要I / O操作时,计算机除了检查I / O设备的状态之外什么都不做,直到它准备就绪,此时访问设备。换句话说,计算机会等待设备准备就绪   轮询还指的是重复检查设备是否准备就绪的情况,如果不是,则计算机返回到不同的任务。尽管不像繁忙等待那样浪费CPU周期,但这通常不如轮询,中断驱动I / O的替代方案那么高效。

那么,当一个线程不使用“条件变量”时,它会被称为“轮询”数据更改还是“忙等待”?

2 个答案:

答案 0 :(得分:29)

两者之间的区别在于应用程序在民意调查之间的作用。

如果一个程序轮询一个设备说每一秒,并且在没有数据可用的情况下同时做其他事情(包括可能只是睡觉,让CPU可用于其他人),那就是轮询。
如果程序连续轮询设备(或资源或其他),而不在两次检查之间做任何事情,则称为忙等待。

这与同步没有直接关系。阻止条件变量的程序(应该在设备或资源可用时发出信号)既不是轮询也不是忙等待。这更像是事件驱动/中断驱动的I / O. (但是例如在try_lock周围循环的线程是一种轮询形式,如果循环紧张,可能还在忙等待。)

答案 1 :(得分:8)

假设有一个微处理器或微控制器,当它注意到按下按钮时应该执行某些操作。

第一种方法是让程序进入一个循环,除了查看按钮是否已经改变之外什么都不做,一旦它有,就执行所需的动作。

在某些情况下,第二种方法是对硬件进行编程,以便在按下按钮时触发中断,假设按钮连接到有线的输入,从而导致中断。

第三种方法是配置一个定时器以某种速率(例如,1000x /秒)中断处理器,并让该中断的处理程序检查按钮的状态并对其进行操作。

第一种方法使用忙等待。它可以为一个特定的刺激提供非常好的响应时间,但代价是完全调整其他所有内容。第二种方法使用事件触发中断。它通常会提供比忙等待稍慢的响应时间,但允许CPU在等待I / O时执行其他操作。它还可以允许CPU进入低功耗睡眠模式,直到按下按钮。第三种方法将提供远远低于其他两种方法的响应时间,但即使硬件不允许按钮按下触发中断,它也将可用。

在需要快速响应的情况下,通常需要使用事件触发中断或忙等待。然而,在许多情况下,轮询方法可能是最实用的。可能不存在硬件来支持可能感兴趣的所有事件,或者感兴趣的事件的数量可能大大超过可用中断的数量。此外,某些条件可能需要产生延迟响应。例如,假设有人希望计算开关被激活的次数,符合以下标准:

  1. 每个合法的开关事件都包含一个0到900us(微秒)的间隔,在此期间开关可以任意关闭并重新打开,然后是至少1.1ms的间隔,在此期间开关将保持闭合,然后是间隔从0到900us,在此期间开关可以任意打开和重新闭合,然后是至少1.1ms的间隔,在该间隔期间开关将打开。
  2. 在任何非忽略的开关打开或关闭后,软件必须忽略950us的开关状态。
  3. 允许软件任意计数或忽略在上述所需消隐间隔之外发生但持续时间小于1.1ms的切换事件。
  4. 软件报告的计数必须在交换机稳定且关闭时间的1.99ms内有效。"。

实施此要求的最简单方法是观察交换机的状态1,000x /秒;如果它被看到"关闭"当前一个状态是"打开"时,递增计数器。非常简单容易;即使开关以各种奇怪的方式打开和关闭,在真实事件之前和之后的900us期间,软件也不会关心。

可以使用开关输入触发的中断和定时器来产生对开关输入的更快响应,同时满足所需的消隐要求。最初,输入将被设置为在下次开关关闭时触发。一旦中断被触发,软件将禁用它,但设置一个定时器以在950us后触发中断。一旦该计时器到期,它将触发一个中断,当下一次开关打开时,该中断将触发中断#34;打开"。该中断反过来会禁用开关中断并再次将定时器设置为950us,因此定时器中断将再次重新启用开关中断。有时这种方法很有用,但软件比简单的轮询方法复杂得多。当基于计时器的方法足够时,通常更可取。

在使用多任务操作系统而非直接中断的系统中,许多相同的原则适用。与具有操作系统在某些事件发生之前不会运行的代码相比,定期I / O轮询将浪费一些CPU时间,但在许多情况下,事件响应时间和没有事件发生时浪费的时间量都是可接受的使用定期轮询时。实际上,在一些缓冲的I / O情况下,定期轮询可能会变得非常有效。例如,假设一个人通过串口从远程机器接收大量数据,每秒最多11,520个字节到达,设备将在最后一个确认的数据包之前发送高达2K的数据,并且串口有一个4K输入缓冲区。虽然可以使用"收到的数据处理数据"事件,简单地检查端口100x /秒并处理直到该点接收的所有数据包可能同样有效。当远程设备没有发送数据时,这样的轮询会浪费时间,但是如果预期输入数据,则以大约1.15K的块处理它比处理每一小块输入数据更有效。就在它进来的时候。

相关问题