私は非同期I / O 演算がプロセッサ時間を介して使用しないこと、つまりビジーループselect()
でpoll()
はないことを理解していますが、実際にはこれらは内部でどのように実装されていますか?どういうわけかハードウェアでサポートされているのですか、それがこれらを使用するための明らかなプロセッサコストがそれほどないのはなぜですか?
select
/ poll
が何を待っているかによります。いくつかのケースを考えてみましょう。簡略化のために、シングルコアマシンを想定します。
まず、select
が別のプロセスで待機している場合を考えます(たとえば、他のプロセスが何らかの計算を実行していて、パイプラインを介して結果を出力している場合があります)。この場合、カーネルはプロセスを入力待ちとしてマークするため、プロセスにCPU時間を提供しません。他のプロセスがデータを出力すると、カーネルはプロセスを起動し(CPUに時間を与える)、入力を処理できるようにします。最近のOSはプリエンプティブマルチタスクを使用しているため、これは他のプロセスがまだ実行されている場合でも発生します。つまり、カーネルは定期的にプロセスに割り込み、他のプロセスにCPUを使用する機会を与えます(「タイムスライシング」)。
select
がI / Oを待機しているときに画像が変わります。たとえば、ネットワークデータ、またはキーボード入力。この場合、古いハードウェアは入力を待機してCPUをスピンする必要がありますが、最新のハードウェアはすべて、ハードウェアが割り込み(カーネルが処理する特別に処理されるイベント)を提供するまで、CPU自体を低電力の「待機」状態にすることができます。割り込みハンドラでは、CPUは着信データを記録し、割り込みから戻った後、プロセスを起動してデータを処理できるようにします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加