Node.スタート


コンセプト


Node.jsはChrome V 8 JavaScriptエンジンを使用して構築されたJavaScriptランタイムです.런타임: 특정 언어로 만든 프로그램들을 실행할 수 있는 환경JavaScriptはWebアプリケーションの開発に使用され、すべてのブラウザにJavaScriptエンジンが内蔵されてJavaScriptコードを解釈します.(ChromeはV 8)
Node.jsは、サーバ上でJavaScriptを実行するためのサーバとしての機能ツールを提供します.서버:ネットワークを介してクライアントに情報またはサービスを提供するコンピュータまたはプログラムは、クライアントの要求に応答する.클라이언트:要求を送信する主体は、ブラウザまたは技術プログラムおよび他のサーバに要求を送信するサーバであってもよい.
웹 사이트를 방문하기 위해 주소창에 사이트 주소를 입력(요청) 
-> 브라우저는 주소에 해당하는 위치를 파악
-> 컴퓨터로부터 웹 사이트의 페이지를 받아와 요청자의 브라우저(클라이언트)띄운다(응답).

Node.js


イベントベース

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식イベントベースのシステムでは、特定のイベントが発生したときに何をするかを予め登録し、이벤트 리스터(event listener)콜백(callback)関数を登録することを示す必要がある.
ノードはイベントベースで動作するため、イベントが発生すると、イベントリスナーに格納されたコールバック関数が呼び出されます.発生したイベントがないか、発生したイベントが処理されていない場合は、次のイベントの発生を待機します.
複数のイベントが同時に発生すると、イベントループはコールバック関数を呼び出す順序を判断します.이벤트 루프(event loop):イベント発生時に呼び出されるコールバック関数を管理し、コールバック関数の実行順序を決定する.ノードが終了するまで、イベントのタスクを繰り返します.백그라운드:settimeoutのようなタイマーやイベントリスナーが待機している位置태스크 큐:イベントが発生した後、バックグラウンドは、タイマまたはイベントリスナーのコールバック関数をタスクキューで送信する.
function run(){
  console.log('3초 후 실행'); 
}

console.log('시작');
setTimeout(run, 3000);
console.log('끝');
[결과]
시작
끝
3초 후 실행
  • 呼び出しスタックでは、まずグローバルコンテキストanonymousによって呼び出しスタックに入り、settimeoutによって呼び出しスタックに入る.
  • settimeoutを実行すると、コールバックrunがバックグラウンドに送信され、settimeoutが呼び出しスタックを終了します.その後anonymousは呼び出しスタックから終了します.
  • のバックグラウンドで、3秒後のrun関数をタスクキューに送信します.
  • 呼び出しスタックの実行が終了し、空になった場合、イベントループはタスクキューのrunコールバックを呼び出しスタックに入れて実行する.
  • runは呼び出しスタックで実行され、空になります.
  • イベントループは、タスクキュー内のコールバック関数を待機し続ける.
  • 非ブロックI/O


    イベントループを活用すると、時間のかかるタスク(同時に実行可能なタスク/同時に実行できないタスク)を効率的に処理できます.
    JAvascriptコードは同時に実行できません.javascriptではなくInput/0 utput操作で同時に処理できます.これらの作業を行う場合、ノードは非ブロックで処理される.

    ≪ブロック|Blocking|oem_src≫:前の操作が完了してから、次の操作を実行できます。

    function longRunningTask(){
      // 오래 걸리는 작업
      console.log('작업 끝'); 
    }
    
    console.log('시작');
    longRunningTask();
    console.log('다음 작업');
    [결과]
    시작
    작업 끝
    다음 작업

    ≪ブロックしない|Non-Blocking|emdw≫:前のタスクの完了を待たずに次のタスクを実行します。

    function longRunningTask(){
      // 오래 걸리는 작업
      console.log('작업 끝'); 
    }
    
    console.log('시작');
    setTimieout(longRunningTask(), 0);
    console.log('다음 작업');
    [결과]
    시작
    다음 작업
    작업 끝
    settimieout(コールバック,0)は、コードを非ブロック化するための方法の1つである.
    イベントループのため、settimeoutのコールバック関数long runningTaskがタスクキューに送信されるため、順番に実行されません.次のタスクは、まず実行され、時間のかかるタスクを完了します.

    シングルスレッド

    프로세스:オペレーティングシステムが割り当てたタスクユニット、ノードまたはWebブラウザなどのプログラムは、個別のプロセスです.プロセス間ではメモリなどのリソースは共有されません.스레드:プロセスで実行されるストリームの単位.複数のタスクを同時に処理する複数のスレッドを作成できます.スレッドは、親プロセスリソースを共有したり、同じアドレスメモリにアクセスしてデータを共有したりすることができます.
    ノードは単一スレッドです.
    正確には,ノードは単一スレッドではない.ノードを実行すると、まずプロセスが作成され、そのプロセスに複数のスレッドが作成され、内部に複数のスレッドが作成されます.ここで、直接制御されるスレッドは1つしかないため、ノードは通常、単一スレッドとみなされる.
    多くのリクエストがあれば、1つのリクエストを一度に処理します.深刻な渋滞の作業を処理しなければ、スレッドは1つで十分です.ブロックが発生する可能性がある場合、非ブロック法を使用して待ち時間を短縮する.
    シングルスレッド、ブロック

    シングルスレッド、非ブロック

    マルチスレッド、ブロック

    マルチスレッドマルチプロセッサ1つのプロセスで複数のスレッドを使用複数のプロセスCPUタスクを使用する場合、I/Oリクエストが多い場合、プログラミングが困難で、プログラミングが容易である
    I/Oタスクの処理ではマルチスレッドよりもマルチ処理が有効であるため,ノードはマルチ処理を行うことが多い.

    サーバとしてのノード


    ノードは基本的に単一スレッド、非ブロックモードを採用し、単一スレッドおよび非ブロックモードの長所と短所とは大きく異なる.
    サーバは基本的にI/O要求が多いので、I/O処理能力の強いノードをサーバとして使用することが望ましい.ノードはlibuvライブラリを使用してI/O操作を非ブロックで処理します.したがって、1つのスレッドは、大量のI/Oを独自に負担することができます.ただし、CPU負荷の大きいタスクには適していません.作成されたコードはすべて1つのスレッドで処理されます.
    ノードは、数が多いがサイズの小さいデータをリアルタイムで交換するのに適した特性を有する.リアルタイムチャットアプリケーションや株価チャートJSONデータを提供するAPIサーバでは、ノードがよく使用されます.
    利点:マルチスレッド方式に比べて少ないコンピュータリソースを使用することは基本的に単一スレッドであるため、1つのCPUコアのみを使用するサーバはCPU操作が多いサーバであり、不適切なマルチスレッド方式に比べて管理が容易であるが、スレッドを停止する必要はない.Webサーバは組み込みサーバであるため、サーバ規模が大きくなると、管理が困難なJavaScriptを使用し、中程度のパフォーマンスJSON形式との互換性を容易に実現