[JS] 싱글스레드에서의 동기처리와 비동기처리

이신영·2024년 5월 26일
0

JavaScript

목록 보기
2/2
post-thumbnail

JS는 왜 싱글 쓰레드인가?

JS는 웹 페이지의 보조적인 기능을 처리하기위해 1995년에 브렌던 아이크(Brendan Eich)가 넷스케이프(Netscape) 웹 브라우저에서 동작하는 경량 스크립트 언어로 개발한 것이다. 초기의 주요 목적은 웹 페이지에 간단한 동적 기능을 추가하는 것이었기 때문에 멀티스레드보다 단순한 싱글스레드로 선택된 것이다.

한줄요약) 만들기 쉽고 빨라서요

근데 왜 비동기처리가 핵심?

위에 그림 딱봐도 멀티쓰레드를 사용해서 병렬처리하면 더 좋지않을까? 라고 생각이 드는데 JS에는 효율적인 비동기처리를 지원하는 몇가지 특성이 있기 때문이다.

그럼 비용이 덜 드는데 병렬구조랑 비스무리~ 하게 비동기 처리할 수 있는 JS를 쓰는것으로 단순성과 효율성을 높일수있지않을까?


JS의 효율적인 비동기처리

이벤트 루프와 콜백

JS는 이벤트 루프(Event Loop)와 콜백(Callback)을 통해 비동기 처리를 수행한다. 이벤트 루프는 JS 런타임이 작업을 처리하는 방식을 설명하는 개념인데 이벤트 루프는 호출 스택(Call Stack)과 작업 큐(Task Queue)로 구성되고, 호출 스택에는 실행 중인 함수들이 쌓이고, 작업 큐에는 비동기 작업들이 대기한다. 이벤트 루프는 호출 스택이 비어있을 때 작업 큐에서 작업을 가져와 실행하고 이로 인해, 블로킹 없이 비동기 작업이 처리된다.

요약
1. 호출 스택에 함수들이 쌓이고 실행
2. 비동기 함수는 호출 스택에서 빠져나가고, 콜백은 작업 큐에 대기
3. 이벤트 루프가 호출 스택이 비어있을 때 작업 큐에서 콜백을 호출 스택으로 이동시켜 실행

위와같은 기능으로 이벤트 루프와 콜백 덕분에 JS는 단일 스레드에서도 효율적인 비동기 처리가 가능하다. 이벤트 루프가 호출 스택과 작업 큐를 관리하여 블로킹 없이 작업을 처리해주니깐?

논 블로킹 I/O

블로킹 모델

논 블로킹 모델

JS는 논 블로킹 I/O(Non-blocking I/O) 모델을 채택하여 비동기 처리를 강화한다. 논 블로킹 I/O는 입력 및 출력 작업이 완료될 때까지 기다리지 않고, 바로 다음 작업을 수행하는 방식으로, 이는 서버에서 많은 클라이언트 요청을 동시에 처리할 때 매우 유용하다. 예를 들어, 파일 읽기, 네트워크 요청 등 시간이 걸리는 작업을 비동기로 처리함으로써, 다른 작업들이 대기하지 않고 계속 실행될 수 있다.

요약
1. 비동기 I/O 작업 시작
2. 해당 작업은 바로 반환되어 다음 코드가 실행
3. I/O 작업이 완료되면, 콜백이 호출되어 결과를 처리

비동기 함수 호출 후 콜백을 통해 결과를 받아오는 방식은, 논 블로킹 I/O 모델을 활용한 대표적인 예이다. 이렇게 하면, 하나의 스레드가 블로킹 없이 여러 작업을 효율적으로 처리할 수 있다.


결론

이와 같이, JS는 단일 스레드 환경에서 비동기 처리를 통해 효율성을 극대화한다. 이벤트 루프와 논 블로킹 I/O 덕분에, 비록 멀티스레드를 사용하지 않더라도 병렬 처리와 유사한 효과를 얻을 수 있다. 결과적으로, JS는 단순성과 효율성을 모두 잡을 수 있는 좋은 언어이다~

profile
후회하지 않는 사람이 되자 🔥

0개의 댓글