ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs のノンブロッキング非同期 IO を理解します。

Nodejs のノンブロッキング非同期 IO を理解します。

青灯夜游
青灯夜游転載
2022-12-07 18:12:222426ブラウズ

この記事では、Node のさまざまな I/O モデルについて説明し、Node の魂であるノンブロッキング非同期 IO について紹介します。

Nodejs のノンブロッキング非同期 IO を理解します。

[関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル プログラミング教育 ]

私たちは、ネットワーク たとえば、最初に、完全なネットワーク IO リクエストを処理するサーバーの一般的なプロセスを紹介します。

Nodejs のノンブロッキング非同期 IO を理解します。

アプリケーションは操作結果を取得します。これには、通常、2 つの異なる段階が含まれます。

  • データの準備ができるまで待機しています

  • カーネルからプロセスにデータをコピーします

以下では、 ## を使用します。 #recvfrom 関数 たとえば、さまざまな IO モデルについて説明します。

Blocking I/O モデル (ブロッキング I/O)

# #ブロッキング呼び出し

は、呼び出し結果が返される前に現在のスレッドが一時停止され、呼び出しスレッドはシステム カーネル レベルの すべての操作が完了するのを待った後にのみ終了することを意味します。 I/O をブロックすると、CPU が I/O を待機することになり、CPU タイム スライスが無駄になります。

Nodejs のノンブロッキング非同期 IO を理解します。ノンブロッキング I/O モデル (ノンブロッキング I/O)

従来の

ノンブロッキング I/O との比較

データなしで直接戻ります。データを取得するには、ファイル記述子を通じてデータを再度読み取る必要があります。

Nodejs のノンブロッキング非同期 IO を理解します。ノン

ブロッキング呼び出し

Get が返された場合 (実際に期待されるデータではありません)、CPU タイム スライスを他の処理に使用できるため、パフォーマンスが大幅に向上します。 しかし、それに伴う問題は、前の操作が完全な I/O ではなく、返された結果が予期したビジネス データではなく、非同期呼び出しステータスのみであったことです。

完全なデータを取得するには、アプリケーションは IO 操作を繰り返し呼び出して、操作が完了したかどうかを確認する必要があります。この操作は

ポーリング

と呼ばれます。いくつかの一般的なポーリング戦略は次のとおりです。 #ビジー ポーリング

これは最も原始的でパフォーマンスが最も低い方法です。呼び出しを繰り返して I/O ステータスをチェックし、完全なデータを取得します

利点: 簡単なプログラミングNodejs のノンブロッキング非同期 IO を理解します。

欠点: ポーリングでは常に CPU が消費されます。サーバーはポーリング後も応答する必要があるため、サーバーのパフォーマンスにも影響します。

I/O 多重化モデル (I/O 多重化)

I/O 多重化モデルでは、Select または Poll 機能が使用されますまたは Epoll 関数 (Linux 2.6 以降のカーネルでサポートされている)、これら 2 つの関数もプロセスをブロックしますが、I/O をブロックすることとは異なります。 Nodejs のノンブロッキング非同期 IO を理解します。

これら 3 つの関数は、複数の I/O 操作を同時にブロックでき、読み取りまたは読み取り可能なデータが存在するまで、複数の読み取り操作と複数の書き込み操作の I/O 機能を同時に検出できます。と書かれていますが、実際にはI/O操作関数が呼び出されます。

3 つの I/O 多重化メカニズムの違いは次のとおりです。

    select
  • 選択により、ファイル ステータスの保存に 1024 個の長さの配列が使用されるため、最大 1024 個のファイル記述子を同時に検出できます

    poll
  • select と比較してわずかに改善されました。リンクされたリストを使用すると、1024 という長さの制限が回避され、不必要な走査チェックが回避されます。select と比較して、パフォーマンスがわずかに改善されました。

##epoll/ kqueue
  • は、Linux で最も効率的な I/O イベント通知メカニズムです。ポーリング中に I/O イベントが検出されない場合、

    スリープします
  • 、イベントが発生してスレッドが起動されるまで。イベント通知を真に利用し、(ファイル記述子) クエリを走査する代わりにコールバックを実行するため、CPU

を無駄にしません。

概要: 本質的に、アプリケーションは I/O が完全に戻るのを待っているため、本質的には ポーリングは依然として同期操作です。待機期間中、アプリケーションはファイル記述状態をトラバースするか、スリープします。イベントが発生するのを待ちます。

信号駆動型 I/O モデル

Nodejs のノンブロッキング非同期 IO を理解します。

信号駆動型 I/O モデルでは、アプリケーションは信号を使用して次のことを行います。 I/O を駆動し、信号処理機能をインストールすると、プロセスはブロックされることなく実行され続けます。

データの準備ができると、プログラムは SIGIO 信号を受信し、信号処理関数の I/O 操作関数を呼び出してデータを処理できます。

要約: これまでのところ、信号駆動型 I/O モデルは非同期のニーズにより一致しており、プログラムはデータを待機している間に他のビジネス ロジックを非同期で実行します。 #########しかし! ! !

カーネルからユーザー空間にデータをコピーするプロセス中にもブロックされますが、これは完全な革命 (非同期) ではありません。

理想的な (ノード) ノンブロッキング非同期 I/O理想的な非同期 I/O は、ポーリングを通じてデータを取得する必要がなく、アプリケーションによって開始されるノンブロッキング呼び出しである必要があります。データ コピー フェーズ中に不必要に待つ必要はありませんが、I/O の完了後、シグナルまたはコールバック関数を通じてアプリケーションにデータを渡すことができ、その間にアプリケーションは他のビジネス ロジックを実行できます。

実際の非同期 I/O

Nodejs のノンブロッキング非同期 IO を理解します。実際、Linux プラットフォームは非同期 I/O (AIO) をネイティブにサポートしていますが、現時点では AIO は完全ではありません。そのため、Linux で同時実行性の高いネットワーク プログラミングを実装する場合は、主に I/O 多重化モデルが使用されます。

Windows では、真の非同期 I/O は IOCP を通じて実装されます。

非同期 I/O のマルチスレッド シミュレーション

Linux プラットフォームでは、Node はスレッド プールを使用して、一部のスレッドがブロック I/O または非同期 I/O を実行できるようにします。 I/O ラウンドのブロック データ取得はクエリによって完了し、別のスレッドで計算を実行し、スレッド間の通信を通じて I/O 結果を渡すことで、非同期 I/O のシミュレーションを実現します。 実際には、Windows プラットフォームの IOCP 非同期ソリューションの最下層もスレッド プールを使用して実装されていますが、違いは、後者のスレッド プールがシステム カーネルによってホストされることです。

Node

はシングルスレッドであるとよく言われますが、実際には、
JS はシングルスレッド

で実行されるとしか言えません。 *nix または Windows platform の場合、最下層はスレッド プールを使用して I/O 操作を完了します。 ノード関連の知識の詳細については、nodejs チュートリアル

を参照してください。

以上がNodejs のノンブロッキング非同期 IO を理解します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。