변수의 기록

(OS) 자바 스레드의 상태 – OS 프로세스 상태 비교 본문

CS지식/운영체제 (Operating System)

(OS) 자바 스레드의 상태 – OS 프로세스 상태 비교

불광동 물주먹 2025. 4. 13. 01:08

 자바 스레드의 상태 – OS 프로세스와 어떻게 다를까?

멀티스레드 프로그래밍을 하다 보면, Runnable, Blocked, Waiting 같은 자바 스레드 상태들이 헷갈릴 수 있습니다.
운영체제(OS)의 프로세스 상태와도 비슷한 듯 다른 이 구조, 이번 글에서 명확하게 정리해보겠습니다.


1. OS의 프로세스 상태 (Process States in OS)

운영체제에서 프로세스는 기본적으로 다음과 같은 상태를 가집니다:

 

 

상태 설명
New 프로세스가 막 생성됨 (아직 실행 준비 X)
Ready 실행 준비 완료, CPU 할당을 기다림
Running CPU에서 실행 중
Waiting (Blocked) I/O 등 외부 자원을 기다리며 대기
Terminated 실행 완료 후 종료됨

 특징:

  • CPU 중심적인 상태 변화
  • 실행 준비 / 실행 중 / 자원 대기 상태 중심으로 설계됨

 

 

 

예시)

사용자 실행 → new  
        → ready  
                 → CPU 할당 → running  
        → (타임슬라이스 끝) → ready  
                → (다시 실행) → running  
        → (I/O 요청) → waiting  
        → (I/O 완료) → ready  
                →        running  
                       → exit → terminated

 

OS 프로세스 생명주기 – 상태 흐름으로 이해하기 (예시 - 메모장)


1. New 상태

  • 설명: 프로세스가 막 생성된 상태 (아직 실행 허가 전)
  • 예시: 사용자가 메모장 아이콘을 클릭해 실행을 요청한 순간
  • 전이: OS가 실행을 허가하면 Ready 상태로 전환 (admitted) 
    ** new 상태는 OS 마다 다름  리눅스는 거의 바로 ready로 상태 변경

2. Ready 상태

  • 설명: 실행에 필요한 자원을 할당받고, CPU만 기다리는 상태
  • 예시: 메모장, 계산기, 크롬 등 여러 프로세스가 실행 대기열에 있는 상태
  • 전이: 스케줄러가 CPU를 할당하면 Running 상태로 전환 

3. Running 상태

  • 설명: 실제로 CPU를 점유하여 명령어를 수행 중인 상태
  • 예시: 메모장에 입력 중, 계산기에서 연산 수행 중

상태 전이 분기

전이 원인 다음 상태설명 및 예시
타임슬라이스 종료 Ready 일정 시간 동안 실행한 뒤 CPU 반납 (interrupt)
I/O 요청 Waiting 디스크 읽기, 네트워크 응답 등 I/O 작업 요청 (I/O or event wait)
프로세스 종료 Terminated 모든 작업 완료 후 종료 (exit)

4. Waiting 상태

  • 설명: CPU를 사용하지 않고, I/O 등의 이벤트를 기다리는 상태
  • 예시: 사용자가 파일을 열었고, 디스크에서 데이터를 불러오는 중
  • 전이: 이벤트가 완료되면 다시 Ready 상태로 복귀 (I/O or event completion)

5. Terminated 상태

  • 설명: 프로세스 실행이 완료되어 종료된 상태. OS가 자원 회수 및 정리 수행
  • 예시: 메모장 종료, 실행 파일이 정상적으로 끝난 상태

 2. 자바의 스레드 상태 (Thread States in Java)

자바는 좀 더 객체지향적이고 고수준의 개념으로 스레드 상태를 정의.
총 6가지로 구성되어 있으며, wait/notify, sleep, 락 획득 대기 등 다양한 동기화 상황까지 포괄.

 

