프로세스와 쓰레드는 모두 프로그램의 실행을 위한 단위이지만, 그 목적과 사용 방식이 다릅니다.
메모리와 자원 할당
- 프로세스는 운영체제로부터 독립적인 메모리 공간을 할당받습니다. 따라서 각 프로세스는 다른 프로세스의 메모리에 접근할 수 없습니다. 이는 보안과 안정성 측면에서 유리합니다.
- 쓰레드는 같은 프로세스 내에서 메모리를 공유합니다. 이로 인해 쓰레드는 메모리 사용이 효율적이며, 프로세스 내의 다른 쓰레드와 빠르게 데이터를 주고받을 수 있습니다.
오버헤드
- 프로세스 간 전환에는 많은 오버헤드가 발생합니다. 새로운 프로세스를 생성하거나, 프로세스 간의 문맥 전환(Context Switching)에는 많은 시간이 필요합니다. 프로세스 전환 시에는 운영체제가 현재 실행 중인 프로세스의 상태를 저장하고, 새로운 프로세스의 상태를 로드해야 하므로 많은 비용이 듭니다.
- 쓰레드는 프로세스 내에서 실행되므로, 문맥 전환 시 오버헤드가 적습니다. 또한 쓰레드 생성 및 관리 비용이 프로세스에 비해 낮습니다.
멀티 프로세스는 여러 프로세스를 병렬로 실행하는 방식입니다. 각 프로세스는 독립적이기 때문에 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스에는 영향을 미치지 않습니다.
예를 들어, 웹 서버에서 클라이언트 요청마다 새로운 프로세스를 생성하여 처리하는 방식이 멀티 프로세스 구조입니다. 각 요청은 독립된 프로세스로 처리되므로 안정성이 높습니다.
하지만 프로세스 간의 메모리 공유가 불가능하기 때문에, 프로세스 간 통신(예: 파이프, 메시지 큐 등)이 필요하며, 이로 인해 추가적인 오버헤드가 발생할 수 있습니다.
멀티 쓰레드는 하나의 프로세스 내에서 여러 쓰레드를 병렬로 실행하여 작업을 나누어 처리하는 방식입니다. 쓰레드 간에는 메모리와 자원을 공유하기 때문에 메모리 사용이 적고 효율적입니다.
예를 들어, 게임 프로그램에서 그래픽 렌더링, 사용자 입력 처리, 네트워크 통신 등을 각각의 쓰레드가 병렬로 수행할 수 있습니다.
하지만 쓰레드 간 자원을 공유하기 때문에 동기화 문제가 발생할 수 있으며, 이를 해결하지 않으면 데드락(Deadlock)이나 경쟁 상태(Race Condition)가 발생할 위험이 있습니다.
쓰레드 풀은 미리 일정 수의 쓰레드를 생성하여 관리하고, 작업 요청이 들어올 때마다 이 쓰레드를 할당하여 작업을 처리하는 방식입니다.
쓰레드 풀은 새로운 쓰레드를 생성하거나 소멸시키는 비용을 절감하며, 동시에 너무 많은 쓰레드를 생성해 시스템 성능이 저하되는 것을 방지합니다.
자원 절약: 쓰레드를 생성하고 제거하는 작업은 비용이 많이 드는 작업입니다. 쓰레드 풀을 사용하면 이러한 비용을 줄일 수 있으며, 효율적인 자원 관리를 가능하게 합니다.
성능 향상: 특히 대규모 서버에서는 매 요청마다 새로운 쓰레드를 생성하면 시스템 리소스가 과도하게 사용될 수 있습니다. 쓰레드 풀을 사용하면 미리 생성된 쓰레드를 재사용하여 요청을 빠르게 처리할 수 있습니다.
안정성: 쓰레드 풀은 풀에 포함된 쓰레드의 수를 제한하여, 시스템의 성능을 초과하지 않도록 관리할 수 있습니다. 이를 통해 과도한 쓰레드 생성으로 인한 성능 저하를 방지할 수 있습니다.
장점
성능 개선: 미리 생성된 쓰레드를 재사용하므로 새로운 쓰레드를 생성하고 파괴하는 시간과 자원을 절약할 수 있습니다.
자원 관리: 사용 가능한 쓰레드 수를 제한하여 시스템 자원의 과도한 사용을 방지합니다. 이를 통해 안정성을 확보할 수 있습니다.
단점
동시성은 여러 작업이 동시에 진행되는 것처럼 보이도록 처리하는 것을 의미합니다. 단일 CPU 환경에서도 여러 작업을 빠르게 전환하면서 실행하여 여러 작업이 동시에 이루어지는 것처럼 보이게 만듭니다.
멀티태스킹의 개념으로 이해할 수 있으며, 주로 단일 코어에서 여러 작업을 처리할 때 사용됩니다. 이때 CPU는 실제로 한 번에 하나의 작업만 처리하지만, 작업 전환이 매우 빠르기 때문에 사용자에게는 여러 작업이 동시에 실행되는 것처럼 보입니다.
병렬성은 실제로 여러 작업을 동시에 처리하는 것을 의미합니다. 멀티코어 프로세서에서 각 코어가 다른 작업을 동시에 수행하여 병렬 처리가 이루어집니다.
예를 들어, 비디오 렌더링 작업에서는 각 프레임을 별도의 코어에서 동시에 처리할 수 있어 작업 시간이 크게 단축됩니다.
병렬성은 데이터 처리의 속도를 높이고, 효율적인 작업 분배를 통해 성능을 극대화할 수 있습니다.
동시성과 병렬성은 모두 성능을 향상시키기 위한 중요한 개념이며, 현대의 컴퓨터 시스템에서는 이 두 가지가 함께 사용됩니다. 예를 들어, 웹 서버는 여러 요청을 동시적으로 처리하면서도, 각 요청의 일부 작업을 병렬로 수행하여 전체적인 처리 속도를 높입니다.