운영체제(OS)에서 하나의 프로그램은 프로세스(Process)로 실행됩니다.
프로세스 내부에는 실행 단위인 스레드(Thread)가 존재하며, 여러 개의 프로세스를 동시에 실행하는 방식을 멀티프로세스(Multi-Process) 하나의 프로세스 내에서 여러 개의 스레드를 실행하는 방식을 멀티스레드(Multi-Thread)라고 합니다.
멀티프로세스는 여러 개의 프로세스를 동시에 실행하는 방식입니다.
import java.io.IOException;
public class MultiProcessExample {
public static void main(String[] args) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder("notepad.exe"); // 새 프로세스 실행
Process process = processBuilder.start();
System.out.println("프로세스 실행: " + process);
}
}
멀티스레드는 하나의 프로세스 내에서 여러 개의 스레드를 실행하는 방식입니다.
synchronized, Lock 등을 사용해야 함 class MyThread extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName() + " 실행 중");
}
}
public class MultiThreadExample {
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start();
thread2.start();
}
}
| 비교 항목 | 멀티프로세스 (Multi-Process) | 멀티스레드 (Multi-Thread) |
|---|---|---|
| 메모리 구조 | 각각 독립된 메모리 사용 | 하나의 프로세스 내에서 메모리 공유 |
| 프로세스 간 통신 | IPC 사용 (오버헤드 큼) | 공유 메모리를 사용 (빠름) |
| 오류 영향도 | 한 프로세스가 죽어도 영향 없음 | 하나의 스레드 오류 시 전체 영향 |
| 자원 사용 | 더 많은 메모리 사용 | 상대적으로 적은 메모리 사용 |
| 문맥 전환 비용 | 높음 (프로세스 간 전환 비용) | 낮음 (스레드 전환 비용) |
| 안정성 | 독립적인 실행 환경 제공 | 동기화 문제 발생 가능 |
멀티프로세스와 멀티스레드는 각각의 장단점이 명확하기 때문에 상황에 따라 적절히 선택하는 것이 중요하다는 점을 배웠습니다.
멀티스레드는 빠른 처리와 메모리 절약이 가능하지만 동기화 문제를 고려해야 하며 멀티프로세스는 독립적인 실행이 가능하지만 메모리 사용량이 많고 통신 비용이 높다는 단점이 있었습니다.
실제 프로젝트에서 Spring Boot는 기본적으로 멀티스레드 기반으로 동작하며 Nginx와 같은 웹 서버는 멀티프로세스를 활용하는 방식도 알게 되었습니다.