본문 바로가기

node

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

일단 결론부터 말하자면 node.js는 싱글 스레드이다

하지만 마냥 싱글스레드라고 하기엔 모호한 부분이 있다

이제 부터 왜 그런지 설명하겠다

설명하기 전에 알아야할 사전지식을 대충 설명하고 시작하겠다

프로세스와 스레드

프로세스 : 실행된 프로그램이며 운영체제로부터 시스템 자원을 할당받는 자원 영역이다

스레드 : 프로세스에서 실행되는 여러 흐름의 단위이며 프로세스가 할당받은 자원을 이용하는 실행단위이다

 

프로세스의 메모리

프로세스 메모리 구조

 

메모리 구조는 크게 stack, heap, bss, data(bss, data를 합쳐서 data로 퉁치기도 함), text이다

 

스택(stack)영역 : 임시 메모리 영역, 후입선출, 함수호출과 관계있는 지역변수와 매개변수가 저장되며 선입후출이다

 

힙(heap)영역 : 프로그래머가 관리하는 영역, 선입선출, 프로그래머가 동적으로 메모리공간이 할당 해제함

 

bss영역 : 전역변수, 구조체등이 저장되는 공간이며 초기값이 없는 데이터가 저장된다

 

데이터(data)영역 : 프로그램의 전역 변수, 문자열, 구조체, 상수가 저장되는 영역이다

 

코드(code)영역 : 프로그램의 코드가 저장되는 영역 text영역이라고 함 프로그램의 시작부터 끝까지 메모리에 남아있다

 

single, multi thread

single thread

- 하나의 프로세스에서 하나의 스레드를 실행하므로, 프로세스 내의 작업을 순차적으로 실행한다.

 

multi thread 

- 하나의 프로세스 내에 여러 개의 스레드가 실행된다.

- 각각의 스레드가 다른 작업을 할당받으므로, 프로세스가 병렬적으로 여러 작업을 동시에 수행할 수 있다.

- Multi-Thread 는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.

 

 

register는 stack의 상단 값의 주소를 추적하는 포인터다

 

 

javascript는 싱글스레드이다

자바스크립트를 작동하는건 v8엔진이며, v8엔진 덕분에 자바스크립트는 브라우저 내부와 외부에서도 동작할수 있다

v8엔진에는 이벤트 루프가 있는데 이벤트 루프를 통해 비동기 처리를 할 수 있다. 그리고 이벤트 루프가 싱글스레드로 작동한다. 

 

node.js 이것도 그냥 싱글 스레드 아닌가?

node.js는 내장 코어 라이브러리와 v8엔진 그리고 libuv라는 라이브러리로 구성되어있다 libuv에는 여러 구성요소가 있지만 간단하게 os커널, 이벤트 루프, 스레드 풀이 세개로 설명을 하겠다. os커널은 어떤 비동기 작업을 지원하는지 알고 있어서 작업에 따라 커널이 알아서 처리하거나 스레드 풀에 작업을 맡긴다 작업이 완료되면 이벤트 루프에게 이것을 알리고 이벤트 루프는 콜백함수로 등록을 한다. 스레드 풀은 커널이 작업 못하는 것을 수행하고 이 스레드풀이 멀티스레드로 이루어져있어서 node.js가 싱글스레드라고 단정짓기 모호하다는 것이다.

 

정리하자면

1. 스택에 함수가 쌓이면 실행하는데 비동기 작업이면 이벤트루프가 커널에 작업을 지정한다

2. 커널이 알아서 비동기 함수를 처리하고 못하는건 스레드 풀에 처리하게 한다

3. 비동기 작업을 처리하고 콜백함수를 호출한다

 

 

결론

node.js의 간단한 작동 방식과 왜 싱글스레드인지 알아보았다. 처음엔 멀티스레드라 했다가 글을 찾을수록 싱글 스레드라는 글이 많이 보여 헷갈리기에 내가 이해한 대로 정리해보았다. 일단 내 생각은 node.js는  이벤트루프가 빠르게 돌아가면서 비동기 함수를 처리 했는지 확인하고 콜백함수를 호출하기 때문에 싱글스레드지만 libuv의 이벤트 루프와 스레드 풀로 동시성을 가진 것이라고 정리하겠다. 

 

혹시나 틀린게 있거나 자세하게 설명할게 댓글로 알려주세요!

 

출처

https://mniyunsu.github.io/node-loop/

 

Node.js의 동작 원리 | YUNSU BAE

Node.js는 자바스크립트를 브라우저 밖에서도 실행할 수 있도록 하는 자바스크립트 런타임이다.

mniyunsu.github.io

https://velog.io/@hyhy9501/Node.js-2.-Node.js%EB%82%B4%EB%B6%80#%EB%85%B8%EB%93%9C%EB%8A%94-libuv%EC%97%90%EC%84%9C-%EC%A0%9C%EA%B3%B5%ED%95%98%EB%8A%94-event-loop%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C%EB%8B%A4