프로세스 상태 변화
프로세스 상태 변화는 운영체제에서 프로세스가 생성되고 종료될 때까지의 다양한 상태 전환을 설명하는 개념이다. 프로세스는 여러 가지 이유로 상태가 변할 수 있으며, 이러한 상태 변화는 운영체제의 스케줄링 및 자원 관리와 밀접하게 연관되어 있다.
프로세스 상태
상태 | 설명 |
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
)를 분석한다. - 스택 트레이스: 스레드가 현재 실행 중인 코드의 스택 트레이스를 확인하여 어떤 메서드가 호출되고 있는지 분석한다.
- 교착 상태 감지: 스레드가 다른 스레드의 락을 기다리는 상황을 확인하여 교착 상태를 진단한다.
- 대기 및 블로킹 분석: 스레드가 대기하거나 블로킹된 상태를 식별하여 문제의 원인을 파악한다.
- 스레드 상태: 각 스레드의 상태(
728x90
'CS' 카테고리의 다른 글
[CS] 운영 체제의 모드와 시스템 콜 (1) | 2024.08.11 |
---|---|
[CS] CPU Scheduler & Dispatcher (1) | 2024.08.11 |
[CS] Deadlock (0) | 2024.08.11 |
[CS] 동기화 (0) | 2024.08.09 |
[CS] CPU Bound, I/O Bound (0) | 2024.08.09 |