실행된 프로세스는 다양한 상태 중 하나를 가진다. 요청을 처리하기 위해 CPU를 사용하고 있는지, 요청이 오기를 기다리는 등의 상태를 나타낸다.
앞에서 하나의 프로세스가 fork() 해서 exec(), exit()까지의 과정을 살펴 보았다. 아래 그림은 이러한 프로세스가 실제 CPU에서 실행 될 때 프로세스들의 상태를
나타낸다. init에 의해 fork()된 프로세스는 CPU에서 실행되기 위해 실행 큐(Run Queue)에 대기한다. 이를 Runnable(실행 가능 상태)이라 하고,
실행 큐를 CPU 대기열 또는 디스패치 큐(dispatch Queue)라 한다. 실행 큐에 있는 프로세스는 exec에 의해 CPU에 패치(Fetch)된다.
패치된 프로세스는 CPU에서 실행(Running) 하며, CPU에서 실행이 끝났으면 종료 코드를 부모 프로세스에게 리턴(return)하고, 자식 프로세스는 종료한다.
그리고 부모 프로세스는 잠듦(sleep) 상태가 되며, 다시 사용되기 위해 기다린다(wait). 이후에 프로세스가 다시 필요하다면 인터럽트(interrupt)를 통해
프로세스를 깨우게(WakeUp) 된다. 깨어난 프로세스는 실행 큐를 거쳐 CPU에서 실행한다. 실행된 프로세스는 반드시 하나의 상태를 가지고 존재한다.
그리고, 프로세스가 종료할 때까지 다양한 상태를 가질 수도 있다. 프로세스의 상태 변화는 주로 인터럽트(interrupt)나 트랩(trap)등에 의해 변한다.
프로세스 상태는 크게 7가지로 분류하며, 항상 이중 하나의 상태를 유지한다. 아래 표에서는 이를 잘 설명하고 있다.
상 태 |
의 미 |
실행 중(Running) |
프로세스가 현재 CPU를 사용하고 상태이며 프로세스가 CPU에 의해 실행되고 있음을 의미(On CPU) |
수행 가능 (Runnable) |
프로세스가 CPU를 사용할 수 있게 되면, 바로 사용할 수 있는 상태로서 프로세스가 CPU에 의하여 실행할 준비가 되어 있음(런큐에 대기 상태) |
잠듬 (Sleeping) |
프로세스가 이벤트 발생하기를 기다린다. 이벤트는 주로 인터럽트로서 잠들어 있는 프로세스를 깨워 CPU 대기열에 있도록 한다. 예를 들면, 프로세스가 read() 시스템 호출을 하였을 경우 다른 작업들은 입출력 요구가 끝날 때까지 잠들어 있는다. |
일시 중지 (Suspended) |
프로세스가 SIGSTOP 시그널에 의해 “frozen”되어 있는 상태이다(일시적으로 정지된 상태). 다시 시작은 SIGCONT 신호를 받으면 된다. 예를 들면, Ctrl-Z는 전면 작업(Foreground job) 내에 있는 모든 프로세스를 일시 중지하고, 다시 시작은 Ctrl-S를 입력한다. |
중지(Stop) |
강제로 프로세스를 종료하거나 프로세스가 자신의 작업을 마치고 정상적으로 종료한 상태가 된다. |
쉼(Idle) |
프로세스가 fork() 시스템 호출에 의해 생성되었거나, 아직 실행 할 수 없다는 것을 의미한다. 프로세스 이미지는 이미 메모리로 복사되어 있다. |
좀비(Zombie) |
프로세스가 처리를 마쳤으나, 자신의 부모에게 종료 코드를 아직 반환하지 않았다는 것을 의미한다. 프로세스는 그들의 부모 프로세스 또는 초기 |