STUDY

[운영체제] 프로세스 상태와 프로세스 계층 구조 정리

sed 2026. 5. 27. 15:15
SMALL

프로세스 상태와 계층 구조

프로세스는 생성되어 실행되고, 필요하면 대기하다가, 작업이 끝나면 종료된다.

 

운영체제마다 프로세스 상태를 표현하는 방식은 조금씩 다를 수 있다.  

하지만 일반적으로 많이 사용하는 상태는 다음 다섯 가지이다.

 

생성 상태
준비 상태
실행 상태
대기 상태
종료 상태

 

프로세스는 실행되는 동안 이 상태들을 오가며 관리된다.

생성 상태

생성 상태(new state)는 프로세스가 이제 막 만들어진 상태이다.

프로그램이 실행되면 운영체제는 해당 프로그램을 메모리에 적재하고, 프로세스를 관리하기 위한 PCB를 만든다.

즉, 생성 상태는 프로세스가 메모리에 올라오고 PCB를 할당받은 상태라고 볼 수 있다.

프로그램 실행
→ 메모리에 적재
→ PCB 생성
→ 생성 상태

 

이후 프로세스가 실행될 준비를 마치면 준비 상태로 이동한다.

 

준비 상태

준비 상태(ready state)는 CPU만 할당받으면 바로 실행할 수 있는 상태이다.

즉, 실행에 필요한 준비는 끝났지만 아직 자기 차례가 오지 않아 기다리고 있는 상태이다.

 

준비 상태의 프로세스들은 보통 준비 큐에서 기다린다.

 

운영체제의 CPU 스케줄러는 준비 큐에 있는 프로세스 중 하나를 선택해 CPU를 할당한다.
이때 선택된 프로세스가 실행 상태로 넘어가는 과정을 디스패치(dispatch)라고 한다.

 

즉, 준비 상태는 당장 실행될 수는 있지만 아직 CPU를 받지 못한 상태이다.

실행 상태

실행 상태(running state)는 프로세스가 CPU를 할당받아 실제로 실행 중인 상태이다.

실행 상태의 프로세스는 계속 CPU를 사용할 수 있는 것이 아니다.
CPU는 여러 프로세스가 번갈아 사용해야 하기 때문에, 한 프로세스가 정해진 시간만큼 CPU를 사용하면 타이머 인터럽트가 발생한다.

 

타이머 인터럽트가 발생하면 운영체제는 현재 실행 중인 프로세스로부터 CPU를 회수하고, 해당 프로세스를 다시 준비 상태로 보낸다.

또 다른 경우도 있다.

 

실행 중인 프로세스가 입출력 작업을 요청하면, CPU를 계속 사용할 필요가 없다.
입출력 작업은 CPU 연산보다 훨씬 느리기 때문이다.

 

예를 들어 파일을 읽거나, 키보드 입력을 기다리거나, 디스크 접근을 해야 하는 경우가 있다.

 

이런 경우 프로세스는 입출력 작업이 끝날 때까지 대기 상태로 이동한다.

즉, 실행 상태의 프로세스는 상황에 따라 준비 상태로 돌아가거나, 대기 상태로 이동하거나, 실행을 마치고 종료 상태가 될 수 있다.

대기 상태

대기 상태(blocked state)는 프로세스가 입출력 작업이 끝나기를 기다리는 상태이다.

프로세스가 실행 중에 입출력 장치를 사용해야 하는 경우, CPU를 계속 붙잡고 있는 것은 비효율적이다.

입출력 작업은 CPU에 비해 매우 느리기 때문에, 입출력이 끝날 때까지 해당 프로세스는 대기 상태로 들어간다.

 

예를 들어 프로세스가 파일을 읽어야 한다고 하자.
파일 읽기 작업이 끝나기 전까지는 다음 작업을 진행할 수 없다.

 

이때 프로세스는 대기 상태가 되고, CPU는 다른 프로세스에게 할당된다.

 

입출력 작업이 완료되면 입출력 완료 인터럽트가 발생한다.
그러면 운영체제는 대기 상태에 있던 프로세스를 다시 준비 상태로 옮긴다.

 

중요한 점은 대기 상태에서 바로 실행 상태로 가는 것이 아니라, 보통 준비 상태로 이동한다는 것이다.

입출력이 끝났다고 해서 즉시 CPU를 받는 것은 아니기 때문이다.
다시 준비 큐에서 CPU 할당을 기다려야 한다.

