기본적으로 노드는 싱글 스레드 시스템입니다. 우리가 코드를 동시에 실행할 수 없다는 이야기를 앞의 아티클에서 했었는데, 이것 역시 이 영향에서 비롯됩니다. 일단은 스레드 설명을 위해서 항상 나오게 되는 프로세스와 스레드의 차이점에 대해서 살펴보도록 하겠습니다.
· 프로세스 : OS에서 할당하는 작업의 단위입니다. 일반적으로 하나의 프로그램을 실행하는 것을 상상하면 됩니다. 프로세스 단위는 서로 메모리 등의 자원을 공유하지 않는 독립적인 방식으로 운영됩니다.
· 스레드 : 프로세스 내에서 생성되는 작업 단위입니다. 프로세스는 스레드를 여러 개 생성할 수 있고, 이를 통해 여러 작업을 동시에 처리가 가능하죠. 각 스레드들은 부모 프로세스의 자원을 공유하고, 같은 주소의 메모리에 접근하기 때문에 데이터 공유도 가능합니다.
"노드는 싱글 스레드를 사용한다"는 이야기가 있습니다. 노드를 실행하면 하나의 프로세스가 실행되고, 실제로는 여러개의 스레드가 생성됩니다. 그런데 왜 싱글 스레드 이야기가 나오는 것일까요? - 여기에는 이유가 있습니다. 우리가 직접 제어할 수 있는 스레드가 단 하나뿐이기 때문에 싱글 스레드로 취급하는 것입니다.
스레드는 일손(점원)으로 비유할 수 있겠습니다. 우리가 컨트롤 가능한 스레드(일손)은 하나이기 때문에, 작업 요청이 많이 들어와도 한 번에 하나씩만 처리할 수 있겠죠. 기본적으로 이 방식이 블로킹입니다. 그런데 만일 블로킹이 심할 것으로 예상 된다면, 논블로킹방식을 채택하여 대기 시간을 줄여야 합니다. 너무 추상적인 설명이네요? 아래에서 예시를 들어 설명해 보겠습니다.
자, 질문 하나 하겠습니다. 싱글 스레드가 좋을까요, 멀티 스레드가 좋을까요? 이 질문에 대해서 스레드가 뭔지는 잘 몰라도 멀티 스레드가 더 좋을 것이라고 대답할 것입니다. 과연 그럴까요? 예시를 통해서 살펴보겠습니다.
- 식당이 하나 있습니다. 점원(스레드)의 수는 기본적으로 한 명입니다(싱글 스레드). 고객은 3명이 왔고, 주문을 하려고 합니다(작업 요청).
- 점원(스레드)는 기본적으로 주문(작업 요청)을 받아 주방(CPU)에 전달합니다. 그리고 주방(CPU)에서 요리(작업)를 완료하면 이를 점원(스레드)에게 전달하고, 점원(스레드)은 요청한 고객에게 음식을 전달합니다.
○ 싱글 스레드 + 블로킹 방식일 경우
여기서 싱글 스레드(점원 한명)는 알겠는데, 블로킹 방식이라면 어떻게 일처리가 이뤄질까요? 아주 답답합니다. 손님 세 명이 들어와 각자 주문을 하려고 하는데, 우선 점원은 손님 1에게 가서 주문을 받습니다. 손님 1이 짜장면을 시켰네요. 그럼 점원은 주방에 이 주문을 전달합니다. 그리고 짜장면이 완성될 때까지 주방 앞에서 멀뚱멀뚱 기다립니다. 그리고 짜장면이 완성되면 이를 받아서 손님 1에게 전달합니다. 그리고 비로소 손님 2에게 주문을 받습니다.
○ 싱글 스레드 + 논 블로킹 방식일 경우
위의 경우와 차이점은, 손님 1 주문을 받아 주방에 전달하면, 바로 손님 2에게 가서 주문을 받고 또 주방에 넘깁니다. 그리고 바로 손님 3에게 가서 주문을 받고 주방에 주문을 넣습니다.
이제 요리가 완성되는 순서로 요리를 받아서 손님에게 서빙을 진행합니다. 각각의 요리가 블로킹 방식, 논 블로킹 방식인지에 따라서 작업 순서는 주문 접수 순서와 항상 같지는 않습니다.
노드는 이 싱글 스레드 + 논 블로킹 방식을 채택하고 있습니다. 하지만 이도 위험이 있습니다. 점원이 아파서 쓰러지는 경우도 문제이고(싱글 스레드), 주방에서 요리 하나에 들어가는 조리 시간이 길어지면(CPU처리) 버거워지고 대기도 길어집니다.
○ 멀티 스레드 + 논 블로킹 방식일 경우
멀티 스레드 방식을 채택하면, '손님 한 명 당 점원 한 명'의 구조가 되는 것입니다. 빠른 처리가 가능할 것 같지만, 단점도 명확합니다. 손님이 늘어남에 따라 알바생은 비례하여 증가하게 됩니다. 거기에 해고나 새로운 고용을 진행하면 문제가 생기고 비용이 추가로 들어가죠. 심지어 나중에는 일이 없어서 노는 경우도 생깁니다.
결론적으로 멀티 스레드+논 블로킹 방식으로 전환하면 되지 않나는 생각을 할 텐데 - 실제로 멀티 스레드는 난이도가 꽤 높은 부분입니다. 그래서 I/O 요청 시에는 멀티 프로세싱이 더 효율적이라는 의견도 많습니다.
멀티 프로세싱과 멀티 스레드를 비교해 보겠습니다. I/O작업 처리 시점에는 멀티 스레딩보다는 멀티 프로세싱이 더 효율적입니다. 멀티 스레딩, 멀티 프로세싱에 대한 자세한 내용은 이후 아티클에서 살펴볼테니 일단은 개념적인 이해만 짚고 넘어가도록 하겠습니다.
멀티 프로세싱 | 멀티 스레딩 |
여러 개의 프로세스 사용 | 하나의 프로세스 안에서 여러 개의 스레드 사용 |
I/O 요청이 많을 경우 사용 | CPU 작업이 많을 경우 사용 |
프로그래밍이 상대적으로 쉬움 | 프로그래밍이 어려움 |
'Programming > Node.js' 카테고리의 다른 글
2. Javascript ES2015 (1) - const, let (0) | 2024.01.24 |
---|---|
1. Node.js 핵심 개념 이해 (5) - 서버로서의 노드 (2) | 2024.01.23 |
1. Node.js 핵심 개념 이해 (3) - Non Blocking I/O (0) | 2024.01.17 |
1. Node.js 핵심 개념 이해 (2) - Event Driven, Context [2/2] (1) | 2024.01.16 |
1. Node.js 핵심 개념 이해 (2) - Event Driven, Context [1/2] (1) | 2024.01.14 |