상태 설명
New Thread 객체가 생성되었으나 아직 start()되지 않은 상태
Runnable 실행 준비 완료 → JVM은 OS 스케줄러에 맡김
실제로 CPU를 점유 중이거나 점유 대기 중
Blocked synchronized 블록(모니터락)을 점유하려다 다른 스레드가 이미 점유 중이라 대기 중인 상태
Waiting 다른 스레드의 작업을 무기한 기다리는 상태
ex) Object.wait(), Thread.join()
Timed Waiting 일정 시간만 대기 후 자동 해제됨
ex) Thread.sleep(), join(timeout), wait(timeout)
Terminated 스레드 실행 종료

 

 

 

 


 자바 스레드 상태별 핵심 개념 정리

🔸 Runnable

  • 실제 CPU에서 실행 중이거나, 실행 대기 중
  • OS의 Ready + Running 상태와 유사
  • synchronized 블록 외에서는 대부분 이 상태

🔸 Blocked

  • 다른 스레드가 모니터락을 점유 중일 때,
    해당 락을 기다리며 진입 불가 → Blocked
  • ex) synchronized 진입 실패 시

🔸 Waiting

  • 다른 스레드의 signal 없이 절대 깨어나지 않음
  • ex) obj.wait(), Thread.join()

🔸 Timed Waiting

  • 일정 시간이 지나면 자동 복귀
  • ex) sleep(1000), wait(5000)

🔸 New & Terminated

  • 시작 전과 종료 후 상태로, OS 개념과 동일

 synchronized와 모니터(Monitor)의 관계

자바에서 synchronized는 **객체에 내장된 모니터락(Monitor Lock)**을 사용하는 구조입니다.

  • 객체 단위로 **뮤텍스(Mutex)**가 존재한다고 보면 됨
  • synchronized 진입 시 → 해당 객체의 모니터 락을 획득
  • 이미 다른 스레드가 모니터를 점유 중이면 → Blocked 상태로 대기

📌 그래서 흔히 말하는:

"뮤텍스를 쥐고 간다" = 객체의 모니터 락을 점유했다는 뜻입니다.


✅ OS 상태와 자바 상태 비교 정리

  

 

구분 OS 프로세스 상태 자바 스레드 상태   대응
시작 전 New New
실행 대기 Ready Runnable
실행 중 Running Runnable ✔ (JVM+OS 스케줄링 포함)
자원 대기 Waiting Waiting / Timed Waiting / Blocked ✔ (더 세분화됨)
종료 Terminated Terminated

 

자바와 디테일한 비교

 

상태 설명 OS 상태와의 비교 예시
New Thread t = new Thread(); 생성됨 (아직 start() 안됨) OS: New 객체만 존재, 실행 요청 전
Runnable 실행 준비 완료 or 실행 중 (JVM이 스케줄러에게 맡김) OS: Ready + Running 통합 개념 start() 호출됨, CPU 점유 여부는 JVM/OS에 따라
Blocked synchronized 사용 중 다른 스레드가 락을 점유 중이라 진입 실패 → 대기 OS: Waiting (락 대기) synchronized(lock) 진입 못함
Waiting 무한 대기 (wait(), join() 등) → 다른 스레드가 신호 주기 전까지 깨어나지 않음 OS: Waiting Thread.join(), obj.wait()
Timed Waiting 제한 시간 동안 대기, 이후 자동 복귀 OS: Waiting sleep(1000), join(5000), wait(1000)
Terminated 스레드 실행 종료됨 OS: Terminated run() 메서드 종료됨

 

 

 

 마무리

자바는 OS의 스케줄링 개념 위에, **자바 내부의 동기화 구조 (wait/notify, synchronized 등)**를 덧붙여
스레드 상태를 더 세밀하게 표현합니다.

이해 포인트는 다음과 같습니다:

  • Runnable은 CPU 실행 중일 수도 있고 아닐 수도 있음
  • Blocked는 락(모니터) 점유 실패로 인한 대기 상태
  • Waiting / Timed Waiting은 다른 스레드의 완료나 시간 제한을 기다리는 상태
  • synchronized는 객체 단위로 모니터락을 이용한 **상호배제(Mutual Exclusion)**의 대표적인 구현