ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 프로세스(Process)와 스레드(Thread)
    Java 2025. 11. 27. 19:03

     

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

    이 둘을 구분하는 가장 확실한 기준은 '메모리의 공유 여부'입니다.

    1) 프로세스 (Process)

    • 정의: 운영체제로부터 자원을 할당받은 '실행 중인 프로그램'의 단위입니다.
    • 핵심 특징:
      • 운영체제로부터 독립된 메모리 공간(Code, Data, Heap, Stack)을 할당받습니다. 
      • 하나의 프로세스가 죽어도 다른 프로세스에 영향을 주지 않습니다 (독립성).
      • 운영체제에서는 CPU, 메모리 등 자원을 할당받아 독립적으로 실행되는 작업의 단위입니다.

    2) 스레드 (Thread)

    • 정의: 하나의 프로세스 안에서 여러 개의 실행 흐름을 만들기 위한 단위입니다.
    • 핵심 특징:
      • 공유 영역: Code, Data, Heap 영역을 모든 쓰레드가 공유합니다.
      • 독립 영역: 각 쓰레드는 자신만의 StackPC(Program Counter), SP(Stack Pointer) 레지스터 값을 가집니다.
      • 하나의 스레드에 문제가 생기면(예: 예외 발생) 같은 프로세스 내의 다른 스레드들도 함께 종료될 수 있습니다.
      • CPU 입장에서 작업(스케줄링)의 단위입니다.

     

    2. 스레드와 프로세스의 메모리 구조 비교

    개발자로서 가장 중요한 차이점은 메모리 영역의 공유 범위입니다. 이를 이해해야 멀티스레딩 환경에서의 버그(동시성 문제)를 이해할 수 있습니다.

    1) 프로세스 (Process): 완벽한 격리 프로세스는 운영체제로부터 가상 메모리(Virtual Memory) 전체를 독립적으로 할당받습니다.

    • Code (Text): 실행할 프로그램의 코드가 저장되는 영역.
    • Data: 전역 변수(Global), 정적 변수(Static)가 저장되는 영역.
    • Heap: 런타임에 동적으로 할당되는 객체나 데이터가 저장되는 영역.
    • Stack: 함수 호출 시 지역 변수, 매개 변수, 리턴 주소 등이 저장되는 영역.
    • 특징: A 프로세스는 B 프로세스의 메모리 영역(Code~Stack)에 절대 접근할 수 없습니다. (운영체제의 메모리 보호 기능)

    2) 스레드 (Thread): 효율적인 공유와 독립 스레드는 프로세스라는 울타리 안에서 생성되므로, 프로세스의 자원을 최대한 활용합니다.

    • 공유 영역:
      • Code: 모든 스레드는 동일한 프로그램 코드를 실행하므로 공유합니다.
      • Data: 전역 변수나 Static 변수는 모든 스레드에서 공통으로 접근 가능합니다.
      • Heap: new 키워드 등으로 생성된 객체(데이터)는 모든 스레드가 공유합니다. 이로 인해 스레드 간 데이터 통신이 매우 쉽지만, 동시성 문제의 원인이 되기도 합니다.
    • 독립 영역:
      • Stack: 스레드는 독립적인 함수 호출 흐름을 가져야 합니다. 따라서 함수 실행을 위한 스택 영역은 스레드마다 별도로 할당됩니다.
      • PC (Program Counter) & Register: 각 스레드는 코드를 어디까지 실행했는지(문맥)를 따로 기억해야 하므로, 레지스터 값은 독립적으로 가집니다.

    3. 전체 시스템에서의 관계

    전체 컴퓨터 시스템을 놓고 보았을 때, 프로세스와 스레드는 포함 관계를 가집니다.

    • OS ↔ Process: 운영체제(OS)는 자원 할당의 단위로 프로세스를 관리합니다. OS는 프로세스에게 "너가 쓸 메모리 방(Address Space)은 여기부터 여기까지야"라고 공간을 내어줍니다.

    • Process ↔ Thread: 프로세스는 스레드의 컨테이너 역할을 합니다. 프로세스가 할당받은 메모리 공간 안에서 스레드들이 활동합니다. 최소 1개 이상의 스레드가 존재합니다.

    • CPU ↔ Thread: CPU 스케줄러는 프로세스가 아닌 스레드를 실행 단위로 봅니다. CPU는 "어떤 프로세스 소속인지"는 따지지 않고, 당장 실행해야 할 스레드(Task)를 가져와서 연산합니다.

    4. 메모리 구조로 인한 효과

    이러한 메모리 구조(공유 vs 독립) 차이로 인해 개발 실무에서 다음과 같은 효과가 발생합니다.

    1) 장점: 고효율과 빠른 통신

    • 통신 비용 절감: 스레드끼리는 별도의 통신 규약(IPC 등) 없이, 힙 영역의 변수에 접근하는 것만으로 즉시 데이터를 주고받을 수 있습니다.
    • 생성 및 전환 속도: 프로세스를 새로 만드는 것보다, 스택만 새로 할당하면 되는 스레드 생성이 훨씬 빠릅니다. 또한 공유하는 메모리(Code, Data, Heap) 덕분에 컨텍스트 스위칭 시 캐시 적중률(Cache Hit)이 높아 성능이 좋습니다.

    2) 단점 및 주의점: 안전성 문제와 동기화

    • 동시성 이슈 (Synchronization Issue): 여러 스레드가 힙 영역의 데이터(공유 자원)를 동시에 수정하려고 하면 데이터가 꼬이는 문제가 발생할 수 있습니다. 
    • 오류의 확산: 프로세스는 하나가 죽어도 나머지가 멀쩡하지만, 스레드는 공유 메모리를 쓰기 때문에 하나의 스레드가 잘못된 연산으로 예외를 발생시키면 프로세스 전체가 종료될 수 있습니다.
    •  

    요약 표

    구분 프로세스 (Process) 스레드 (Thread)

    정의 실행 중인 프로그램 프로세스 내 실행 흐름
    자원 공유 비공유 (완전 독립) 공유 (Stack/Register 제외)
    통신 비용 높음 (IPC 필요) 낮음 (메모리 직접 접근)
    오버헤드 큼 (생성/전환 비용 높음) 작음 (생성/전환 비용 낮음)
    안전성 높음 (하나 죽어도 영향 없음) 낮음 (하나 죽으면 프로세스 종료)

     

    'Java' 카테고리의 다른 글

    [Java] Sync vs Async  (0) 2025.12.01
    [Java] Blocking/Non-blocking이란?  (0) 2025.12.01
    [Java] JVM의 Runtime Data Area  (0) 2025.11.19
    [Java] JVM이 무엇이고 Java 코드는 어떻게 동작할까?  (0) 2025.11.18
    SOLID 원칙 완벽 정리  (3) 2025.06.18
Designed by MSJ.