[리눅스 시스템 프로그래밍] 7.1 프로세스 상태

리눅스는 빠른 속도로 동작하는 CPU를 타임 퀀텀(혹은 타임 슬라이스)이라는 짧은 시간으로 나누어 프로세스에게 할당하여 수행하게 합니다. CPU에서 실행 중인 프로세스는 두 가지 모드로 수행할 수 있는데 사용자 모드와 커널 모드입니다.

 

사용자 모드는 사용자가 작성한 애플리케이션 코드를 수행하는 모드입니다. 하드웨어에 직접 접근할 수 없으며 이를 위해서는 시스템 호출이나 시그널에 의해 커널 모드로 전환하여야 합니다.

 

리눅스에서는 CPU를 시분할하여 사용하기 위해 스케쥴러에서는 현재 수행 중인 프로세스의 상태를 기록해 두고 이번에 수행하기 위해 대기 중인 프로세스에 관해 기록해 두었던 정보로 복원하여 수행하게 합니다. 이와 같은 작업을 문맥 교환(Context Switching)이라 부릅니다.

 

이처럼 프로세스는 대기 상태(Wait), 커널 모드 실행 상태(Running in kernel mode), 사용자 모드 실행 상태(Running in user mode)가 있습니다. 이 외에도 입출력에 관한 시스템 호출 작업을 완료할 때까지 대기하는 수면 상태(Sleep)가 있으며 수면 상태가 길어지면 프로세스의 메모리가 하드 디스크의 가상 메모리로 옮겨질 수 있는데 이러한 상태를 스왑 상태(Swap)라고 부릅니다. 이 외에도 프로세스는 더 이상 어떠한 작업도 진행하지 못하여 죽었다고 보아야 하지만 아직 프로세스를 위해 부여한 자원들을 정리하지 않아 여전히 남아있는 상태를 좀비 상태(Zombie)라고 부릅니다.

 

[그림 7.2] 프로세스 상태 전이도
[그림 7.2] 프로세스 상태 전이도