프로세스 상태 진단

지식저장공간·2023년 2월 24일
0

운영체제

목록 보기
9/15

프로세스나 스레드가 데드락에 빠지면 더 이상 아무것도 하지 못하게 된다는 것을 배웠습니다.
이런 문제가 발생하면, 예를 들어 백엔드 서버 애플리케이션이 이렇게 된다면
개발자는 애플리케이션의 상태를 신속히 파악해서 어디가 문제인지 파악할 수 있어야 합니다.
그런데 프로세스나 스레드가 어떤 상태를 가질 수 있는지, 그리고 그 상태가 무엇을 의미하는지를 모른다면 제대로 파악조차 할 수가 없겠죠

출처 : 쉬운코드 유튜브

OS에서 프로세스 상태

new : 프로세스 시작

ready : 스케줄러에 의해 허가받고 동작 준비 상태가 된다.
(스케줄러가 없는경우 바로 ready 상태로 들어간다.)

running : 스케줄러에 의해 CPU에서 실행된다.

interrupt : 멀티 태스킹 환경에 의해 짧은 time slice를 가진다.
time slice 후 ready 상태로 돌아가고, ready - running을 반복

I/O, event wait :

  1. critical section에 도입해야 하는데 다른 프로세스가 critical section에 존재하면 대기한다.
  2. I/O 작업을 위해 I/O작업이 끝날때 까지 기다린다.

terminated : 프로세스의 작업이 끝나면 ready 상태로 갔다가 끝나는것이 아닌, CPU상에서 running 중 종료된다.

Java thread의 상태 종류

OS와 프로그래밍 언어마다 다르다.

new

자바 스레드가 아직 시작하지 않은 상태

terminated

실행을 마치고 종료된 상태

waiting

다른 스레드를 기다리는 상태

스레드가 언제 waiting이 되는지

Object 클래스의 wait
Thread 클래스의 join
etc...

timed_waiting

제한 시간을 두고 다른 스레드를 기다리는 상태

스레드가 언제 timed_waiting이 되는지

Object 클래스의 wait with timeout (파라미터로 입력)
Thread 클래스의 join with timeout (파라미터로 입력)
Thread 클래스의 sleep
etc...

blocked

critical section에 들어가려고 모니터 락을 얻기 위해 기다리는 상태

runnable

실행중인 상태, 다른 리소스를 기다리는 상태도 포함한다.

예제

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

thread dump

실행 중인 자바 프로세스의 현재 상태를 담은 스냅샷
when) 모든 thread가 사용중이고, client의 요청이 온 경우 thread dump를 이용하여 현재 애플리케이션의 thread 상태를 확인한다.
★어떤 부분에서 병목이 일어났는지 확인 할 수 있다.

profile
발전하는 개발자가 꿈입니다. 지식을 쌓고 지식을 활용해 목표 달성을 추구합니다.

0개의 댓글