프로세스 상태(Process State)와 전이 과정은 운영체제에서 프로세스가 실행되는 동안의 상태 변화와 이를 관리하는 메커니즘을 설명.
프로세스 상태
New(생성 상태)
프로세스가 막 생성되었지만, 아직 실행 준비가 되지 않은 상태. 운영체제가 필요한 자원을 할당하고 초기화 과정을 진행.
Ready(준비 상태)
프로세스가 실행 준비를 완료하고 CPU를 할당받기를 기다리는 상태. 이 상태에서는 CPU만 할당받으면 바로 실행.
Running(실행 상태)
프로세스가 CPU를 할당받아 명령어를 실행 중인 상태. 한 순간에 단일 CPU에서는 하나의 프로세스만 실행 상태가 될 수 있음. 다중 코어 시스템에서는 여러 개 가능.
Blocked(대기 상태)
프로세스가 실행 중에 I/O 작업 또는 특정 이벤트를 기다리며 일시적으로 멈춘 상태. CPU는 다른 프로세스에 할당되며, 이벤트가 완료되면 준비 상태로 전환.
Terminated(종료 상태)
프로세스가 모든 작업을 완료하고 실행이 종료된 상태. 운영체제는 프로세스에 할당된 자원을 해체.
프로세스 상태 전이(Process State Transitions)
New->Ready
프로세스가 생성되고 운영체제가 필요한 자원을 할당하면 준비 상태로 전환됩니다.
Ready->Running
스케줄러가 CPU를 할당하면 준비 상태에서 실행 상태로 전환.
Running->Ready
프로세스가 CPU를 사용 중이지만 시간 할당(타임 슬라이스, time quantaum)이 끝나거나 다른 프로세스가 우선순위에 의해 실행되는 경우, 다시 준비 상태로 전환. 문맥교환(Context Switching)이 발생.
Running->Blocked
프로세스가 실행 중 I/O 작업을 요청하거나 특정 이벤트를 기다려야 할 때, 실행 상태에서 대기 상태로 전환됩니다.
Blocked->Ready
대기 중이던 I/O 작업 또는 이벤트가 완료되면 준비 상태로 돌아감.
Running->Terminated
프로세스가 모든 작업을 완료하면 종료 상태로 전환됨.
Blocked->Terminated
외부 요인(ex - 사용자에 의한 강제 종료)으로 대기 중이던 프로세스가 종료될 수 있음.
-> 운영체제는 프로세스 상태와 전이를 효율적으로 관리하여 시스템 성능을 최적화. 다중 프로세스 환경에서는 효율적인 상태 관리는 CPU 활용률을 높이고 응답 시간을 줄이는데 중요.
프로세스 상태(Process State)와 전이 과정을 이해하는 것은 운영체제의 기본 개념에 속하지만, 백엔드 개발자로서 이를 직접적으로 실습할 기회는 많지 않습니다. 그러나 관련 개념을 간접적으로 적용할 수 있는 몇 가지 실습 아이디어를 제안할 수 있습니다.
프로세스 상태 전이는 멀티스레딩 환경에서 스레드 관리와 유사한 면이 있습니다. Java에서 Thread 클래스를 활용하여 다음 실습을 할 수 있습니다:
Thread.State를 활용하여 스레드 상태를 추적합니다.public class ThreadStateExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
try {
System.out.println("Thread is running...");
Thread.sleep(1000); // Blocked 상태
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
System.out.println("Thread state before start: " + thread.getState());
thread.start();
System.out.println("Thread state after start: " + thread.getState());
Thread.sleep(500); // Thread가 sleep 상태로 전환되도록 기다림
System.out.println("Thread state while sleeping: " + thread.getState());
thread.join(); // 스레드가 종료될 때까지 대기
System.out.println("Thread state after termination: " + thread.getState());
}
}
synchronized 키워드와 wait(), notify()를 사용해 스레드 간 상태 전이를 구현해 봅니다.Producer-Consumer 패턴을 구현하며 WAITING과 RUNNING 상태를 제어할 수 있습니다.백엔드에서 비동기 처리와 스레드 관리는 프로세스 상태의 개념을 간접적으로 적용할 수 있는 영역입니다.
@Async 어노테이션을 사용해 비동기 작업을 실행합니다.@Service
public class AsyncService {
@Async
public CompletableFuture<String> performAsyncTask() {
try {
Thread.sleep(2000); // Simulate long-running task
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return CompletableFuture.completedFuture("Task Completed");
}
}
Future와 CompletableFuture를 활용하여 비동기 작업의 상태(완료 여부, 대기 등)를 추적합니다.프로세스 상태를 이해하면 애플리케이션 모니터링 및 관리 도구를 설정하는 데 도움이 됩니다.
Actuator를 이용한 상태 모니터링
/actuator/health와 같은 엔드포인트를 활용해 시스템 상태를 모니터링합니다.JVM 스레드 덤프 확인
jstack 명령어 또는 VisualVM 같은 도구로 확인합니다.멀티스레드 개념 강화:
백엔드 비동기 처리 역량 강화:
애플리케이션 모니터링 능력 향상:
Docker 컨테이너 관리:
프로세스 상태와 유사한 컨테이너 상태(예: 생성, 실행, 중단)를 관리하며, 컨테이너 간 동작을 이해합니다.
Kubernetes 상태 관리:
Pod와 컨테이너 상태 전이를 통해 클라우드 환경의 워크로드 상태를 학습합니다.
위 실습을 통해 프로세스 상태와 전이 개념을 실무적 관점에서 간접적으로 경험할 수 있을 것입니다. 필요하다면 추가적으로 관련 코드를 제안드리겠습니다!