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

ds-k.dev·2021년 6월 23일
9

Node.js

목록 보기
2/3
post-thumbnail
post-custom-banner

Node.js란?

Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
위키백과, Node.js

Non-blocking I/O, 단일 스레드(싱글 스레드), 이벤트 루프 ...?
등의 난해한 말이 있는데 이번에는 싱글 스레드에 집중해서 살펴보도록 하겠다.

Intro

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
위키백과, 스레드(컴퓨팅)

이 문장만으로 스레드를 이해하기에는 힘들 것 같아서 키워드를 정하고, 각 키워드에 대한 정의를 살펴보면서 스레드를 이해해보도록 하자!

Keyword
1. 프로그램
2. 프로세스
3. 스레드

프로그램

정의

컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합체)이다. 특정 문제를 해결하기 위해 처리 방법과 순서를 기술하여 컴퓨터에 입력되는 일련의 명령문 집합체이며 대부분의 프로그램은 실행 중(즉, 명령어를 '불러들일' 때)에 사용자의 입력에 반응하도록 구현된 일련의 명령어들로 구성되어 있다.
위키백과, 컴퓨터 프로그램

-> 요약하면, 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 정적인 상태의 파일이라고 볼 수 있다.

프로세스

정의

프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다.
위키백과, 프로세스

-> 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다. 예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.

Windows에서 작업관리자(ctrl + alt + delete)를 누르면 현재 진행중인 프로세스의 목록을 볼 수 있다.

프로세스의 특징


-> 멀티 프로세스의 도식화

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 시스템 자원으로부터 할당받는다.
  • 기본적으로 프로세스당 최소 1개의 스레드를 가지고 있다.
  • 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근 할 수 없다.

메모리의 구조

정적 세그먼트

  1. Code -> 작성한 코드가 들어가는 부분
  2. Data -> 전역변수(global), 정적변수(static), 배열(array), 구조체(structure)등이 저장
    프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸

동적 세그먼트

  1. Heap -> 개발자가 관리하는 동적인 공간, 변수, 함수 저장, 호출 등의 작업이 발생하는 공간
  2. Stack -> 함수 호출시 생성되고, 함수 종료시 반환되는 LIFO구조 정책을 사용하는 임시 메모리 공간

스레드

정의

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
위키백과, 스레드(컴퓨팅)

싱글 스레드와 멀티 스레드

싱글 스레드
하나의 프로세스에서 하나의 스레드 실행
하나의 레지스터와 스택으로 표현
-> 레지스터 : CPU 내부의 저장장치
-> 스택 : 레지스터 집합에 존재하는 저장장치 (LIFO)

멀티 스레드
프로세스를 다수의 실행 단위로 나누어 실행
프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화
각각의 스레드가 고유의 레지스터와 스택을 사용

싱글 스레드와 멀티 스레드의 장단점

  1. 싱글 스레드
    1. 장점
    • 자원 접근에 대한 동기화를 신경쓰지 않아도 된다
    • 작업전환(context switch) 작업을 요구하지 않는다.
    1. 단점
    • 여러개의 CPU를 활용하지 못한다.
  2. 멀티 스레드
    1. 장점
    • 프로세스의 자원과 상태를 공유하기 때문에 효율적으로 운영이 가능하다.
    • 서버가 많은 요청을 효율적으로 수행할 수 있는 환경 제공
    1. 단점
    • 스레드 스케쥴링을 신경써야 한다.
    • context switch에 시간이 많이 걸린다면, 오히려 더 느릴 수 있다.

그래서? Node.js의 구조는?

결론부터 말하면, node.js는 싱글 스레드를 가지고 있다. 그러나 자바스크립트를 실행하는 스레드는 단 하나이므로 Node를 싱글스레드라고 한다. 그리고 그 싱글스레드가 바로 이벤트 루프이다.
자세한 설명

자바스크립트 엔진은 Memory Heap과 Call stack으로 이루어져 있는데, 자바스크립트 엔진 자체는 콜스택에 쌓인 실행 컨텍스트에 따라 위에서부터 차례로 실행이 일어나는 곳이기 때문에 비동기 처리를 할 수 없다. 따라서 비동기 처리가 필요하게 될 경우, Node api를 통해 libuv 라이브러리에서 제공하는 비동기처리를 하게 된다.

Node.js는 싱글스레드 논블로킹 모델로 구성되어 있다. 하나의 스레드로 동작하지만, 비동기 I/O 작업을 통해 요청들을 서로 블로킹하지 않는 것이다. 즉, 동시에 많은 요청들을 비동기로 수행함으로써 싱글스레드일지라도 논블로킹이 가능하도록 구성할 수 있는 것이다.

post-custom-banner

0개의 댓글