[JS] Node.js는 싱글스레드인가?

Jung In Lee·2024년 12월 31일
0

※ 해당 글은 기록용입니다. 부족한 부분이 있을수도있습니다. 고칠점이있다면 댓글로 알려주세요.


무료하게 앉아있는 연말... 새로운 주제를 접하게되어 정리해보려고한다.

시작은 멀티쓰레드와 비동기를 동일시하는 주제에서 시작이다.

멀티 쓰레드 = 비동기?

  • 결론부터 말하자면 당연히 아니다. 워낙 스레드를 이용해서 비동기/동기개념이 다뤄지고있다보니 처음 접하는 사람은 스레드를 사용해서 해당개념을 이해하려고한다. 이래서 생기는 오류가 아닌가 싶다.

  • 멀티쓰레드는 알다시피 하나 또는 여러개의 프로세스에서 여러 스레드를 사용해서 작업을 처리하는 방식이다.

  • 비동기방식은 일이 들어온 순서에따라 결과도 순서대로 처리되는것이 아니라, 일을 들어온 요청대로 다 받아서, 그냥 완료되면 완료되었다고 보고하는것이다.

  • 잘못된 개념으로는 비동기방식으로 일을 처리하던중, 다른 작업 요청이 오면 그 요청을 실행하면서, Timeout된 요청은 다른 스레드가 받아서 실행한다는 것인데, 이 비유에서 이런 오류가 많이 발생하는것같다.

  • 싱글 스레드 상황으로 가정해보자.

  • 일례로, Node.js는 싱글스레드이면서 비동기작업을 진행한다고한다.

  • Node.js에서 작업을 실행중에 Timeout요청이 발생했다고 하자.

  • 그럼 이 작업은 libuv(Node.js의 I/O작업 담당 스레드)가 백그라운드로 실행한다.

  • Node.js는 싱글스레드가 맞긴하다. 이는 근데 관점의 차이다.

Node.js는 싱글스레드인가?

  • Node.js = Node.js + Libuv

  • Node.js는 이벤트 루프, 자바스크립트 메인 코드 실행을 담당하는 메인스레드가 하나 존재한다. 이 관점으로 보면 맞다.

  • Node.js는 메인 스레드외에 I/O요청을 담당하는 스레드 풀이 존재한다. 이게 Libuv 라이브러리다.

  • Libuv 라이브러리는 메인스레드로부터 떨어져나온 작업을 백그라운드로 실행한다. 스레드 4개를 사용한다.

  • 크게 보면 총 5개의 스레드를 사용하기때문에, 엄밀히 말하면 싱글스레드라고 말할수없다.

  • 흔히 싱글스레드라고 말하는건 이벤트루프를 처리하는 메인스레드 하나만 말하는 경우이다.

  • 보통 이렇게 말하는 사람은 다 알고 쓴다... 하지만 나같은 JS가 주언어가 아닌사람은 당연히 모른다.

그럼 진짜 스레드가 하나일때는 어떻게 비동기 작업을 하지?

  • 돌아가서 Node.js에대한 이야기말고, 진짜 스레드가 하나만 있다고 가정하자.

  • 작업 A를 실행중에 Timeout요청을 받고, 작업 B를 실행한다. 남은 작업A는 담당해줄 스레드가 없다. 그럼 이 작업은 그냥 작업B가 끝날때까지 유지되는것인가?

  • 내생각에는 그냥 놔둬도 비동기라는 개념이 맞다고 생각한다. 비동기는 그냥 일을 요청하면 다 받기때문이다. (A -> B -> B완료 -> A완료) 그냥 이렇게 실행해도 비동기기때문.

  • 그래도 진짜 맞는지 조사를 해봤다.


  • 여기서 고려하는 사항은 백그라운드 작업이나, 외부 api를 지원하지않는 상황이다. 이때는 블로킹/논블로킹 관점으로 들어가야할것같다.

  • 여기서부터는 다음에...

profile
Spring Backend Developer

0개의 댓글