프로세스(Process)와 쓰레드(Thread)는 컴퓨터 과학에서 중요한 개념입니다. 이 둘은 다중 작업(multitasking) 환경에서 프로그램이 실행되는 방식을 설명합니다.
프로세스는 실행 중인 프로그램의 인스턴스(instance)입니다. 각 프로세스는 독립적으로 메모리 공간을 할당받고, 운영체제(OS)의 자원을 사용합니다.
각각의 프로세스는 운영체제에 의해 개별적으로 관리되며, 다른 프로세스와는 독립적으로 실행됩니다. 이는 한 프로세스가 다른 프로세스에게 영향을 미치지 않고 실행될 수 있음을 의미합니다.
프로세스는 각각 자신만의 주소 공간(address space)을 가지며, 다른 프로세스와 데이터를 공유하기 위해서는 IPC(Inter-Process Communication)와 같은 메커니즘이 필요합니다.
새로운 프로세스를 생성하기 위해서는 새로운 메모리 공간을 할당하고, 프로그램을 로드하고 초기화하는 등의 오버헤드가 발생합니다.
쓰레드는 프로세스 내에서 실행되는 흐름의 단위입니다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있습니다.
쓰레드는 같은 프로세스 내에서 공유된 메모리 공간을 사용하므로, 데이터를 공유하기가 훨씬 쉽고 빠릅니다.
쓰레드는 프로세스의 다른 쓰레드와는 달리 자원을 공유하므로, 쓰레드 간의 통신과 동기화가 필요합니다.
쓰레드를 생성하거나 종료하는 오버헤드는 프로세스에 비해 상대적으로 적습니다.
자바스크립트는 주로 싱글 스레드(single-threaded)로 알려져 있습니다. 이것은 자바스크립트 엔진이 단일 호출 스택(single call stack)을 사용하여 코드를 실행한다는 것을 의미합니다.
싱글 스레드 모델에서는 한 번에 하나의 작업만을 처리할 수 있습니다. 이는 한 번에 하나의 작업이 완료될 때까지 다음 작업을 실행할 수 없음을 의미합니다. 따라서 자바스크립트는 이러한 특성으로 인해 이벤트 루프(event loop)와 비동기(asynchronous) 프로그래밍 패턴을 사용하여 비동기 작업을 처리합니다.
이벤트 루프는 이벤트 큐(event queue)에서 이벤트를 받아와서 실행 스택이 비어있는 동안 실행하는 역할을 합니다. 이를 통해 비동기 작업(예: 타임아웃 함수, 이벤트 핸들러 등)을 처리할 수 있게 됩니다. 이렇게 함으로써 자바스크립트는 싱글 스레드로서도 비동기적인 작업을 처리할 수 있습니다.
노드.js(Node.js)는 기본적으로 싱글 스레드(single-threaded)입니다. 이것은 자바스크립트 코드를 실행하는 메인 스레드가 하나뿐이라는 것을 의미합니다. 따라서 노드.js 애플리케이션은 주로 단일 호출 스택(single call stack)을 사용하여 코드를 실행합니다.
그러나 노드.js는 싱글 스레드 모델에도 불구하고 I/O 작업과 같은 비동기(asyncronous) 작업을 지원합니다. (Node.js에서의 I/O 작업은 주로 파일 시스템 접근, 네트워크 통신, 데이터베이스 액세스 등과 관련이 있다.) 이를 통해 논블로킹(non-blocking) 방식으로 동작하여 이를 위해 이벤트 루프(event loop)와 콜백(callback) 함수를 활용합니다. 이를 통해 많은 수의 동시 요청을 효율적으로 처리할 수 있습니다.
또한 최근 버전의 노드.js에서는 웹 워커(Web Workers)와 같은 기술을 사용하여 멀티 스레딩을 지원하기도 합니다. 웹 워커를 사용하면 추가적인 스레드를 생성하여 병렬로 작업을 처리할 수 있습니다. 하지만 이러한 멀티 스레딩은 일반적으로 노드.js의 주 메인 스레드와는 별도로 동작하므로, 기본적으로는 노드.js는 여전히 싱글 스레드 기반의 환경으로 간주됩니다.
블로킹(Blocked)과 논 블로킹(Non-Blocking)은 주로 I/O 작업을 처리하는 방식에 관련된 용어입니다. 블로킹(Blocking)은 작업이 완료될 때까지 프로그램의 실행이 중지되는 상태를 의미합니다. 예를 들어, 파일을 읽는 동안 블로킹 작업이 발생하면, 프로그램은 파일 읽기가 완료될 때까지 다음 작업을 수행할 수 없습니다. 대기 시간 동안 CPU 자원이 낭비되는 단점이 있습니다.
전통적인 동기적인 I/O 작업은 대부분 블로킹 방식으로 동작합니다.
논 블로킹(Non-Blocking)은 작업이 완료되지 않아도 프로그램의 실행이 중단되지 않는 상태를 의미합니다. 비동기적인 논 블로킹 I/O 작업은 호출한 후에 바로 다음 코드를 실행하며, 작업이 완료되면 콜백 함수나 프로미스를 통해 결과를 처리합니다. 논 블로킹 방식은 대기 시간 동안 CPU를 유휴 상태로 만들지 않고 다른 작업을 수행할 수 있으므로, 시스템 자원을 효율적으로 활용할 수 있습니다. 논 블로킹 방식은 대부분의 현대적인 비동기적 프로그래밍 모델에서 사용되며, 특히 네트워크와 파일 시스템과 같은 I/O 작업에서 주로 사용됩니다. 이를 통해 프로그램은 여러 작업을 동시에 처리하고, I/O 작업이 완료될 때까지 기다리는 동안 다른 작업을 수행할 수 있습니다.
멀티 스레드와 싱글 스레드는 프로그램이 동작하는 방식에 대한 중요한 차이가 있습니다. 아래에서 각각의 개념을 자세히 설명하겠습니다.
싱글 스레드 (Single-threaded):
멀티 스레드 (Multi-threaded):
주요 차이점:
싱글 스레드는 단순하고 이해하기 쉽지만, 멀티 스레드는 병렬 처리를 통해 성능을 향상시킬 수 있으며, 여러 작업을 동시에 처리할 수 있는 장점이 있습니다. 그러나 멀티 스레드를 사용할 때는 동기화와 관련된 복잡성을 고려해야 합니다.