스레드 & 블로킹 & 런타임

yunji_kim·2023년 3월 30일
0

JavaScript

목록 보기
7/9

싱글 스레드 vs 멀티 스레드

  • 싱글 스레드 : 일하는 사람 1명. 한 사람이 주어진 작업을 하나씩 처리하는 방식.
  • 멀티 스레드 : 일하는 사람이 여러 명. 여러 사람이 주어진 작업을 같이 처리하는 방식.
싱글 스레드멀티 스레드
장점- 경쟁 상태, 교착 상태 없음 (비동기 작업을 동반하는 경우는 위험이 있음) - 멀티스레드 대비 코드 복잡도가 낮음- 평균적으로 싱글스레드보다 작업 처리 효율이 높음
단점- 여러 명이 일하는 병렬처리보다는 작업 처리 효율이 평균적으로 떨어짐- 사용 시 경쟁 상태, 교착 상태를 고려해야함 (코드 복잡도가 높음)

*경쟁 상태(Race Condition) : 둘 이상의 스레드가 하나의 리소스를 가지고 경쟁을 하는 것을 말한다.

*교착 상태(Deadlock) : 둘 이상의 스레드가 하나의 리소스를 (자바스크립트능 기본적으로 교착 상태는 잘 안 일어남)

  • 자바스크립트는 대표적인 싱글 스레드 언어
  • 싱글 스레드 상황에서 성능을 극대화하기 위해 비동기 처리 방식(non-blocking, asynchronous)을 채택

블로킹 & 논블로킹

블로킹(blocking)

  • 하나의 작업을 마치고 나서 다음 작업을 시작하는 순차적 실행 방식 (예-await)
  • 작업이 길어지면 다음 작업이 지연되는 문제
  • 자바스크립트에서는 동기라는 용어와 혼용

논블로킹(non-blocking)

  • 하나의 작업을 실행시키고 그 작업이 마치지 않아도 다음 작업을 실행하는 실행 방식 (예-setTimeout. fetch)
  • “작업을 실행시켜 놓기만 하는 행위”
  • 작업이 길어져도 다음 작업이 지연되는 문제가 없다
  • 보통 결과값을 return문으로 리턴을 바로 받지 못하며 콜백함수를 통해 받는 경우가 많다(Promise, async의 등장으로 콜백함수가 아닌 Promise, async방법으로 받게 된다)
  • 자바스크립트에서는 비동기라는 용어와 혼용

싱글 스레드인 자바스크립트가 동시 작업이 가능한 이유

개발자가 작성한 자바스크립트 코드는 싱글스레드로 순차적으로 실행시키되 특정 비동기 작업에 대해서는 멀티스레드를 사용하기 때문

자바스크립트 실행 환경 : runtime

자바스크립트 코드를 실행하기 위한 환경의 구성 요소로 엔진, 이벤트 루프 + 큐, 플랫폼 API가 있다.

자바스크립트 엔진

  • 코드를 읽어서 해석하고 작업을 수행하는 역할
  • 엔진 자체는 작업을 수행만 할뿐 비동기/동기와는 관계가 없음
  • 예 : V8, SpiderMonkey, JavaScriptCore

이벤트 루프 + 큐

자바스크립트 코드가 비동기로 실행될 수 있도록 하는 역할로, 이벤트 루프가 없으면 자바스크립트 코드는 모두 동기 방식으로 실행될 수 밖에 없다.

이벤트 루프(event loop)

  • 이벤트 루프는 Call Stack과 Callback Queue를 상태를 계속 감시하며 Call Stack에 함수들이 존재하지 않는다면 Callback Queue에 있는 비동기 함수들을 Call Stack 에 밀어 넣게된다.

큐(queue)

  • 비동기 작업을 마친 후 실행될 콜백함수가 쌓이는 곳
  • 예 : Task Queue(MacroTask Queue = Job Queue?), MicroTask Queue(=Promise의 then, async/wait), Node.js의 libuv

플랫폼 API

  • 동기/비동기 작업들의 묶음. Web API, Node.js API 등이 있음.
  • 비동기 작업 실행은 대부분 플랫폼 API를 통해 일어난다
  • 자바스크립트는 플랫폼 API를 사용해서 비동기 작업을 수행(위임)하며 작업이 마쳤을 때 실행되는 콜백함수를 대부분 해당 API 매개변수로 전달한다. (Promise, async/await의 경우 제외)
  • 비동기 API의 경우 작업이 완료되면 큐에 콜백함수를 등록한다
  • 예) setTimeout, setInterval, fetch, console, fs, path 등
profile
| FE Developer | 기록의 힘 |

0개의 댓글