안녕하딤니카?
이번 글에서는 저번 글에 이어서, 운영체제의 프로세스에 대해서 정리하는 글입니다.
저번 글에서는 프로세스의 개요, 그리고 PCB, 문맥 교환, 프로세스의 메모리에 대해서 정리했다면
이번 글에서는 프로세스 상태와 계층 구조를 중심으로 정리해보려고 합니다
그럼 시~~~작

1. 프로세스의 상태
프로세스는 저마다의 상태가 있습니다. 운영체제는 PCB에 프로세스 상태를 기록하고, 계층적으로 관리합니다. 먼저 프로세스의 상태에 대해서 정리해 보겠습니다. (프로세스의 상태는 운영체제마다 조금씩 차이가 있습니다.)

- 생성 상태 : 이제 막 메모리에 적재되어 PCB를 할당받은 상태, 여기서 준비가 완료되었다면 준비 상태가 됩니다.
- 준비 상태 : 당장이라도 CPU를 할당받아 실행할 수 있지만, 자신의 차례가 아니기에 기다리는 상태입니다. 자신의 차례가 된다면 실행 상태가 됩니다. (= 디스패치)
- 실행 상태 (running state) : CPU를 할당 받아 실행 중인 상태입니다. 할당된 시간을 모두 사용하여 타이머 인터럽트가 발생하면 다시 준비 상태가 됩니다. 실행 도중 입출력장치를 사용하면, 입출력 작업이 끝날 때까지(입출력 완료 인터럽트를 받을 때까지) 대기 상태로 접어들게 됩니다.
- 대기 상태 (block state) : 프로세스가 실행 도중 입출력장치를 사용하는 경우 대기 상태가 됩니다. 입출력 작업은 CPU에 비해 느리기 때문에, 이 경우 대기 상태로 접어듭니다. 입출력 작업이 끝나면(입출력 완료 인터럽트를 받으면) 다시 준비 상태로 접어들게 됩니다.
- 종료 상태 (terminated state) : 프로세스가 종료된 상태입니다. 종료 상태에서는 PCB, 프로세스의 메모리 영역이 정리됩니다.
2. 프로세스의 계층 구조
대부분 운영체제에서는 프로세스를 계층적으로 관리합니다. (예외적으로 윈도우 운영체제에서는 프로세스를 계층적으로 관리하지 않습니다.) 그러나, 개발자들이 많이 사용하는 리눅스, 유닉스, 맥 OS 운영체제에서는 프로세스를 계층적으로 관리하기 때문에 프로세스의 계층 구조에 대해서 알아둬야 합니다.
먼저, 프로세스 계층 구조를 이해하려면 부모 프로세스와 자식 프로세스에 대해서 알아야 합니다. 프로세스는 실행되는 도중에 시스템 호출을 통해 다른 프로세스를 생성할 수 있습니다. 여기서 새 프로세스를 생성한 프로세스를 부모 프로세스라고 하며, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 합니다.
부모 프로세스와 자식 프로세스는 별개의 프로세스이기 때문에, 각기 다른 PID를 가집니다. 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(Parent PID, PPID)를 명시하기도 합니다.

그리고 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있고, 그 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있습니다. 이렇게 프로세스의 계층적인 구조가 형성됩니다.
3. 프로세스 생성 기법
그러면 부모 프로세스는 자식 프로세스를 어떻게 만들고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까요? 마치 프로세스는 복제와 옷 갈아입기라고 하는 두 가지의 과정을 거쳐서 프로세스가 생성됩니다. (윈도우 운영체제와는 큰 관련은 없지만, 리눅스, 맥 OS 등의 대부분 운영체제에 해당됩니다)
이 복제와 옷 갈아입기를 자세히 설명해 보자면, 아래와 같습니다.
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성합니다. (복제)
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램을 교체합니다. (옷 갈아입기)
3-1. fork 시스템 호출
fork라고 하는 시스템 호출은 나의 복사본을 자식 프로세스로 생성하는 시스템 호출입니다. 복사본은 자식 프로세스가 되고, 부모 프로세스의 자원을 상속받습니다.

이렇게 복제된 자식 프로세스는 부모 프로세스와는 별개의 프로세스이기 때문에, 부모 프로세스와는 다른 PID를 가지고, 저장된 메모리 위치도 다릅니다. fork 시스템 호출이 끝났다면 자식 프로세스는 부모 프로세스와 완전히 동일한 내용들을 갖고 있습니다. 여기서 끝낸다면 그냥 똑같은 일을 하는 두 개의 프로세스를 동시에 실행하라 이렇게 됩니다.
3-2. exec 시스템 호출
여기서 이제 자식 프로세스가 exce라고 하는 시스템 호출을 하면, 메모리 공간을 새로운 프로그램으로 덮어쓰기 합니다. 코드와 데이터 영역은 실행할 프로그램 내용으로 바뀌고, 나머지 영역은 초기화됩니다.

이렇게 exce 시스템 호출을 하게 되면, 부모 프로세스에 있는 프로그램의 내용과 자식 프로세스에 있는 프로그램의 내용이 달라지게 됩니다. 이렇게 되면 부모 프로세스와 자식 프로세스는 서로 다른 프로그램이 되는 거고, 서로 다른 프로그램이 병행 실행되는 것입니다.
예를 들어서 처음에 bash 프로세스를 실행했다고 가정하겠습니다. 여기서 ls 명령어를 입력하면 ls 프로세스를 실행해야 하는데, bash 프로세스가 fork 되는거고, 그다음에 exce 되어 ls 프로세스가 실행되는 것입니다. 그래서 서로 다른 bash 프로세스와 ls 프로세스가 함께 실행되는 상태가 되는 것입니다.
그래서 정리하자면, 프로세스 계층 구조를 이루는 과정은 fork 시스템 호출과 exce 시스템 호출이 반복되는 과정이라고 볼 수 있습니다. 다만, 부모 프로세스가 fork 만 실행하고, exce는 실행하지 않을 수 있습니다. 그렇게 되면 그냥 똑같은 일을 수행하는 프로세스 두 개가 병행 실행되는 구조가 됩니다.
이렇게 프로세스를 생성하는 기법을 Fork-exce 구조라고 합니다.
4. 정리
이번 글에서는 프로세스의 상태 종류, 그리고 프로세스의 계층 구조에 대해서 정리해 봤습니다. 그리고 프로세스의 계층 구조에서, 부모 프로세스가 자식 프로세스로 생성되는 기법을 정리해봤습니다. 다음 글에서는 스레드에 대해서 정리해보려고 합니다. 그럼 20000 !
[자료 출처]
강민철, 《혼자 공부하는 컴퓨터 구조+운영체제》, 한빛미디어, 2022
인프런 - 개발자를 위한 컴퓨터공학 1 : 혼자 공부하는 컴퓨터구조 + 운영체제
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
백엔드 개발자가 되고 싶어서 열심히 헤딩 중인 재영입니다 :-)
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Study > 컴퓨터구조, 운영체제' 카테고리의 다른 글
| CPU 스케줄링과 알고리즘을 정리해보자 (0) | 2025.01.08 |
|---|---|
| 스레드를 정리해보자 (스레드의 구성 요소, 멀티 스레드, 멀티 프로세스) (1) | 2025.01.07 |
| 프로세스의 개요와 PCB, 메모리 영역에 대해 정리해보자 (0) | 2025.01.07 |
| RAID의 정의와 종류를 정리해보자 (0) | 2025.01.05 |
| 메모리의 물리 주소와 논리 주소 정리 (2) | 2025.01.03 |