Node のさまざまな I/O モデルについて話しましょう

青灯夜游
リリース: 2022-02-07 17:56:24
転載
2534 人が閲覧しました

この記事では、Node のさまざまな I/O モデルについて説明し、ブロッキング I/O モデル、ノンブロッキング I/O モデル、ノンブロッキング非同期 I/O を紹介します。役立つように!

Node のさまざまな I/O モデルについて話しましょう

# ネットワーク リクエスト IO を例に挙げて、最初に、完全なネットワーク IO リクエストを処理するサーバーの一般的なプロセスを紹介します。

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

Node のさまざまな I/O モデルについて話しましょう

#データの準備ができるまで待機

    カーネルからプロセスへのデータのコピー
  • 以下では、
  • recvfrom
  • 関数を例としてさまざまな IO モデルを説明します

ブロッキング I/O

モデル (I/O のブロック)

呼び出しのブロック は、呼び出し結果が返される前に現在のスレッドが一時停止され、呼び出しスレッドは、システム カーネル レベルでのすべての操作を待つことしかできません。

呼び出しは、完了するまで終了しません。

I/O をブロックすると、CPU が I/O を待機することになり、CPU タイム スライスが無駄になります。

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

従来の Node のさまざまな I/O モデルについて話しましょうノンブロッキング I/O との比較

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

ノン

ブロッキング呼び出し

Get が返された場合 (実際に期待されるデータではありません)、CPU タイム スライスを他の処理に使用できるため、パフォーマンスが大幅に向上します。 Node のさまざまな I/O モデルについて話しましょう

しかし、それに伴う問題は、前の操作が完全な I/O ではなく、返された結果が予期したビジネス データではなく、非同期呼び出しステータスのみであったことです。

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

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

#ビジー ポーリング

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

利点: 簡単なプログラミング

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

Node のさまざまな I/O モデルについて話しましょう

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

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

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

Node のさまざまな I/O モデルについて話しましょう3 つの I/O 多重化メカニズムの違いは次のとおりです。

select

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

poll

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

  • ##epoll/ kqueue

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

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

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

信号駆動型 I/O モデルNode のさまざまな I/O モデルについて話しましょう

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

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

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

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

理想的な (ノード) ノンブロッキング非同期 I/O

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

実際の非同期 I/ONode のさまざまな I/O モデルについて話しましょう

実際、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 チュートリアル
を参照してください。

以上がNode のさまざまな I/O モデルについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!