Node


1.ノード起動


基本概念


Node.jsはChromeV 8 JavaScriptエンジンによって構築されたJavaScriptランタイムである.
  • 実行時:特定言語で作成されたプログラムを実行するための環境
  • Javascript実行時はjsで作成したプログラムを実行できる環境を意味する
  • Nodeはjsを既存のWeb上でのみならず非Web環境でも実行できるようにする.
  • ノード内部はV 8というJavaScriptエンジンとlibuvというライブラリで構成されている
  • libuvイベントベース、ブロックレスI/Oモード実施

  • ソース

    イベントベース(イベント駆動)


    イベントベースとは、イベントが発生したときに予め指定された操作を実行することを意味する.イベントベースのシステムでは、コールバック関数をイベントリスナーに登録し、特定のイベントに対して実行する操作を事前に登録します.
  • コールバック関数:あらかじめ定義された関数の場合、あるイベントまたは時点に到達したときに呼び出される関数
  • イベントループ:複数のイベントが同時に発生した場合にコールバック関数を呼び出す順番を判断する
  • JSは単一スレッドベースの言語である.逆に、JSドライバのブラウザでは複数のスレッドが使用されます.したがって,ブラウザ環境とJSエンジンとが相互に関連する機器はイベントループと見なすことができる.コメントサイト

  • コードが実行されると、関数はCall Stackと呼ばれるスタックの形でスタックされます.JSは変数を格納するMemory HeapとCall Stackからなる.
    コード実行の手順は次のとおりです.
  • 関数はCall Stackに積まれている.
  • 関数内でAjaxやsettimeoutなどのWeb API(非同期)を実行すると、イベントリスナーがバックグラウンドに移動し、コールスタック内の関数が失われる.
  • バックグラウンドでイベントが発生した場合、そのイベントのパラメータコールバック関数はCallback Queueと呼ばれるキューにスタックされます.
  • このとき、Call Stackが空であるかどうかをイベントループによって確認し、空である場合はキューから関数を取得してスタックに積み上げる.
  • 関数を実行してスタックを終了します.
  • 非ブロックI/O


    ブロッキングとは、前のタスクが完了した後に次のタスクを実行することです.逆に、非ブロッキングとは、前のタスクの完了を待たないことを意味します.ノードは、ファイルシステムアクセスやネットワーク要求などのI/O操作を非ブロックで処理する.これにより、処理時間を節約できます.
    function longRunningTask() {
        console.log("작업 끝");
    }
    
    console.log("시작");
    longRunningTask();
    console.log("다음 작업");
    上のコードはブロック方式です.結果は「開始」>「タスク終了」>「次のタスク」の順に出力されます.
    function longRunningTask() {
        console.log("작업 끝");
    }
    
    console.log("시작");
    setTimeout(longRunningTask, 0);
    console.log("다음 작업");
    逆に,上記のコードはsettimeout(コールバック,0)方式で非ブロック化されている.結果は、「開始」>「次のタスク」>「タスク終了」に出力されます.

    シングルスレッド


    前述したように、ノードは単一スレッドに基づいている.大量に現れる概念はプロセスとスレッドです.
  • プロセス:オペレーティングシステムが割り当てたタスクの単位であり、異なるプロセス間でメモリなどのリソースを共有しない.異なるプロセスが共有リソースに同時にアクセスする場合、Race conditionが発生する可能性があります.このような状況を回避するには、反発(Mutual Exclusion)が必要です.
  • スレッド:スレッドとは、割り当てられたリソースのプロセス内でそのリソースを共有して作業する単位のこと.プロセスには複数のスレッドがあり、複数の処理を並列に行うことができます.複数のプロセスが実行されると、コンテキスト切替のオーバーヘッドが大きくなり、スレッドは1つのプロセス内でリソースを共有するため、オーバーヘッドが比較的小さい.ただし、プロセスが拡張されると、スレッドも同時に拡張されます.
  • ノードは複数のスレッドを作成しますが、1つのスレッドを直接制御できます.したがって,単一スレッドと考えられる.アクティブループと非ブロックI/Oにより、効率を最大化.