← 목록으로
DEVLOG · education
2026-06-08

프로세스와 스레드

프로세스스레드

1. 프로세스(Process)와 스레드(Thread)의 정의

프로세스 (Process)

  • 정의: 운영체제로부터 시스템 자원을 할당받는 작업의 단위입니다.
  • 상태: 디스크에 파일로 저장되어 있던 프로그램이 메모리에 적재되어 CPU에 의해 실행되고 있는 동적인 상태를 의미합니다. 각 프로세스는 완전히 독립된 실행 환경을 가집니다.

스레드 (Thread)

  • 정의: 프로세스가 할당받은 자원을 이용하는 실행의 흐름 단위입니다.
  • 상태: 하나의 프로세스 내부에서 생성되어 동작하는 여러 개의 실행 경로를 말하며, 프로세스의 자원을 공유하면서 실질적인 연산과 비즈니스 로직을 수행합니다.

2. 프로세스와 스레드의 명확한 구분 (자원 공유 여부)

두 개념을 나누는 가장 결정적인 기준은 "메모리 자원을 독립적으로 가지는가, 혹은 공유하는가"입니다.

프로세스의 메모리 구조 (독립성)

  • 구조: 각 프로세스는 OS로부터 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 영역을 완전히 독립적으로 할당받습니다.
  • 접근 제한: 하나의 프로세스는 다른 프로세스의 메모리 공간에 직접 접근할 수 없습니다. 프로세스 간에 데이터를 주고받으려면 IPC(Inter-Process Communication, 예: 소켓, 파일, 공유 메모리)라는 별도의 무거운 메커니즘을 거쳐야 합니다.

스레드의 메모리 구조 (자원 공유)

  • 공유 영역: 하나의 프로세스 내에 존재하는 스레드들은 프로세스가 할당받은 코드(Code), 데이터(Data), 힙(Heap) 영역을 서로 공유합니다.
  • 독립 영역: 각 스레드는 독립적인 실행 흐름(함수 호출 및 명령 처리)을 유지하기 위해 스택(Stack) 영역과 현재 실행 중인 CPU 명령어 주소를 가리키는 PC 레지스터만 개별적으로 할당받습니다.
  • 효율성: 힙 영역과 데이터 영역을 공유하므로, 스레드 간 통신은 복잡한 절차 없이 전역 변수나 공용 객체를 통해 매우 빠르게 이루어집니다.

3. 멀티 프로세스 vs 멀티 스레드 개념

동일한 목적의 작업을 여러 개로 나누어 병렬 또는 동시 처리할 때, 아키텍처를 어떻게 구성하느냐에 따라 두 방식으로 나뉩니다.

멀티 프로세스 (Multi-processing)

하나의 프로그램을 여러 개의 독립된 프로세스로 구성하여 각각의 프로세스가 작업을 분담하는 방식입니다.

  • 장점: 각 프로세스가 독립된 메모리를 가지므로, 하나의 프로세스에 치명적인 에러가 발생해 죽더라도 다른 프로세스와 전체 서비스에 영향을 주지 않아 안정성이 높습니다. (예: 웹 브라우저의 멀티 탭 구조)
  • 단점: 컨텍스트 스위칭(Context Switching) 발생 시 CPU 레지스터뿐만 아니라 캐시 메모리 초기화 등 가상 메모리 테이블을 통째로 교체해야 하므로 오버헤드가 크고 자원 소모가 무겁습니다.

멀티 스레드 (Multi-threading)

하나의 프로세스를 다수의 스레드로 구성하여, 각 스레드가 하나의 작업을 분담하여 처리하는 방식입니다.

  • 장점: 프로세스를 새로 생성하는 것보다 스레드를 생성하는 것이 시스템 자원 소모가 훨씬 적습니다. 컨텍스트 스위칭 비용이 낮고, 자원을 공유하므로 데이터 교환 속도가 매우 빠릅니다.
  • 단점: 스레드들이 동일한 데이터(공유 자원)에 동시에 접근할 수 있기 때문에 동기화(Synchronization) 이슈, 교착 상태(Deadlock), 데이터 오염(Race Condition) 등의 동시성 문제를 개발자가 직접 제어해야 합니다. 또한, 하나의 스레드가 예외 처리에 실패해 강제 종료되면 해당 프로세스 전체가 함께 종료될 수 있는 취약점이 있습니다.

4. Java의 동시성 제어 모델 (멀티스레드)

Java는 언어 및 플랫폼 설계 단계부터 멀티스레드(Multi-threading) 개념을 기반으로 고안된 대표적인 언어입니다.

JVM 프로세스와 자바 스레드의 관계

자바 애플리케이션(JAR/WAR)을 구동하면 운영체제는 단 하나의 JVM(Java Virtual Machine) 프로세스를 메모리에 할당하여 실행합니다. 자바 프로그램 내부에서 발생하는 모든 다중 요청 및 병렬 연산은 이 하나의 JVM 프로세스 내부에서 스레드를 쪼개어 처리합니다.

  • 자원 공유 메커니즘: 자바의 모든 스레드는 JVM 내부의 공용 메모리인 힙(Heap) 영역과 메서드 영역(Method Area)을 공유합니다. 따라서 인스턴스(객체)를 주고받을 때 메모리 복사나 별도의 IPC를 거치지 않고 직접 자원을 참조합니다.
  • 동시성 도구의 표준화: 자바는 공유 메모리 접근에 따른 멀티스레드의 부작용을 막기 위해 synchronized, volatile 키워드를 제공하며, 실무 동시성 제어의 핵심인 java.util.concurrent 패키지(ThreadPoolExecutor, ConcurrentHashMap 등)를 기본 내장하고 있습니다.
  • 백엔드 실무 적용: 스프링 부트와 톰캣(Tomcat) 서버의 1스레드-1요청(One-Thread-Per-Connection) 모델이나, Netty 기반 WebFlux의 이벤트 루프 동시성 모델 모두 이 JVM 프로세스 내부에서 한정된 스레드 자원을 어떻게 효율적으로 관리하고 동기화할 것인지에 대한 방법론입니다.

참고: Java에서의 멀티프로세스

자바 코드 레벨에서 ProcessBuilder 클래스나 Runtime.getRuntime().exec()를 활용하면 OS 커널에 명령을 내려 외부의 독립된 별도 프로세스를 새로 생성하고 제어할 수 있습니다. 그러나 이는 자바 언어 자체의 동시성 모델이라기보다는, 외부의 다른 프로그램(예: 리눅스 쉘 스크립트, 이미지 가공 툴 등)을 호출하여 결과를 받아오는 프로세스 연동 기능에 해당합니다.

DISCUSSION

댓글

GitHub 계정으로 의견이나 질문을 남길 수 있습니다.

댓글 불러오는 중