[node.js]Javascript動作原理-単一スレッド/イベントループ


1.Javascriptの動作基礎


JavaScriptの動作基盤を理解するためには,まず非同期処理と非ブロック概念を理解する.
非同期処理
非同期処理とは、順序実行とは逆の概念であり、前のコードの完全な実行と終了を待たずに次のコードを実行することを意味します.
もちろんjavscriptエンジンかnodejsも同様で、デフォルトでは、コード実行(メモリhipまたはcall-stackにコマンドを割り当てて実行)は順番に行われます.
しかし、Pythonとは異なり、JavaScriptエンジンを駆動するノードである.jsなどは非同期処理関数(API)をサポートしているので,非同期処理が可能である.
まとめると,実行後のコードは,先に出現した関数の戻り完了を待つのではなく,非同期処理である(反対の概念は同期処理である).
非同期処理は、この機能をサポートするAPIおよび関数によって行うことができる.
※並列処理は、単一スレッドよりもマルチスレッドの概念に近く、非同期処理とは異なるので注意.
non-blocking
プロセスがプロセスを実行せずに継続的に実行されていることを示します.
Linuxでは、実行時にファイルI/Oや他のシステム関数を呼び出すと、その関数を実行するために実行中のプロセスを「保留」(block)に変換します.
non-blockingは、プロセス実行を保持しない逆の概念です.
非同期処理の観点から見ると、
setTimeout({
  console.log("시작2")
},0)

console.log("시작1")
上記のコードを実行すると、開始1->開始2の順に出力されます.
論理順序はsettimeout->開始1出力->遅延後開始2出力の順序であり、出力開始1のコンソールである.loglogicの実行時にsettimeout(時間遅延)が呼び出されても、論理全体の実行は中断されません.
すなわち、settimeout非同期APIが呼び出されると、このコードと全体的な論理は継続する.
この持続的な動作をnon−blocking,nodeと呼ぶ.これはjsにおける非同期処理を実現するための重要な関連概念である.
※同期処理を行う場合、戻り点で論理を実行することを保証するため、他のコードに対してブロック処理を行います.

2. event loop


特定のイベントが発生したときに処理されるプロセス
イベントループ構造を見ることにより,JavaScriptによる非同期処理の原理を知ることができる.
setTimeout({
  console.log("시작2")
},0)

console.log("시작1")

  • settimeout関数がcallstackにロードされると、バックグラウンドでロードされ、対応するAPIが処理され、「時間遅延」(論理処理ではない)が処理されます.

  • このロード中、スレッド(コード)はブロックされません.この処理の同期処理ではないため、後続の論理(console.log(「開始1」)を実行し、1出力を開始します.

  • WebAPI処理後、対応する論理をTaskQueueにマウントし、マウント後の呼び出しスタックに関数がない場合、呼び出しスタックに論理を再マウントします.

  • call stackにロードされたロジック(console.log(「開始2」)を実行して出力します.
  • この過程で,call stackが空のエージェントがevent loopであることを確認する.
    event loopはsettimeoutだけでなく,特定の時点で動作するために非同期処理をサポートするAPIにも関与する.
    これらのイベントループ処理があれば,非同期処理を行うことができる.

    3.単一スレッド


    要求を単一スレッドに処理して、マルチスレッド内のリソース割り当てと同期の問題を解決します.
    JavaScriptは、単一スレッド環境でコードを実行し、コマンドを処理します.
    マルチスレッドは基本的に並列処理のための環境であり,この場合nodeである.jsで大量のトランザクションを処理すると、同時性の問題が発生します.
    これらの問題を解決するために、javascriptは単一スレッド環境で処理され、単一のWebサイト上のjavascriptコードが複数実行されることを阻止します.
  • 単一スレッド環境では、非同期処理によってトランザクションロジックが処理される.
  • の処理と論理実装自体は非常に容易で楽になった.
  • マルチスレッドほど複雑ではなく、基本的に共有リソースであっても、後で発生する可能性のある割り当ての問題を事前に防止します.
  • 4.参照リンク


    Javascript動作原理(単一スレッド/eventloop)
    https://chanyeong.com/blog/post/44
    https://medium.com/@vdongbin/javascript-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC-single-thread-event-loop-asynchronous-e47e07b24d1c
    Javascript動作の構造原理
    https://ooeunz.tistory.com/89