この記事では、Node のさまざまな I/O モデルについて説明し、Node の魂であるノンブロッキング非同期 IO について紹介します。
[関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル 、プログラミング教育 ]
私たちは、ネットワーク たとえば、最初に、完全なネットワーク IO リクエストを処理するサーバーの一般的なプロセスを紹介します。
アプリケーションは操作結果を取得します。これには、通常、2 つの異なる段階が含まれます。
データの準備ができるまで待機しています
以下では、 ## を使用します。 #recvfrom 関数 たとえば、さまざまな IO モデルについて説明します。
は、呼び出し結果が返される前に現在のスレッドが一時停止され、呼び出しスレッドはシステム カーネル レベルの すべての操作が完了するのを待った後にのみ終了することを意味します。 I/O をブロックすると、CPU が I/O を待機することになり、CPU タイム スライスが無駄になります。
ノンブロッキング I/O モデル (ノンブロッキング I/O)
データなしで直接戻ります。データを取得するには、ファイル記述子を通じてデータを再度読み取る必要があります。
ノン
ブロッキング呼び出しGet が返された場合 (実際に期待されるデータではありません)、CPU タイム スライスを他の処理に使用できるため、パフォーマンスが大幅に向上します。 しかし、それに伴う問題は、前の操作が完全な I/O ではなく、返された結果が予期したビジネス データではなく、非同期呼び出しステータスのみであったことです。
完全なデータを取得するには、アプリケーションは IO 操作を繰り返し呼び出して、操作が完了したかどうかを確認する必要があります。この操作は
ポーリングと呼ばれます。いくつかの一般的なポーリング戦略は次のとおりです。 #ビジー ポーリング
利点: 簡単なプログラミング
欠点: ポーリングでは常に CPU が消費されます。サーバーはポーリング後も応答する必要があるため、サーバーのパフォーマンスにも影響します。I/O 多重化モデル (I/O 多重化)
I/O 多重化モデルでは、Select または Poll 機能が使用されますまたは Epoll 関数 (Linux 2.6 以降のカーネルでサポートされている)、これら 2 つの関数もプロセスをブロックしますが、I/O をブロックすることとは異なります。
これら 3 つの関数は、複数の I/O 操作を同時にブロックでき、読み取りまたは読み取り可能なデータが存在するまで、複数の読み取り操作と複数の書き込み操作の I/O 機能を同時に検出できます。と書かれていますが、実際にはI/O操作関数が呼び出されます。 3 つの I/O 多重化メカニズムの違いは次のとおりです。選択により、ファイル ステータスの保存に 1024 個の長さの配列が使用されるため、最大 1024 個のファイル記述子を同時に検出できます
select と比較してわずかに改善されました。リンクされたリストを使用すると、1024 という長さの制限が回避され、不必要な走査チェックが回避されます。select と比較して、パフォーマンスがわずかに改善されました。
は、Linux で最も効率的な I/O イベント通知メカニズムです。ポーリング中に I/O イベントが検出されない場合、
スリープしますを無駄にしません。
概要: 本質的に、アプリケーションは I/O が完全に戻るのを待っているため、本質的には ポーリングは依然として同期操作です。待機期間中、アプリケーションはファイル記述状態をトラバースするか、スリープします。イベントが発生するのを待ちます。
カーネルからユーザー空間にデータをコピーするプロセス中にもブロックされますが、これは完全な革命 (非同期) ではありません。
理想的な (ノード) ノンブロッキング非同期 I/O理想的な非同期 I/O は、ポーリングを通じてデータを取得する必要がなく、アプリケーションによって開始されるノンブロッキング呼び出しである必要があります。データ コピー フェーズ中に不必要に待つ必要はありませんが、I/O の完了後、シグナルまたはコールバック関数を通じてアプリケーションにデータを渡すことができ、その間にアプリケーションは他のビジネス ロジックを実行できます。
実際の非同期 I/O実際、Linux プラットフォームは非同期 I/O (AIO) をネイティブにサポートしていますが、現時点では AIO は完全ではありません。そのため、Linux で同時実行性の高いネットワーク プログラミングを実装する場合は、主に I/O 多重化モデルが使用されます。
Node
はシングルスレッドであるとよく言われますが、実際には、JS はシングルスレッドで実行されるとしか言えません。 *nix または Windows platform の場合、最下層はスレッド プールを使用して I/O 操作を完了します。 ノード関連の知識の詳細については、nodejs チュートリアル
を参照してください。
以上がNodejs のノンブロッキング非同期 IO を理解します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。