Nodejsは単一プロセスですか?

青灯夜游
リリース: 2021-11-11 17:44:39
オリジナル
2161 人が閲覧しました

nodejs は単一のプロセスです。ノードはシングル スレッドの単一プロセス モデルに従いますが、イベント ドリブンの非同期非ブロッキング モードに基づいており、同時実行性の高いシナリオに適用でき、スレッドの作成とスレッド間のコンテキストの切り替えによって発生するリソースのオーバーヘッドを回避します。

Nodejsは単一プロセスですか?

このチュートリアルの動作環境: Windows7 システム、nodejs バージョン 12.19.0、Dell G3 コンピューター。

プロセス

プロセスは、特定のデータ収集に対するコンピュータ内のプログラムの実行アクティビティであり、リソースの割り当てとスケジュール設定の基本単位です。システム: これはオペレーティング システム構造の基礎であり、プロセスはスレッドのコンテナーです (百科事典より)。プロセスはリソース割り当ての最小単位です。サービスを開始してインスタンスを実行すると、サービス プロセスが開きます。たとえば、Java の JVM 自体がプロセスです。Node.js では、ノード app.js を通じてサービス プロセスが開きます。マルチプロセスはコピーです。プロセスのフォーク(fork) フォーク 出てくるプロセスはそれぞれ独立した空間アドレスとデータスタックを持っている あるプロセスが別のプロセスで定義した変数やデータ構造にアクセスすることはできない IPC通信が確立した場合のみプロセス間でデータを共有できる

スレッド

スレッドは、オペレーティング システムが計算スケジュールを実行できる最小単位です。まず、スレッドがプロセスに属し、プロセスに含まれていることを理解する必要があります。プロセス。スレッドは 1 つのプロセスにのみ属することができますが、プロセスは複数のスレッドを持つことができます。シングルスレッド シングルスレッドとは、プロセスが 1 つのスレッドだけを開くことを意味します。JavaScript はシングルスレッドです。プログラムは順番に実行されます (JS の非同期についてはここでは当面触れません)。キューを想像してください。前のプログラムが実行された後、シングルスレッドを使用する場合 スレッド言語でコーディングする場合、時間のかかる同期操作を多すぎないでください。そうしないと、スレッドがブロックされ、後続の応答が処理できなくなります。 Javascriptを使用してコーディングする場合は、JavaScriptの非同期動作機能を最大限に活用してください。

nodejs シングル プロセス シングル スレッド イベント ドライバー

ノードはシングル スレッド シングル プロセス モデルに従います。ノードのシングル スレッドとは、JS エンジンのインスタンスが 1 つだけであることを意味します。これはnodejsのメインスレッドで実行され、nodeはIOなどの非同期操作をイベント駆動型で処理します。ノードのシングルスレッド モードではメイン スレッドが 1 つだけ維持されるため、スレッド間の切り替えコストが大幅に削減されますが、非同期操作を実行するために複数のワーカー スレッドが存在します。

ただし、ノードの単一スレッドにより、メイン スレッドでの CPU 負荷の高い操作の実行が防止されます。そうしないと、メイン スレッドがブロックされます。 CPU を集中的に使用する操作の場合、child_process を通じて独立した子プロセスをノード内に作成できます。親子プロセスは IPC を通じて通信します。子プロセスは外部アプリケーションまたはノードのサブプログラムにすることができます。子プロセスの実行後、結果は次のようになります。親プロセスに戻りました。

Node.js の動作メカニズム

  • V8 エンジンは JavaScript スクリプトを解析します。
  • 解析されたコードはノード API を呼び出します。
  • libuv ライブラリは、ノード API の実行を担当します。異なるタスクを異なるワーカー スレッドに割り当ててイベント ループを形成し、タスクの実行結果を非同期で V8 エンジンに返します。
  • V8 エンジンは結果をユーザーに返します。

この図は Node.js 全体の動作原理です。Node.js は左から右、上から下の 4 つの層に分かれています。レイヤー、V8 エンジン レイヤー、ノード API レイヤー、および LIBUV レイヤー。

  • アプリケーション層: つまり、JavaScript インタラクション層。最も一般的なものは、http、fs
  • などの Node.js モジュールです。V8 エンジン層: つまり、V8エンジンは JavaScript 構文を解析するために使用され、その後、下位層 API との対話
  • NodeAPI 層: 通常は C 言語で実装される上位層モジュールに、オペレーティング システムと対話するためのシステム コールを提供します。
  • LIBUV レイヤー: イベント ループ、ファイル操作などを実装する、クロスプラットフォームの最下位カプセル化です。これは、Node.js の非同期実装

Node の中核です。 js イベント ループ

Node.js は通常、単一プロセスです。

  • メイン スレッドは V8 と Javascript を実行します
  • 複数のサブスレッドはイベント ループを通じてスケジュールされます

イベント ループ:

