napi と interupt 合体なしから始めましょう。
最初のケース:ライブロック。つまり、サーバー プロセスから多くの割り込みが連続してポストされると、CPU は割り込みのみを処理し、ユーザー レベルのプロセスを実行して実際に要求を処理することは決して許可しません。そのために、ハイブリッド モード (割り込み + ポーリング) で処理する napi を作成します。割り込みが発生すると、それを処理し、しばらくの間ポーリングして、後続のリクエストを解決します。
2 番目のケース:最適化。割り込みを発生させる前に、デバイスはまず CPU に割り込みを配信する前に少し待機します。待機中に他のリクエストがすぐに完了する可能性があるため、複数の割り込みを 1 つの割り込み配信にマージできるため、割り込み処理のオーバーヘッドが削減されます。
結論として、それらの間に競合はありません。また、napi は CPU オーバーヘッドを最適化することもできますが、それらはさまざまなケースに対応しています。
参照:コンピュータ システム設計の原則。
私は、NAPI を割り込み合体の一形態と見なしています。あなたの質問は、NAPI に関する誤解から生じている可能性があると思います。まず、NAPI には割り込みが関係しています。また、NAPI のポーリングは実際には「無駄」ではありません。 NAPI の場合、高スループット トラフィックはバースト的であるという考えを覚えておいてください。 NAPI は、「パケット受信割り込み」が発生した後にのみ「開始」します。
以下は、NAPI の使用方法の概要です:
カーネルは、NAPI を使用するネットワーク デバイス ドライバが検出する「パケット受信」割り込みを開始します。ネットワーク デバイス ドライバは、パケットの受信に関連する割り込みを無効にします。 NAPI を使用して、Linux ネットワーク サブシステムにデバイス ドライバーをポーリングするように指示します。ポーリング関数は、デバイス ドライバーによって実装され、ネットワーク サブシステムに渡され、デバイス ドライバーのパケット ハンドラーを含みます。十分な数のパケットが受信されるか、タイムアウトに達すると、パケット受信割り込みが再度有効になり、すべてが最初からやり直されます。
したがって、NAPI は基本的に、受信ライブロックの状況を減らすために割り込み合体をサポートするための、Linux ネットワーキング サブシステムの集中型 API にすぎません。 NAPI は、デバイス ドライバー開発者に、割り込み合体のためのクリーンなフレームワークを提供します。 NAPI は常に実行されるわけではなく、トラフィックが実際に受信されたときにのみ実行されるため、本質的には割り込み合体スキームになります... 少なくとも私の本では.
注意 注:これはすべて、NAPI を使用するネットワーク デバイス ドライバーのコンテキストで説明しましたが、実際には、NAPI はあらゆる種類の割り込みに使用できます。これも NAPI の利点の 1 つです。
私の理解に誤りがある場合は、お気軽に指摘してください!