종료 상태

종료 상태(terminated state)는 프로세스의 실행이 끝난 상태이다.

프로세스가 종료되면 운영체제는 해당 프로세스가 사용하던 자원을 정리한다.

이때 PCB도 폐기되고, 프로세스가 사용하던 메모리 영역도 정리된다.

 

즉, 종료 상태는 운영체제가 프로세스의 흔적을 정리하는 단계라고 볼 수 있다.

프로세스 상태 전이 정리

프로세스 상태 변화는 다음과 같이 정리할 수 있다.

생성 상태
→ 준비 상태
→ 실행 상태
→ 종료 상태

 

 

실행 중에 CPU 사용 시간이 끝나면 다시 준비 상태로 돌아간다.

실행 상태
→ 타이머 인터럽트
→ 준비 상태

 

실행 중에 입출력 작업이 필요하면 대기 상태로 이동한다.

실행 상태
→ 입출력 요청
→ 대기 상태

 

입출력 작업이 끝나면 다시 준비 상태로 이동한다.

대기 상태
→ 입출력 완료 인터럽트
→ 준비 상태

 

 

전체 흐름은 다음과 같다. 프로세스는 이 상태를 오가며 CPU와 입출력 장치를 사용한다.

『혼자 공부하는 컴퓨터 구조+운영체제』의 책 내용

 

프로세스 계층 구조

프로세스는 실행 도중 다른 프로세스를 생성할 수 있다.

새로운 프로세스를 생성한 프로세스를 부모 프로세스(parent process)라고 한다.
부모 프로세스에 의해 생성된 프로세스를 자식 프로세스(child process)라고 한다.

 

부모 프로세스와 자식 프로세스는 서로 다른 별개의 프로세스이다.
따라서 각자 고유한 PID를 가진다.

 

일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID를 함께 기록하기도 한다.
이를 PPID(Parent Process ID)라고 한다.

 

자식 프로세스는 또 다른 자식 프로세스를 만들 수 있다.

 

이렇게 프로세스가 프로세스를 만들고, 그 프로세스가 다시 다른 프로세스를 만들면서 계층 구조가 형성된다.

프로세스 A
 ├─ 프로세스 B
 │   ├─ 프로세스 D
 │   └─ 프로세스 E
 └─ 프로세스 C

 

 

프로세스 생성 기법

그렇다면 부모 프로세스는 자식 프로세스를 어떻게 만들까?

대표적으로 UNIX 계열 운영체제에서는 fork와 exec 시스템 호출을 사용한다.

프로세스 생성은 간단히 말하면 다음 두 과정으로 볼 수 있다.

1. 복제하기
2. 새 프로그램으로 덮어쓰기

 

즉, 먼저 부모 프로세스를 복제해서 자식 프로세스를 만들고, 이후 필요하다면 자식 프로세스의 메모리 공간을 새로운 프로그램으로 바꾼다.

fork

fork는 부모 프로세스의 복사본을 자식 프로세스로 만드는 시스템 호출이다.

fork가 호출되면 부모 프로세스의 메모리 내용, 열린 파일 정보, 실행 흐름 등이 복사되어 자식 프로세스가 만들어진다.

 

자식 프로세스는 처음에는 부모 프로세스와 거의 같은 내용을 가진다.

하지만 부모와 자식은 별개의 프로세스이므로 PID는 다르다.

즉, fork는 부모 프로세스의 복사본을 만드는 과정이라고 이해하면 된다.

exec

exec는 현재 프로세스의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다.

fork로 만들어진 자식 프로세스는 처음에는 부모 프로세스의 복사본이다.
하지만 자식 프로세스가 항상 부모와 같은 일을 해야 하는 것은 아니다.

 

다른 프로그램을 실행해야 한다면 exec를 호출한다.

 

exec가 실행되면 현재 프로세스의 코드 영역과 데이터 영역이 새로운 프로그램의 내용으로 바뀐다.
나머지 메모리 영역도 새로운 프로그램 실행에 맞게 초기화된다.

 

fork와 exec의 흐름

1. 부모 프로세스가 fork를 호출한다.
2. 부모 프로세스의 복사본인 자식 프로세스가 만들어진다.
3. 자식 프로세스가 exec를 호출한다.
4. 자식 프로세스의 메모리 공간이 새로운 프로그램으로 바뀐다.
5. 새로운 프로그램이 실행된다.

 

LIST