イベント ループは、プログラム内のイベントまたはメッセージを待機してディスパッチするために使用されるプログラミング構造です。メイン スレッドは、「タスク キュー」からイベントを読み取ります。このプロセスは継続的であるため、実行メカニズム全体が呼び出されます。イベント ループ (イベント ループ)

イベント キュー:

ユーザーのネットワーク リクエストまたはその他の非同期操作が到着すると、ノードはそれをイベント キューに入れます。現時点ではすぐには実行されず、コードはブロックされず、メインスレッドのコードが実行されるまで継続されます。

タスク キュー:

タスク キュー」は、イベント キュー (メッセージ キューとしても理解できます) です。IO デバイスがタスクを完了すると、 「タスク」 イベントを「キュー」に追加するということは、関連する非同期タスクが「実行スタック」に入ることができることを意味します。メインスレッドは「タスク キュー」を読み取り、その中のイベントを読み取ります。

イベント駆動型:

本質は、メイン ループとイベント トリガーを通じてプログラムを実行することです
ノード
Node.js は言語やフレームワークではありません。Google V8 エンジンに基づく単なる JavaScript ランタイム環境です。 js 関数の拡張です。ネットワーク、ファイル、DNS解決、プロセススレッドおよびその他の機能を提供します。

libuv
libuv は、Node.js 用に特別に開発されたパッケージ ライブラリで、クロスプラットフォームの非同期 I/O 機能を提供します。

注:

  • イベント ループには 1 つ以上のタスク キューがあります。タスクキューはタスクのグループです

  • #Libuv は主にシステムが提供するイベント駆動型モジュールを使用してネットワーク非同期 IO を解決し、スレッド プールを使用してファイル IO を解決します。さらに、プロセス、スレッドなどの使用をカプセル化するタイマーが実装されています。

実際、ここでのイベント ループはブラウザの js のイベント ループと同じです。メイン スレッドでは同期コードが許可され、非同期コードは対応するワーカー スレッドで実行されます。 . コールバック実行結果後 イベントキューに入れ、メインスレッドがイベントキューのタスクを実行するのを待ちます。

高い同時実行性を実現するイベント駆動型のイベント ループ

特定の実行シーケンス:

1. 各 Node.js プロセスでは、メイン スレッドが 1 つだけ実行されます。プログラム コードは実行コンテキスト スタックを形成します

2. メイン スレッドに加えて、「イベント キュー」も維持されます。ユーザーのネットワーク リクエストまたはその他の非同期操作が到着すると、ノードはそれをイベント キューに入れます。この時点では、すぐには実行されず、コードはブロックされません。メイン スレッド コードが実行されるまで継続されます。完了。

3. メインスレッドのコードの実行が完了したら、イベントループ機構であるイベントループを通じて、イベントキューの先頭から最初のイベントの取り出しを開始し、このイベントを実行するためにスレッド プールからスレッドを取得し、続けて 2 番目のイベントを取り出し、実行するスレッドをスレッド プールから割り当て、次に 3 番目、4 番目を割り当てます。メインスレッドは、イベントキュー内のすべてのイベントが実行されるまで、イベントキュー内に未実行のイベントがあるかどうかを継続的にチェックし、その後、新しいイベントがイベントキューに追加されるたびに、メインスレッドにそれらを取り出すように通知されます。それらを注文して EventLoop に渡して処理します。イベントが実行されると、メインスレッドに通知され、メインスレッドがコールバックを実行し、スレッドがスレッド プールに返されます。

Note

私たちが見ている node.js の単一スレッドは、UI レンダリングとスレッドを共有する単なる js メイン スレッドです。重要な非同期操作は依然としてスレッドによって実行されます。プールが完了すると、ノードは実装のためにすべてのブロッキング操作を内部スレッド プールに引き渡します。これは継続的なラウンドトリップ スケジューリングのみを担当し、実際の I/O 操作は実行しません。これにより、非同期のノンブロッキング I/O が実現されます。ノードのシングルスレッドとイベント駆動の本質。

概要:

1. libuv スレッド プールはデフォルトで 4 つのスレッドを開き、最大 128 のスレッドを開くことができます。 (例: 以前は、Web サーバーは同時に最大 100 リクエストしか受信できませんでした。リクエストが多すぎると受信できず、サーバーがハングアップしてしまいます。

いわゆる高リクエストnodejs の同時実行性とは、1,000 または 10,000 のリクエストを同時に受信できることを意味します。キューで待機しているだけです。)

2. メイン スレッドは、シングルスレッドの js を実行します。コードは多くの計算を実行しており、CPU に負荷がかかります。メインスレッドが空いていない場合、IO の問題を処理できないため、メインスレッドはブロックされます。

3. コールバックでは、特定のリクエストが順番に実行されることのみを保証できますが、複数のリクエストがリソースにアクセスする順序は保証できません。リソースにアクセスするときは、複数のリクエストをロックする必要があります。トランザクション ロックを使用してください。

[推奨学習:「

nodejs チュートリアル 」]

以上がNodejsは単一プロセスですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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