싱글 쓰레드 모델과 Event Loop
논블로킹과 Event Loop 에 대한 간단한 설명
- Blocking 요청과 Non-Blocking 요청에 대한 처리가 다름
- Non-Blocking 요청이 들어왔을 때는 이벤트 루프에 담아서 처리함
- Blocking 요청일 때는 워커 스레드에게 맡김
자바스크립트의 싱글 스레드 모델
작동 방식
- 싱글 스레드: 한 번에 하나의 연산을 단일 시퀀스로 처리함
- 실행 컨텍스트: 자바스크립트 코드가 실행되면, "실행 컨텍스트 (Execution Context)" 에서 실행함. 실행 컨텍스트는 코드가 실행되는 순서를 처리함.
- 호출 스택 (Call Stack): 실행 컨텍스트 관리를 위해 콜스택을 사용함. 콜스택은 프로그램에서 현재 위치를 기록하는 데이터 구조로 사용됨. 가장 최근에 호출된 함수가 가장 상위에 있음. 함수가 완료되면, 스택에서 제거되고 프로그램은 중단된 부분부터 실행함.
장점
- 단순성: 교착 상태(Deadlock)나 경쟁 상태(Race Condition) 같은 복잡한 문제 처리가 필요 없음. 프로그래밍 모델을 단순화 가능.
- 그래도 CPU 를 사용하는 작업은 여전히 이벤트 루프에서 실행되어 병목 현상이 발생할 수 있다.
- 최신 버전의 Node.js 는 실험적 기능으로 작업자 스레드(Worker Threads) 라는 것을 도입하여 일정 수준의 멀티 스레딩을 허용한다. 이를 이용하면 자체적인 복잡성이 수반된다.
- 또, Node.js 는 CPU 집약적인 작업을 처리하기 위해서 자식 프로세스를 생성할 수도 있다.
- 일관성: 실행 순서의 일관성을 보장. 이는 웹앱의 UI 및 상태 관리에 중요함.
단점
- 작업 차단: 한 번에 한가지 작업만 수행 가능해서 오래 걸리는 작업이 메인 스레드를 차단해 UI가 응답하지 않아 사용자 환경이 저하될 수 있음.
자바스크립트의 이벤트 루프
작동 방식
- 논 블로킹 I/O: 자바스크립트는 싱글 스레드임에도 불구하고 non-blocking I/O 연산을 수행할 수 있음. 이는 자바스크립트가 비동기 콜백을 사용할 수 있게 해주는 이벤트 루프를 통해 이뤄짐.
- 이벤트 루프 매커니즘: 이벤트 루프는 호출 스택이 비어있는지 지속적으로 확인함. 비어 있으면 메세지 큐에서 실행을 기다리는 보류 중인 콜백이 있는지 확인. 대기 중인 콜백이 있으면 콜백을 제거하여 호출 스택으로 푸시한 다음에 실행.
장점
- 비동기 동작: 자바스크립트가 메인 스레드를 차단하지 않고, 웹 API 요청과 같은 긴 I/O 작업을 비동기적으로 수행할 수 있게 해줌.
- 성능 향상: 이벤트 루프의 non-blocking 특성으로 인해 웹앱의 성능이 향상되고 UX 가 좋아진다.
단점
- 디버깅의 복잡성: 비동기 코드는 비선형적인 실행 흐름을 가져 이해와 디버깅이 어려울 수 있다.
- 콜백 지옥의 가능성: 콜백에 대한 의존도가 높으면 콜백 지옥을 겪을 수 있다.
반응형
'자바스크립트 > 개념' 카테고리의 다른 글
History API 란? (간단 정리) (0) | 2024.02.14 |
---|---|
이벤트 루프는 어떻게 non-blocking 연산을 막힘없이 처리하는가? (0) | 2024.01.04 |
자바스크립트에서 머신 코드 대신 바이트 코드를 사용하는 이유 (0) | 2024.01.04 |
innerHTML vs innerAdajcentHTML() 비교 (0) | 2023.07.15 |
자바스크립트 이벤트(Event) 객체와 커스텀 이벤트 (Custom Event) 란? (0) | 2023.07.07 |