얼음꽃의 일지

Node.js === single-thread || multiple-thread?? 본문

항해 일지

Node.js === single-thread || multiple-thread??

얼음꽃 2022. 12. 19. 16:53
728x90

과연 Node.js 이 아이는 어떤 스레드일까?

 

1. 컴퓨터를 켜서 프로그램을 실행하게 되면 프로세스가 작동

2. 이 프로세스가 작동하게 되면 그 안에 있는 최소 한개의 스레드가 움직임

3. node도 기본적으로 보자면 여러개의 스레드를 가지고 있음

4. 그러나 node안에서 실행하는 언어인 javascript를 실행하는 스레드가 하나이기에 싱글 스레드라고 봄

5. 물론 기본 작업 외에 특정 작업을 할때, 추가 스레드가 필요하면 새로 스레드를 만들어서 쓸 수 있기에 멀티 스레드도 가능성이 있다고 봄

6. 노드는 이벤트 기반 플랫폼이고 이벤트가 발생하면 미리 지정해둔 작업을 수행하는 방식

7. 그럼 지정해둔 작업을 수행하는 것이기 때문에 콜백 처리하는것과 같음

8. 현재 Node.js는 v8이라는 JavaScript Engine과 비동기 처리해주는 libuv 라이브러리를 이용

9. v8 엔진을 보게되면 Memory Heap과 Call Stack으로 이루어져있음

10. Memory Heap : 메모리 할당, Call Stack : 코드 실행에 따라 호출된 값들이 스택에 쌓임

11. 따라서 stack이기때문에 비동기 처리가 불가능

12. 비동기 처리를 해줄수 있게 하는 라이브러리가 libuv 인데 여기서 일어나는게 이벤트 루프

13. 여기서 이벤트 루프는 v8로 부터 넘겨받은 작업을 비동기로 돌리면서 작업을 함

14. 작업이 끝나면 콜백 함수로 전달하고 콜스택이 이제 비어있으면 거기다 전달

15. 이 이벤트 루프 때문에 node에서 자바스크립트를 처리할 수 있기 때문에 싱글 스레드라고 함

16. 추가로, 자바스크립트 이외에 작업이 발생할 수 있는데, 자바스크립트 시스템은 이 작업이 끝나야지만 진행이 되기 때문에 블로킹을 당함 한마디로 동기로 진행

17. 이러한 블로킹을 해결하기 위해서 libuv 라이브러리에 있는 논 블로킹을 사용을 사용하여 비동기적으로 진행 할 수 있도록 해줌

 

 

https://stackoverflow.com/questions/10680601/nodejs-event-loop

 

따라서, Node.js는 v8 자바스크립트 엔진을 사용하는 동기적인 아이였지만, libuv 라이브러리로 인해 논블로킹이 되어 비동기적으로 돌아가고, 비동기를 처리 해주기 위해 사용되는 이벤트 루프 때문에 싱글 스레드라고 불립니다.

 

v8 엔진

https://ko.wikipedia.org/wiki/V8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%97%94%EC%A7%84) 

 

V8 (자바스크립트 엔진) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. V8은 웹 브라우저를 만드는 데 기반을 제공하는 오픈 소스 자바스크립트 엔진이다. 구글 크롬 브라우저와 안드로이드 브라우저에 탑재되어 있다.[2] V8로 줄여

ko.wikipedia.org

 

Libuv 라이브러리

 

https://en.wikipedia.org/wiki/Libuv

 

libuv - Wikipedia

libuv is a multi-platform C library that provides support for asynchronous I/O based on event loops. It supports epoll(4), kqueue(2), Windows IOCP, and Solaris event ports. It is primarily designed for use in Node.js but it is also used by other software p

en.wikipedia.org

 

728x90

'항해 일지' 카테고리의 다른 글

사용자 패스워드를 전송/보관  (0) 2022.12.21
트랜스파일러와 번들러  (0) 2022.12.19
JWT  (0) 2022.12.19
깊은 복사 와 얕은 복사  (0) 2022.12.19
동시성과 병렬성  (0) 2022.12.19