目次
従来の
これは最も原始的でパフォーマンスが最も低い方法です。呼び出しを繰り返して I/O ステータスをチェックし、完全なデータを取得します
Windows では、真の非同期 I/O は IOCP を通じて実装されます。
Linux プラットフォームでは、Node はスレッド プールを使用して、一部のスレッドがブロック I/O または非同期 I/O を実行できるようにします。 I/O ラウンドのブロック データ取得はクエリによって完了し、別のスレッドで計算を実行し、スレッド間の通信を通じて I/O 結果を渡すことで、非同期 I/O のシミュレーションを実現します。 実際には、Windows プラットフォームの IOCP 非同期ソリューションの最下層もスレッド プールを使用して実装されていますが、違いは、後者のスレッド プールがシステム カーネルによってホストされることです。
ホームページ ウェブフロントエンド jsチュートリアル Nodejs のノンブロッキング非同期 IO を理解します。

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

Dec 07, 2022 pm 06:12 PM
node i/o模型

この記事では、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

nvmでノードを削除する方法 nvmでノードを削除する方法 Dec 29, 2022 am 10:07 AM

nvm でノードを削除する方法: 1. 「nvm-setup.zip」をダウンロードして C ドライブにインストールします; 2. 「nvm -v」コマンドで環境変数を構成し、バージョン番号を確認します; 3. 「nvm」を使用しますinstall" コマンド ノードのインストール; 4. "nvm uninstall" コマンドでインストールしたノードを削除します。

Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Mar 28, 2023 pm 07:28 PM

ファイルのアップロードをどのように処理するか?次の記事では、Express を使用してノード プロジェクトでファイルのアップロードを処理する方法を紹介します。

NodeサービスのDockerミラーリングを行うにはどうすればよいですか?極限最適化の詳しい説明 NodeサービスのDockerミラーリングを行うにはどうすればよいですか?極限最適化の詳しい説明 Oct 19, 2022 pm 07:38 PM

この期間中、私は Tencent ドキュメントのすべてのカテゴリに共通する HTML 動的サービスを開発していましたが、さまざまなカテゴリへのアクセスの生成と展開を容易にし、クラウド移行のトレンドに従うために、Docker を使用して修正することを検討しました。サービス内容や製品バージョンを一元管理します。この記事では、私が Docker を提供するプロセスで蓄積した最適化の経験を参考として共有します。

Nodeのプロセス管理ツール「pm2」を徹底分析 Nodeのプロセス管理ツール「pm2」を徹底分析 Apr 03, 2023 pm 06:02 PM

この記事では、Node のプロセス管理ツール「pm2」について説明し、pm2 が必要な理由、pm2 のインストール方法と使用方法について説明します。皆様のお役に立てれば幸いです。

PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? Mar 05, 2025 pm 05:57 PM

ピン張りのノードの詳細な説明とインストールガイドこの記事では、ピネットワークのエコシステムを詳細に紹介します - PIノードは、ピン系生態系における重要な役割であり、設置と構成の完全な手順を提供します。 Pinetworkブロックチェーンテストネットワークの発売後、PIノードは多くの先駆者の重要な部分になり、テストに積極的に参加し、今後のメインネットワークリリースの準備をしています。まだピン張りのものがわからない場合は、ピコインとは何かを参照してください。リストの価格はいくらですか? PIの使用、マイニング、セキュリティ分析。パインワークとは何ですか?ピン競技プロジェクトは2019年に開始され、独占的な暗号通貨PIコインを所有しています。このプロジェクトは、誰もが参加できるものを作成することを目指しています

pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 Dec 02, 2022 pm 09:06 PM

Nodejs実行可能ファイルをpkgでパッケージ化するにはどうすればよいですか?次の記事では、pkg を使用して Node プロジェクトを実行可能ファイルにパッケージ化する方法を紹介します。

npm ノード gyp が失敗した場合の対処方法 npm ノード gyp が失敗した場合の対処方法 Dec 29, 2022 pm 02:42 PM

「node-gyp.js」が「Node.js」のバージョンと一致しないため、npm node gyp が失敗します。解決策は次のとおりです: 1. 「npm cache clean -f」を使用してノード キャッシュをクリアします; 2. 「npm install -」を使用します。 g n" n モジュールをインストールします。 3. 「n v12.21.0」コマンドを使用して、「node v12.21.0」バージョンをインストールします。

Angular と Node を使用したトークンベースの認証 Angular と Node を使用したトークンベースの認証 Sep 01, 2023 pm 02:01 PM

認証は、Web アプリケーションの最も重要な部分の 1 つです。このチュートリアルでは、トークンベースの認証システムと、それが従来のログイン システムとどのように異なるかについて説明します。このチュートリアルを終えると、Angular と Node.js で書かれた完全に動作するデモが表示されます。従来の認証システム トークンベースの認証システムに進む前に、従来の認証システムを見てみましょう。ユーザーはログイン フォームにユーザー名とパスワードを入力し、[ログイン] をクリックします。リクエストを行った後、データベースにクエリを実行してバックエンドでユーザーを認証します。リクエストが有効な場合、データベースから取得したユーザー情報を使用してセッションが作成され、セッション情報が応答ヘッダーで返され、セッション ID がブラウザに保存されます。対象となるアプリケーションへのアクセスを提供します。

See all articles