CS

프로세스/스레드 상태 변화

kyoulho 2024. 8. 11. 20:13

프로세스 상태 변화

프로세스 상태 변화는 운영체제에서 프로세스가 생성되고 종료될 때까지의 다양한 상태 전환을 설명하는 개념이다. 프로세스는 여러 가지 이유로 상태가 변할 수 있으며, 이러한 상태 변화는 운영체제의 스케줄링 및 자원 관리와 밀접하게 연관되어 있다.

 

프로세스 상태

상태 설명
New (생성) - 새로운 프로세스가 생성된 상태
- 이 상태에서 프로세스는 아직 큐에 들어가지 않았으며, 필요한 초기화 작업이 진행중이다.
Ready (준비) - 프로세스가 실행될 준비가 된 상태
- 여러 프로세스가 이 상태에 있을 수 있으며, 이들 중 하나가 스케줄러에 의해 선택되어 실행된다.
Running (실행) - 프로세스가 CPU를 할당받아 실제로 실행 중인 상태
- 이 상태에서 프로세스는 CPU에서 명령을 수행한다.
Waiting (대기) - 프로세스가 어떤 조건이 충족되기를 기다리는 상태
- 보통 I/O 작업의 완료 또는 이벤트 발생을 기다리는 경우에 이 상태로 전환된다.
Terminated (종료) - 프로세스가 모든 작업을 완료하고 종료된 상태
- 운영체제는 이 상태에서 프로세스의 자원을 해제하고, 프로세스를 시스템에서 제거한다.

 

상태 전이와 관련된 이벤트

이벤트 설명
Interrupt
(인터럽트)
- 실행 중인 프로세스가 강제로 중단되고, CPU 제어권이 운영체제로 넘어가는 상황이다.
- 이는 타이머 인터럽트나 시스템 호출, 입출력 완료 등의 이유로 발생할 수 있으며,
  프로세스는 Running 상태에서 Ready 상태로 전환된다.
Scheduler Dispatch
(스케줄러 디스패치)
- 스케줄러가 Ready 상태에 있는 프로세스 중 하나를 선택하여 CPU를 할당하는 과정이다.
- 이로 인해 프로세스는 Ready 상태에서 Running 상태로 전환된다.
I/O or Event Wait
(I/O 또는 이벤트 대기)
- 프로세스가 실행 중 I/O 작업을 요청하거나 특정 이벤트를 기다려야 할 때,
   Running 상태에서 Waiting 상태로 전환된다.

- 이 상태에서는 프로세스가 요청한 작업이 완료될 때까지 기다린다.
I/O or Event Completion
(I/O 또는 이벤트 완료)
- 대기 중이던 I/O 작업이나 이벤트가 완료되면,
   프로세스는 Waiting 상태에서 Ready 상태로 전환된다.

- 이제 다시 CPU를 할당받을 준비가 된 상태가 된다.
Exit (종료) - 프로세스가 모든 작업을 완료하거나 강제 종료 명령을 받으면,
   Running 상태에서 Terminated 상태로 전환된다.

- 이 상태에서 운영체제는 프로세스의 자원을 정리하고 해제한다.

 

프로세스 상태 변화 요약

  • New → Ready: 프로세스가 생성되어 준비 큐에 들어감.
  • Ready → Running: 스케줄러가 프로세스에 CPU를 할당.
  • Running → Waiting: I/O 요청이나 이벤트 대기를 위해 실행 중단.
  • Waiting → Ready: 대기하던 I/O나 이벤트가 완료되어 준비 상태로 전환.
  • Running → Ready: 인터럽트로 인해 실행이 중단되고 준비 상태로 전환.
  • Running → Terminated: 프로세스가 종료됨.

 

자바 스레드의 상태 변화

자바에서는 스레드가 여러 가지 이유로 상태가 변할 수 있으며, 이러한 상태들은 Thread.State 열거형(enum)으로 정의되어 있다.

 

자바 스레드의 상태

상태 설명
New
(새로 생성된 상태)
-스레드가 생성되었지만 아직 start() 메서드가 호출되지 않은 상태이다.
-이 상태에서는 스레드가 실행되지 않으며, 단지 객체만 생성된 상태이다.
Runnable
(실행 가능한 상태)
- 스레드가 실행 중이거나, 실행을 위해 준비된 상태이다.
-
start() 메서드가 호출되면 스레드는 이 상태로 전환된다.
- 이 상태에서 스레드는 CPU에 의해 선택되면 실제로 실행된다.
- 자바에서는 
Runnable 상태가 운영체제의 Running 상태와 Ready 상태를 포함하는 개념이다.
Blocked
(블로킹된 상태)
- 스레드가 실행 중이던 중에 특정 리소스(예: 모니터 락)를 얻기 위해 대기하는 상태이다.
- 다른 스레드가 모니터 락을 해제하면, 블로킹된 스레드는 다시 Runnable 상태로 전환된다
- 예:
 synchronized 블록에 진입하려고 할 때 다른 스레드가 해당 락을 이미 소유하고 있다면, 현재 스레드는 Blocked 상태가 된다.
