프로세스나 스레드가 데드락에 빠지면 더 이상 아무것도 하지 못하게 된다는 것을 배웠습니다.
이런 문제가 발생하면, 예를 들어 백엔드 서버 애플리케이션이 이렇게 된다면
개발자는 애플리케이션의 상태를 신속히 파악해서 어디가 문제인지 파악할 수 있어야 합니다.
그런데 프로세스나 스레드가 어떤 상태를 가질 수 있는지, 그리고 그 상태가 무엇을 의미하는지를 모른다면 제대로 파악조차 할 수가 없겠죠
출처 : 쉬운코드 유튜브
new : 프로세스 시작
ready : 스케줄러에 의해 허가받고 동작 준비 상태가 된다.
(스케줄러가 없는경우 바로 ready 상태로 들어간다.)
running : 스케줄러에 의해 CPU에서 실행된다.
interrupt : 멀티 태스킹 환경에 의해 짧은 time slice를 가진다.
time slice 후 ready 상태로 돌아가고, ready - running을 반복
I/O, event wait :
terminated : 프로세스의 작업이 끝나면 ready 상태로 갔다가 끝나는것이 아닌, CPU상에서 running 중 종료된다.
OS와 프로그래밍 언어마다 다르다.
자바 스레드가 아직 시작하지 않은 상태
실행을 마치고 종료된 상태
다른 스레드를 기다리는 상태
Object 클래스의 wait
Thread 클래스의 join
etc...
제한 시간을 두고 다른 스레드를 기다리는 상태
Object 클래스의 wait with timeout (파라미터로 입력)
Thread 클래스의 join with timeout (파라미터로 입력)
Thread 클래스의 sleep
etc...
critical section에 들어가려고 모니터 락을 얻기 위해 기다리는 상태
실행중인 상태, 다른 리소스를 기다리는 상태도 포함한다.
synchronized가 명명되어있으면 모니터락을 획득하고 critical section에 진입해야한다.
cosumer와 producer는 각자의 락을 가지고 있으며, BoundedBuffer도 락을 가지고 있다.
consumer.start();
//consumer는 buffer의 락을 획득하고 new -> runnable 후 count가 0이기 때문에 락을 반환하고 waiting
producer.start();
//producer는 consumer가 반환한 락을 획득하고 아이템 생성
//notifyAll() 메서드를 통해 waiting상태인 consumer를 깨운다.
//하지만 producer는 락을 가지고 critical section에서 계속 생성하고 조건이 만족되어야 락을 반환한다.
//깨어난 consumer는 락을 획득할 때 까지 동작하지 못한다. waiting > blocked 상태
//producer가 락을 반환하면 consumer는 락을 획득하고 blocked > runnable
//consume메서드가 끝나면 runnable > terminated
실행 중인 자바 프로세스의 현재 상태를 담은 스냅샷
when) 모든 thread가 사용중이고, client의 요청이 온 경우 thread dump를 이용하여 현재 애플리케이션의 thread 상태를 확인한다.
★어떤 부분에서 병목이 일어났는지 확인 할 수 있다.