프로세스(process)와 스레드(thread)는 컴퓨터 프로그램의 실행 단위로, 운영 체제(OS)가 프로그램을 실행하고 관리하는 중요한 개념이다. 프로세스와 스레드는 서로 다른 개념이지만, 긴밀하게 연관되어 있으며, 둘 다 병렬 처리나 멀티태스킹 환경에서 중요한 역할을 한다.
1. 프로세스 (Process)
프로세스란?
- 프로세스는 메모리에서 실행 중인 프로그램이다. 프로그램은 디스크에 저장된 정적인 파일이며, 프로세스는 이 프로그램이 실행되었을 때 생성되는 동적인 실행 단위이다.
- 운영 체제는 각 프로그램이 독립적인 실행 환경을 가지도록 프로세스를 생성하고, 프로세스는 해당 프로그램이 동작하는데 필요한 자원을 할당받는다. 이러한 자원에는 CPU 시간, 메모리 공간, 파일 입출력 핸들 등이 포함된다.
프로세스의 특징
- 독립성: 각 프로세스는 운영 체제로부터 독립된 메모리 공간과 자원을 할당받으며, 다른 프로세스와 직접적인 메모리 공간을 공유하지 않는다.
- 메모리 구획: 각 프로세스는 고유한 주소 공간을 가지고, 다른 프로세스와 물리적으로 메모리를 공유하지 않기 때문에 한 프로세스가 다른 프로세스의 메모리를 침범하는 일이 없다.
- 다중 프로세스: 현대 운영 체제는 멀티태스킹을 지원하여 여러 프로세스가 동시에 실행되도록 한다. 하지만 동시에 실행된다고 해도, 실제로는 운영 체제가 매우 빠르게 프로세스를 번갈아가며 실행하여 동시에 실행되는 것처럼 보이게 한다.
프로세스의 구조
프로세스는 다음과 같은 메모리 영역을 가지고 있다:
- 코드 영역 (Text Section): 프로그램의 실제 실행 코드가 저장되는 영역이다. 예를 들어, 함수의 코드나 명령어들이 이 영역에 저장된다.
- 데이터 영역 (Data Section): 전역 변수와 정적 변수가 저장되는 영역이다. 프로세스가 시작될 때 할당된다.
- 힙 영역 (Heap Section): 런타임 중 동적으로 할당되는 메모리가 저장되는 영역이다. 예를 들어, 동적 메모리 할당(malloc, new)을 통해 생성된 데이터는 힙에 저장된다.
- 스택 영역 (Stack Section): 함수 호출 시 지역 변수, 매개변수, 리턴 주소 등이 저장되는 메모리 영역이다. 함수 호출과 함께 스택이 쌓였다가, 함수가 종료되면 스택이 해제된다.
프로세스 상태
운영 체제는 각 프로세스를 다음과 같은 여러 상태로 관리한다:
- 생성 (New): 프로세스가 생성 중인 상태.
- 준비 (Ready): 프로세스가 CPU 할당을 기다리는 상태.
- 실행 (Running): 프로세스가 CPU에서 실제로 실행되고 있는 상태.
- 대기 (Waiting or Blocked): 프로세스가 어떤 이벤트(예: 입출력 작업)가 완료되기를 기다리는 상태.
- 종료 (Terminated): 프로세스의 실행이 끝난 상태.
프로세스 간 통신 (IPC, Inter-Process Communication)
서로 다른 프로세스는 독립적인 메모리 공간을 가지기 때문에, 데이터를 공유하거나 소통하려면 특별한 방식의 프로세스 간 통신 기법이 필요하다. IPC 방식에는 다음이 있다:
- 파이프 (Pipes): 한 프로세스가 데이터를 쓰고, 다른 프로세스가 이를 읽는 방식.
- 메시지 큐 (Message Queue): 프로세스 간 메시지를 주고받을 수 있는 큐.
- 공유 메모리 (Shared Memory): 프로세스 간 특정 메모리 영역을 공유하여 데이터를 주고받음.
- 소켓 (Sockets): 네트워크를 통해 프로세스가 데이터를 교환하는 방식.
2. 스레드 (Thread)
스레드란?
- 스레드는 프로세스 내에서 실행되는 작은 실행 단위이다. 각 프로세스는 하나 이상의 스레드를 가질 수 있으며, 이를 통해 병렬 작업을 수행할 수 있다.
- 스레드는 프로세스의 자원을 공유하면서 독립적으로 실행된다. 즉, 같은 프로세스 내의 스레드는 동일한 메모리 공간(코드, 데이터, 힙)을 공유한다.
스레드의 특징
- 경량화된 실행 단위: 스레드는 프로세스에 비해 더 가볍다. 새로운 스레드를 생성하는 데 필요한 비용이 적고, 스레드 간 전환이 빠르다.
- 자원 공유: 같은 프로세스 내의 스레드는 메모리(코드, 데이터, 힙)를 공유한다. 이로 인해 스레드 간 통신이 더 빠르지만, 동시에 데이터 접근의 동기화 문제가 발생할 수 있다.
- 병렬성: 멀티코어 시스템에서는 스레드가 병렬로 실행될 수 있다. 다중 스레드를 사용하면 프로세스의 여러 작업을 동시에 처리할 수 있다.
스레드의 구조
스레드는 프로세스 내에서 스택과 레지스터를 따로 가지고, 다른 자원(코드, 데이터, 힙)은 공유한다. 즉, 스레드는 고유한 스택을 가지지만, 프로세스의 힙 메모리, 전역 변수 등은 공유한다.
스레드의 장점과 단점
- 장점:
- 프로세스 간의 통신보다 더 빠른 스레드 간 통신이 가능한다.
- 스레드는 같은 프로세스의 메모리 공간을 공유하기 때문에, 프로세스보다 생성과 종료가 빠르고, 더 적은 자원이 필요하다.
- 멀티스레드를 사용하면 응답성이 높아지고, CPU 자원을 더 효율적으로 사용할 수 있다.
- 단점:
- 동기화 문제: 스레드는 메모리와 자원을 공유하기 때문에, 여러 스레드가 동시에 동일한 자원에 접근하면 경쟁 조건(race condition)이나 데드락(deadlock) 같은 동기화 문제가 발생할 수 있다.
- 디버깅이 어렵다: 멀티스레드 환경에서는 문제의 발생 원인을 추적하고 해결하는 것이 복잡할 수 있다.
스레드 상태
스레드의 상태는 프로세스와 비슷하게 여러 상태로 나뉜다:
- 생성 (New): 스레드가 생성된 상태.
- 준비 (Ready): 실행할 준비가 된 상태.
- 실행 (Running): CPU에서 실행 중인 상태.
- 대기 (Waiting): 입출력 작업 등으로 인해 대기 상태에 있는 스레드.
- 종료 (Terminated): 스레드의 실행이 종료된 상태.
스레드 동기화
스레드는 자원을 공유하므로, 데이터 일관성을 유지하기 위해 동기화가 필요하다. 이를 위해 다음과 같은 기법을 사용할 수 있다:
- 뮤텍스 (Mutex): 한 번에 하나의 스레드만이 자원에 접근할 수 있도록 하는 잠금 방식이다.
- 세마포어 (Semaphore): 제한된 개수의 스레드가 자원에 접근할 수 있도록 하는 동기화 도구이다.
- 모니터 (Monitor): 뮤텍스와 조건 변수를 결합하여 스레드 동기화를 관리하는 고급 기법이다.
3. 프로세스와 스레드의 비교
특징 | 프로세스 (Process) | 스레드 (Thread) |
기본 개념 | 독립적으로 실행되는 프로그램의 인스턴스 | 프로세스 내에서 실행되는 작업 단위 |
자원 공유 | 각 프로세스는 독립된 메모리 공간을 가짐 | 같은 프로세스 내에서 메모리와 자원을 공유 |
메모리 구조 | 독립적인 메모리 공간 (코드, 데이터, 힙, 스택) | 스택은 개별적으로, 코드/데이터/힙은 공유 |
생성 비용 | 높은 비용 (운영체제가 새로운 자원 할당 필요) | 낮은 비용 (기존 자원을 공유함) |
통신 방법 | IPC (프로세스 간 통신) 필요 | 메모리 공유로 인해 더 빠른 통신 가능 |
중단 시 영향 | 하나의 프로세스가 중단되면 다른 프로세스에 영향 없음 | 한 스레드의 오류가 프로세스 전체에 영향을 미침 |
사용 사례 | 서로 독립적인 작업을 수행할 때 사용 | 작업을 병렬로 처리하거나 작업을 분할할 때 사용 |
4. 멀티프로세스와 멀티스레드
멀티프로세스 (Multi-Process)
멀티프로세스는 여러 프로세스를 동시에 실행하여 병렬 처리를 하는 방법이다. 각 프로세스는 독립된 메모리 공간을 가지므로, 하나의 프로세스가 실패하더라도 다른 프로세스에는 영향을 주지 않는다.
- 장점:
- 안정성: 한 프로세스가 충돌하거나 오류가 발생해도, 다른 프로세스는 영향을 받지 않기 때문에 시스템이 안정적이다.
- 자원 보호: 각 프로세스는 독립적인 메모리 공간을 사용하므로, 자원 보호가 용이하다.
- 단점:
- 높은 자원 소모: 각 프로세스는 독립적인 메모리 공간을 차지하므로, 메모리 및 CPU 자원을 많이 소비한다.
- 통신 비용: 프로세스 간 통신(IPC)은 상대적으로 비용이 높고 복잡하다.
멀티스레드 (Multi-Thread)
멀티스레드는 하나의 프로세스 내에서 여러 스레드를 실행하여 병렬 처리를 하는 방법이다. 스레드는 프로세스의 자원을 공유하므로, 스레드 간 통신이 더 빠르고 효율적이다.
- 장점:
- 자원 절약: 같은 프로세스 내에서 자원을 공유하므로, 메모리와 CPU를 더 효율적으로 사용할 수 있다.
- 빠른 통신: 스레드 간 통신은 메모리 공유를 통해 이루어지므로, 프로세스 간 통신보다 훨씬 빠르다.
- 단점:
- 동기화 문제: 자원을 공유하기 때문에, 여러 스레드가 동시에 같은 자원에 접근하면 동기화 문제(경쟁 상태, 데드락)가 발생할 수 있다.
- 안정성: 한 스레드가 오류를 일으키면, 전체 프로세스에 영향을 줄 수 있다.
- 프로세스는 운영 체제에서 독립적으로 실행되는 프로그램 인스턴스로, 각기 다른 메모리 공간을 가지고 운영된다. 프로세스는 자원을 독립적으로 사용하며, 안정성이 높은 반면, 프로세스 간 통신 비용이 높다.
- 스레드는 프로세스 내에서 병렬로 실행되는 작은 실행 단위로, 같은 프로세스 내에서 자원을 공유하고 빠르게 통신할 수 있다. 멀티스레드는 자원 절약과 빠른 병렬 처리가 가능하지만, 동기화 문제가 발생할 수 있다.
이 두 개념은 병렬 처리와 효율적인 자원 관리에 중요한 역할을 하며, 각각의 장단점을 고려하여 적절한 방식으로 시스템에 적용해야 한다.
'Backend study > Backend theory' 카테고리의 다른 글
Blocking과 Non-blocking (2) | 2024.09.18 |
---|---|
경쟁 조건(Race Condition)과 교착 상태(Deadlock) (0) | 2024.09.17 |
HTTP와 HTTPS (1) | 2024.09.15 |
VPN, Port Forwarding, DNS, DDNS (0) | 2024.09.14 |
HTTP Content-Type (1) | 2024.09.13 |