割り込みハンドラーの実行 (キャッシュの無効化、実行する割り込みスタックのセットアップ) のオーバーヘッドが、実際の読み取りまたは書き込みよりも遅くなるケースを想像することができます。その場合、ポーリングの方が高速になると思います。
ただし、SSD はディスクに比べて高速ですが、メモリよりもはるかに低速です。SSD は依然として各 I/O を完了するのに数十マイクロ秒からミリ秒かかりますが、割り込みのセットアップとティアダウンを行うにはすべてのメモリ内操作が使用され、おそらく最大で 100 から 1000 サイクル (~100ns から 1us) かかります。
ポーリングの代わりに割り込みを使用する主な利点は、割り込みを使用することによる「無効化」効果がはるかに低いことです。これは、I/O スレッドをスケジュールして、使用可能なデータがない間により多くのデータを継続的にポーリングする必要がないためです。I/O がすぐに処理されるという追加の利点があるため、ユーザーがキーを入力した場合、I/O スレッドがスケジュールされている間、文字が画面に表示される前に一時停止することはありません。これらの問題を組み合わせると混乱します。I/O スレッドに任意のストールを挿入すると、応答時間がさらに遅くなるという犠牲を払って、ポーリングのリソース集約度が低下します。これらが、カーネル I/O 設計で誰もポーリングを使用しない主な理由かもしれません。
read()
ユーザー プロセスの観点から (Unix シグナルなどのソフトウェア割り込みシステムを使用する)、どちらの方法も理にかなっています。ポーリングは通常select()
、ブール値のメモリ マップ変数をチェックしたり、カーネルバージョンのポーリングで十分かもしれません。OS でこの作業を行うためのシステム コールを使用すると、他のシステム コールではなくシグナルを使用することでユーザーランド スレッドのキャッシュが多かれ少なかれ無効化されないため、パフォーマンスが向上する可能性があります。ただし、これはかなり OS に依存するため、どのコードパスがより高速であるかを判断するには、プロファイリングが最善の策です。