ホームページ > 記事 > ウェブフロントエンド > Nodejsは単一プロセスですか?
nodejs は単一のプロセスです。ノードはシングル スレッドの単一プロセス モデルに従いますが、イベント ドリブンの非同期非ブロッキング モードに基づいており、同時実行性の高いシナリオに適用でき、スレッドの作成とスレッド間のコンテキストの切り替えによって発生するリソースのオーバーヘッドを回避します。
このチュートリアルの動作環境: Windows7 システム、nodejs バージョン 12.19.0、Dell G3 コンピューター。
プロセス
プロセスは、特定のデータ収集に対するコンピュータ内のプログラムの実行アクティビティであり、リソースの割り当てとスケジュール設定の基本単位です。システム: これはオペレーティング システム構造の基礎であり、プロセスはスレッドのコンテナーです (百科事典より)。プロセスはリソース割り当ての最小単位です。サービスを開始してインスタンスを実行すると、サービス プロセスが開きます。たとえば、Java の JVM 自体がプロセスです。Node.js では、ノード app.js を通じてサービス プロセスが開きます。マルチプロセスはコピーです。プロセスのフォーク(fork) フォーク 出てくるプロセスはそれぞれ独立した空間アドレスとデータスタックを持っている あるプロセスが別のプロセスで定義した変数やデータ構造にアクセスすることはできない IPC通信が確立した場合のみプロセス間でデータを共有できる
スレッド
スレッドは、オペレーティング システムが計算スケジュールを実行できる最小単位です。まず、スレッドがプロセスに属し、プロセスに含まれていることを理解する必要があります。プロセス。スレッドは 1 つのプロセスにのみ属することができますが、プロセスは複数のスレッドを持つことができます。シングルスレッド シングルスレッドとは、プロセスが 1 つのスレッドだけを開くことを意味します。JavaScript はシングルスレッドです。プログラムは順番に実行されます (JS の非同期についてはここでは当面触れません)。キューを想像してください。前のプログラムが実行された後、シングルスレッドを使用する場合 スレッド言語でコーディングする場合、時間のかかる同期操作を多すぎないでください。そうしないと、スレッドがブロックされ、後続の応答が処理できなくなります。 Javascriptを使用してコーディングする場合は、JavaScriptの非同期動作機能を最大限に活用してください。
ノードはシングル スレッド シングル プロセス モデルに従います。ノードのシングル スレッドとは、JS エンジンのインスタンスが 1 つだけであることを意味します。これはnodejsのメインスレッドで実行され、nodeはIOなどの非同期操作をイベント駆動型で処理します。ノードのシングルスレッド モードではメイン スレッドが 1 つだけ維持されるため、スレッド間の切り替えコストが大幅に削減されますが、非同期操作を実行するために複数のワーカー スレッドが存在します。
ただし、ノードの単一スレッドにより、メイン スレッドでの CPU 負荷の高い操作の実行が防止されます。そうしないと、メイン スレッドがブロックされます。 CPU を集中的に使用する操作の場合、child_process を通じて独立した子プロセスをノード内に作成できます。親子プロセスは IPC を通じて通信します。子プロセスは外部アプリケーションまたはノードのサブプログラムにすることができます。子プロセスの実行後、結果は次のようになります。親プロセスに戻りました。
この図は Node.js 全体の動作原理です。Node.js は左から右、上から下の 4 つの層に分かれています。レイヤー、V8 エンジン レイヤー、ノード API レイヤー、および LIBUV レイヤー。
Node.js は通常、単一プロセスです。
イベント ループ:
イベント ループは、プログラム内のイベントまたはメッセージを待機してディスパッチするために使用されるプログラミング構造です。メイン スレッドは、「タスク キュー」からイベントを読み取ります。このプロセスは継続的であるため、実行メカニズム全体が呼び出されます。イベント ループ (イベント ループ)
イベント キュー:
ユーザーのネットワーク リクエストまたはその他の非同期操作が到着すると、ノードはそれをイベント キューに入れます。現時点ではすぐには実行されず、コードはブロックされず、メインスレッドのコードが実行されるまで継続されます。
タスク キュー:
タスク キュー」は、イベント キュー (メッセージ キューとしても理解できます) です。IO デバイスがタスクを完了すると、 「タスク」 イベントを「キュー」に追加するということは、関連する非同期タスクが「実行スタック」に入ることができることを意味します。メインスレッドは「タスク キュー」を読み取り、その中のイベントを読み取ります。
イベント駆動型:
本質は、メイン ループとイベント トリガーを通じてプログラムを実行することです
ノード
Node.js は言語やフレームワークではありません。Google V8 エンジンに基づく単なる JavaScript ランタイム環境です。 js 関数の拡張です。ネットワーク、ファイル、DNS解決、プロセススレッドおよびその他の機能を提供します。
libuv
libuv は、Node.js 用に特別に開発されたパッケージ ライブラリで、クロスプラットフォームの非同期 I/O 機能を提供します。
注:
イベント ループには 1 つ以上のタスク キューがあります。タスクキューはタスクのグループです
特定の実行シーケンス:
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 サイトの他の関連記事を参照してください。