13

ポーリングに関するウィキペディアの記事から

コンピューター サイエンスにおけるポーリング (ポーリング操作) は、同期アクティビティとして、クライアント プログラムによって外部デバイスの状態をアクティブにサンプリングすることを指します。ポーリングは、ほとんどの場合、入出力 (I/O) に関して使用され、ポーリング I/O またはソフトウェア駆動 I/O とも呼ばれます。

ポーリングは、ビジー待機ポーリング (ビジー待機) と同義で使用されることがあります。この状況では、I/O 操作が必要な場合、コンピューターは I/O デバイスの状態を確認する以外に何もしません。準備ができた時点でデバイスにアクセスします。つまり、コンピュータはデバイスの準備が整うまで待機します。
ポーリングとは、デバイスの準備が整っているかどうかを繰り返しチェックし、準備が整っていない場合、コンピューターが別のタスクに戻る状況も指します。ビジーウェイトほど CPU サイクルを浪費するわけではありませんが、これは通常、ポーリングや割り込み駆動型 I/O に代わる方法ほど効率的ではありません。

では、スレッドが「条件変数」を使用しない場合、それはデータ変更の「ポーリング」または「ビジー待機」と呼ばれますか?

4

2 に答える 2

31

2 つの違いは、アプリケーションがポーリング間で行うことです。

プログラムが毎秒デバイスをポーリングし、その間にデータが利用できない場合は他のことを行う場合 (おそらく単にスリープし、他の人が CPU を利用できるようにしておくことを含む)、それはポーリングです。
プログラムがチェックの間に何もせずにデバイス (またはリソースなど) を継続的にポーリングする場合、それはビジー待機と呼ばれます。

これは、同期とは直接関係ありません。条件変数 (デバイスまたはリソースが使用可能になったときに通知する必要があります) でブロックするプログラムは、ポーリングでもビジー待機でもありません。これは、イベント駆動型/割り込み駆動型の I/O に似ています。
(ただし、たとえば、a をループするスレッドtry_lockはポーリングの形式であり、ループが狭い場合はビジー待機の可能性があります。)

于 2012-05-15T05:19:00.393 に答える
9

ボタンが押されたことに気付いたときに何らかのアクションを実行するマイクロプロセッサまたはマイクロコントローラがあるとします。

最初のアプローチは、ボタンがまだ変更されているかどうかを確認し、変更されたら必要なアクションを実行する以外は何もしないループにプログラムを入れることです。

場合によっては、ボタンが配線された入力に配線されていると仮定して、ボタンが押されたときに割り込みをトリガーするようにハードウェアをプログラムすることで、割り込みを引き起こすことができます。

3 番目の方法は、一定のレート (たとえば 1000x/秒) でプロセッサに割り込みを行うようにタイマーを構成し、その割り込みのハンドラーにボタンの状態をチェックさせ、それに基づいて動作させることです。

最初のアプローチはビジー待機を使用します。他のすべてを完全に調整することを犠牲にして、1つの特定の刺激に対して非常に優れた応答時間を提供できます. 2 番目のアプローチは、イベント トリガー割り込みを使用します。多くの場合、ビジー待機よりも応答時間がわずかに遅くなりますが、CPU は I/O を待っている間に他のことを行うことができます。また、ボタンが押されるまで、CPU が低電力スリープ モードに移行することもできます。3 番目のアプローチは、他の 2 つよりはるかに劣る応答時間を提供しますが、ハードウェアがボタンの押下による割り込みのトリガーを許可しない場合でも使用できます。

迅速な応答が必要な場合は、多くの場合、イベント トリガー割り込みまたはビジー待機のいずれかを使用する必要があります。ただし、多くの場合、ポーリング アプローチが最も実用的です。関心のあるすべてのイベントをサポートするハードウェアが存在しないか、関心のあるイベントの数が利用可能な割り込みの数を大幅に超えている可能性があります。さらに、特定の条件では遅延応答を生成することが望ましい場合があります。たとえば、次の基準に従って、スイッチがアクティブになった回数をカウントしたいとします。

  1. すべての正当なスイッチ イベントは、スイッチが任意に閉じて再度開くことができる 0 ~ 900us (マイクロ秒) の間隔、その後にスイッチが閉じたままになる少なくとも 1.1ms の間隔、およびその後に続く 0 ~ 900us (マイクロ秒) の間隔で構成されます。スイッチが任意に開閉できる 900us の間に、スイッチが開く少なくとも 1.1ms の間隔が続きます。
  2. ソフトウェアは、無視されないスイッチの開閉の後、950us の間スイッチの状態を無視する必要があります。
  3. ソフトウェアは、上記の必要なブランキング期間外に発生するスイッチ イベントを任意にカウントまたは無視できますが、持続時間は 1.1ms 未満です。
  4. ソフトウェアが報告するカウントは、スイッチが安定して「閉じて」から 1.99ms 以内に有効でなければなりません。

この要件を適用する最も簡単な方法は、スイッチの状態を毎秒 1,000 回観察することです。前の状態が「開いている」のに「閉じている」と表示された場合は、カウンターをインクリメントします。とてもシンプルで簡単です。スイッチがあらゆる種類の奇妙な方法で開閉したとしても、実際のイベントの前後の 900us の間、ソフトウェアは気にしません。

スイッチ入力によってトリガーされる割り込みをタイマーと共に使用して、必要なブランキング要件を満たしながら、スイッチ入力に対する応答を高速化することができます。最初は、次にスイッチが閉じたときにトリガーするように入力が準備されます。割り込みがトリガーされると、ソフトウェアはそれを無効にしますが、950us 後に割り込みをトリガーするようにタイマーを設定します。そのタイマーが期限切れになると、次にスイッチが「開いた」ときに割り込みを起動する割り込みがトリガーされます。その割り込みは、スイッチ割り込みを無効にし、再びタイマーを 950us に設定するため、タイマー割り込みはスイッチ割り込みを再び有効にします。このアプローチが役立つ場合もありますが、ソフトウェアは単純なポーリング アプローチよりもはるかに複雑です。タイマーベースのアプローチで十分な場合、

直接割り込みではなくマルチタスク OS を使用するシステムでは、同じ原則の多くが適用されます。定期的な I/O ポーリングは、特定のイベントが発生するまで OS が実行しないコードを使用する場合と比較して、いくらかの CPU 時間を浪費しますが、多くの場合、イベントの応答時間と、イベントが発生しないときに浪費される時間の両方は、使用時に許容されます。定期的なポーリング。実際、一部のバッファー I/O 状況では、定期的なポーリングが非常に効率的であることが判明する場合があります。たとえば、シリアル ポート経由でリモート マシンから大量のデータを受信して​​いるとします。1 秒あたり最大 11,520 バイトが到着し、デバイスは最後の確認応答パケットの前に最大 2K のデータを送信し、シリアル ポートは4K 入力バッファ。「データ受信」イベントを使用してデータを処理できますが、単純にポートを 100x/秒チェックして、その時点までに受信したすべてのパケットを処理するのも同様に効率的です。このようなポーリングは、リモート デバイスがデータを送信していないときに時間の無駄になりますが、着信データが予期される場合は、着信データのすべての小さな断片をすぐに処理するよりも、約 1.15K のチャンクで処理する方が効率的です。入ってくる。

于 2012-05-15T05:20:53.497 に答える