이번 글은 OS에서 프로세스의 상태 종류와, 언제 다른 상태로 변화가 일어나는지를 살펴봅니다. 프로세스뿐만 아니라 스레드의 상태도 비슷하다고 보셔도 될 것 같아요.
* OS의 종류보다, 또 OS의 버전마다 조금씩 다를 수 있습니다. 하지만 큰 틀에서 파악하는 데는 충분히 도움이 된다고 봅니다. :)
OS 프로세스 상태(state) 종류
- NEW
처음 프로세스가 생성됐을 때 프로세스의 상태
- READY
CPU에서 실행되기 위해 ready queue(혹은 run queue)에서 대기 중인 프로세스의 상태
- RUNNING
CPU에서 실행 중인 프로세스의 상태
- WAITING
I/O 요청의 결과를 기다리거나, critical section에 진입하기 위해 기다리는 등의 특정 이벤트가 발생하길 기다리는 프로세스 상태
- TERMINATED
프로세스가 종료된 상태
OS 프로세스 상태의 변화
NEW -> READY
오늘날의 우리가 일반적으로 쓰는 컴퓨터의 경우에는 프로세스가 생성되면 바로 READY 상태가 된다고 봐도 무방합니다.
조금 더 자세히 설명을 하면, 과거에는 프로세스가 생성된 후에 프로세스가 실행될만한 상황이 되면 long term scheduler라는 스케줄러를 통해 READY 상태로 전이(transition)가 되던 시절이 있었는데, 오늘날 일반적인 컴퓨터 시스템은 멀티태스킹 환경이라서 프로세스 생성 후 바로 CPU에서 실행될 준비를 하는 READY 상태로 전이된다고 보시면 되겠습니다.
READY -> RUNNING
READY 상태가 된 프로세스들은 ready queue에서 기다리고 있습니다. 그러면 CPU scheduler가 이들 중에 하나를 선택해서 CPU 사용권을 주게 되고(dispatch), 선택된 프로세스는 CPU에서 실행되는 RUNNING 상태로 전이됩니다.
RUNNING -> READY
CPU에서 RUNNING 상태로 실행 중이던 프로세스는, 본인에게 할당된 time slice를 다 썼거나, 그 외의 이벤트(interrupt)를 받아서 다시 준비(READY) 상태로 돌아가야 하거나, 혹은 다른 기다리고 있는 프로세스들에게 CPU에서 실행된 기회를 주기 자발적으로 CPU에서 실행을 중단하게 되면, 이 프로세스는 다시 READY 상태로 전이됩니다.
RUNNING -> WAITING
CPU에서 RUNNING 상태로 실행 중이던 프로세스가 I/O 작업을 해야해서 I/O 작업 요청 후에 그 결과를 기다려야 하거나, critical section에 들어가기 위해 기다려야 하거나, 다른 프로세스가 사용 중인 리소스(가령 프린터)를 기다려야 하는 상황이라면 이때는 WAITING 상태로 전이됩니다.
WAITING -> READY
앞서 WAITING 상태에서 I/O 작업 요청의 결과를 기다리던 중에 결과와 나오게 됐을 때, 혹은 critical section에 들어갈 수 있게 됐을 때, 기다리던 리소스를 사용할 수 있게 됐을 때, 이때 WAITING 상태에서 READY 상태로 전이됩니다.
인상적인 부분은 바로 WAITING -> RUNNING 상태로 바뀌지 않는다는 점인데요, 이는 이미 CPU에서 실행중인 다른 프로세스가 있을 가능성이 있기 때문이죠.
RUNNING -> TERMINATED
프로세스가 (정상적으로) 종료되기 위해선 일단 RUNNING 상태가 되어야 합니다. 그래서 정리할 내용들, 반환할 메모리 등등을 처리를 해준 뒤에 TERMINATED 상태가 된다고 보시면 되겠습니다.
이와는 별개로 프로그래밍 언어에서 자체적으로 정의한 상태들이 있는데요, Java에서 정의한 스레드의 상태 종류가 궁금하시다면 해당 내용을 설명하는 부분부터 링크를 걸어두었으니 참고해주시면 좋을 것 같습니다 :)