Waiting
(대기 상태)
- 스레드가 특정 조건이 만족되기를 기다리며 대기하는 상태이다.
- 이 상태에서는 다른 스레드에 의해 깨워질 때까지 무기한 대기한다.

- Object.wait(), Thread.join(), LockSupport.park() 메서드를 호출하면 스레드는 Waiting 상태로 전환된다.
Timed_Waiting
(시간 제한 대기 상태)
- 스레드가 일정 시간 동안 대기하는 상태이다.
- 지정된 시간이 지나면 자동으로 Runnable 상태로 전환된다.

- Object.wait(timeout), Thread.join(timeout), Thread.sleep(timeout) 메서드를 호출하면 스레드는 Timed_Waiting 상태로 전환된다.
Terminated
(종료된 상태)
- 스레드가 실행을 마치고 종료된 상태이다.
- 스레드가 종료되면 이 상태로 전환되며, 한 번 종료된 스레드는 다시 시작할 수 없다.

상태 변화 요약

  • New → Runnable: start() 메서드가 호출되면 스레드는 Runnable 상태로 전환된다.
  • Runnable → Running: 스레드가 CPU를 할당받아 실제로 실행되는 상태이다. (자바에서 Running 상태는 Runnable의 하위 개념이므로 별도로 표시되지 않는다.)
  • Runnable → Blocked: 스레드가 synchronized 블록에 진입하기 위해 모니터 락을 기다릴 때 Blocked 상태로 전환된다.
  • Blocked → Runnable: 스레드가 모니터 락을 얻으면 다시 Runnable 상태로 전환된다.
  • Runnable → Waiting: 스레드가 Object.wait()Thread.join()을 호출해 다른 스레드의 작업을 기다릴 때 Waiting 상태로 전환된다.
  • Waiting → Runnable: 다른 스레드에 의해 깨워지면 다시 Runnable 상태로 전환된다.
  • Runnable → Timed_Waiting: 스레드가 Thread.sleep(timeout)이나 Object.wait(timeout)을 호출해 일정 시간 동안 대기할 때 Timed_Waiting 상태로 전환된다.
  • Timed_Waiting → Runnable: 지정된 시간이 지나면 자동으로 Runnable 상태로 전환된다.
  • Runnable → Terminated: 스레드가 run() 메서드의 실행을 완료하거나 예외로 인해 실행이 종료되면 Terminated 상태로 전환된다.

 

Java Thread Dump

  • 실행 중인 자바 프로세스의 현재 상태를 담은 스냅샷이다. 스레드 덤프는 JVM(Java Virtual Machine)에서 실행 중인 모든 스레드의 상태와 스택 트레이스를 포함한 정보를 제공한다.
  • 용도:
    • 병목 상태 확인: 자바 애플리케이션에서 성능 문제를 진단할 때 유용하다. 스레드 덤프를 분석하면 스레드들이 어떤 상태에 있는지, 어떤 메서드를 호출하고 있는지, 어떤 리소스를 기다리고 있는지 등의 정보를 알 수 있어 병목 상태를 식별하는 데 도움을 준다.
    • 디버깅: 스레드가 교착 상태에 빠졌는지, 어떤 스레드가 다른 스레드를 기다리고 있는지 등을 확인할 수 있다.
    • 상태 모니터링: 시스템의 전반적인 스레드 상태를 모니터링하고, 예기치 않은 상태 변화를 추적할 수 있다.
  • 수집 방법:
    • 명령어 사용: jstack, jps -l, kill -3 [PID] 등의 명령어를 사용하여 스레드 덤프를 생성할 수 있다.
    • JVM 옵션: JVM의 XX:+PrintThreads와 같은 옵션을 설정하여 스레드 정보를 출력할 수 있다.
  • 스레드 덤프 분석:
    • 스레드 상태: 각 스레드의 상태(RUNNABLE, WAITING, BLOCKED, TIMED_WAITING, NEW, TERMINATED)를 분석한다.
    • 스택 트레이스: 스레드가 현재 실행 중인 코드의 스택 트레이스를 확인하여 어떤 메서드가 호출되고 있는지 분석한다.
    • 교착 상태 감지: 스레드가 다른 스레드의 락을 기다리는 상황을 확인하여 교착 상태를 진단한다.
    • 대기 및 블로킹 분석: 스레드가 대기하거나 블로킹된 상태를 식별하여 문제의 원인을 파악한다.

'CS' 카테고리의 다른 글

운영 체제의 모드와 시스템 콜  (1) 2024.08.11
CPU Scheduler & Dispatcher  (0) 2024.08.11
Deadlock  (0) 2024.08.11
동기화  (0) 2024.08.09
CPU Bound, I/O Bound  (0) 2024.08.09