프로세스 계층 구조 (Process Hierarchy)
운영체제에서 프로세스는 단일 개체로 독립적으로 실행되지만, 내부적으로 부모-자식 관계를 형성하며 트리(Tree) 형태의 계층 구조를 이룬다. 이는 프로세스가 시스템 호출을 통해 다른 프로세스를 생성할 수 있기 때문이다. 다음에서는 이러한 프로세스 계층 구조의 개념, 실제 예시, 그리고 최초 프로세스(PID=1)에 대해 살펴본다.
1. 부모 프로세스와 자식 프로세스
부모 프로세스(Parent Process) 가 새로운 프로세스를 만들면, 만들어진 프로세스를 자식 프로세스(Child Process) 라고 부른다.
- 부모와 자식은 서로 다른 PID를 갖는다.
- 일부 운영체제에서는 자식 프로세스의 PCB에 PPID(Parent PID) 를 기록해 부모 프로세스를 추적하도록 한다.
- 부모 프로세스가 exec 계열 호출 등을 통해 프로그램을 새롭게 실행하면(이미 존재하던 프로세스가 코드만 바뀔 수도 있음), 자식 프로세스 역시 같은 맥락 또는 완전히 독립적인 작업을 수행하기도 한다.
2. 프로세스 트리 구조
자식 프로세스는 다시 자신의 자식 프로세스를 생성할 수 있으며, 이 관계가 반복되면서 운영체제는 내부적으로 트리 형태의 프로세스 구조를 형성한다. 이를 프로세스 계층 구조(Process Hierarchy) 라고 한다.
- 예: 프로세스 A가 프로세스 B를 생성하면, B는 A의 자식이 된다. 이어 B가 프로세스 C를 생성하면, C는 B의 자식이자 A의 '손자' 프로세스가 된다.
- 이러한 구조를 시각화하면 트리 다이어그램으로 표현할 수 있다.
(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)
3. 구체적 예시: 로그인 → bash 셸 → Vim
사용자가 컴퓨터를 켜고, 로그인 창을 통해 시스템에 들어간 뒤, 셸(bash)을 열어 Vim 편집기를 실행하는 과정을 예로 들어보자.
- 시스템 부팅 시 최초 프로세스(PID=1)가 실행됨.
- 이 최초 프로세스가 로그인 프로세스를 자식으로 만든다.
- 로그인 프로세스는 사용자가 로그인하면 bash 셸을 자식으로 생성한다.
- bash 셸은 사용자가
vim
명령어를 입력하면, Vim 프로세스를 자식 프로세스로 생성한다.
결과적으로 Vim은 bash의 자식, bash는 로그인 프로세스의 자식, 로그인 프로세스는 최초 프로세스의 자식인 형태가 만들어진다.
(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)
4. 최초의 프로세스 (PID = 1)
4.1 운영체제별 명칭
시스템이 부팅되면서 가장 먼저 실행되는 프로세스는 OS별로 다음과 같은 이름을 갖는다.
- Unix:
init
- Linux:
systemd
(이전 Linux 배포판들은 종종init
을 사용) - macOS:
launchd
이 최초 프로세스는 항상 PID 1을 가지며, 다른 모든 프로세스의 최상위 부모 역할을 수행한다.
4.2 역할과 기능
- 프로세스 생성: 부팅 시점 이후에 필요한 시스템 데몬(백그라운드 서비스)이나 로그인 프로세스 등을 순차적으로 실행한다.
- 시스템 서비스 관리: 일부 운영체제(특히
systemd
)에서는 서비스(데몬 프로세스)를 통합적으로 관리하고, 의존성(dependency)을 고려해 시작·중지 등을 제어한다. - 고아 프로세스(Orphan Process) 처리: 어떤 자식 프로세스가 부모를 잃었을 때, 부모가
init
(또는systemd
,launchd
)로 전환되어 해당 자식을 관리하기도 한다.
5. 프로세스 계층 구조 확인: pstree
5.1 pstree
명령어
리눅스 계열에서 pstree
명령어를 입력하면, 현재 실행 중인 프로세스들을 트리 형태로 시각화해 볼 수 있다.
- 예:
pstree -p
옵션을 사용하면 PID도 함께 보여준다. - Linux 환경에서는
systemd
가 최상단에 있고, 그 밑으로 다양한 자식 프로세스들이 이어진다. - macOS 환경에서는
launchd
가 최상단에 나타난다.
(그림 출처: 혼자 공부하는 컴퓨터 구조 + 운영체제)
5.2 다른 명령어
ps -ef
- 전체 프로세스 목록을 보여주며, 부모 PID(
PPID
) 정보도 포함한다. - 이를 통해 각 프로세스가 어느 프로세스의 자식인지 수동으로 확인할 수 있다.
- 전체 프로세스 목록을 보여주며, 부모 PID(
pgrep
,pkill
- 특정 프로세스명으로 PID를 찾거나 종료할 수 있는 명령. 간접적으로 계층 구조를 파악하는 데도 활용 가능.
6. 프로세스 생성 방식: fork()
, exec()
프로세스 계층 구조가 형성되는 구체적인 기저 메커니즘은 Unix 계열을 예로 들면 다음과 같다:
fork()
- 부모 프로세스를 복제해 새로운 프로세스(자식 프로세스) 를 만든다.
- 새로운 자식은 부모의 코드와 데이터 공간을 복사해 시작한다(일부 OS는 Copy-on-Write 최적화).
exec()
- 자식 프로세스가 다른 프로그램을 메모리에 로드해 실행한다.
- 부모 프로세스의 주소 공간이 새 프로그램 코드로 대체된다(해당 프로세스는 기존 PID를 유지하되 실행 내용은 바뀜).
이 과정을 통해 부모가 자식을 생성하고, 자식 프로세스가 새로운 프로그램을 새로운 공간에서 실행함으로써 완전히 독립적인 프로세스로 동작하게 된다.
7. 요약
- 부모 프로세스는 시스템 호출(
fork()
,exec()
등)을 통해 자식 프로세스를 생성한다. - 이렇게 만들어진 프로세스들은 트리(Tree) 형태로 연결되어, 운영체제가 내부적으로 계층적(Hierarchy)으로 관리한다.
- 시스템 부팅 시 최초로 실행되는 프로세스는 (Unix에서는
init
, Linux에서는systemd
, macOS에서는launchd
)이며, PID가 1번이다. pstree
명령어를 통해 현재 실행 중인 프로세스의 계층 구조를 빠르게 확인할 수 있다.
참고 자료
- 혼자 공부하는 컴퓨터 구조 + 운영체제
- Operating System Concepts (A. Silberschatz, P.B. Galvin, G. Gagne)
- Modern Operating Systems (A. Tanenbaum, H. Bos)
- Linux manual:
fork()
andexec()
'운영체제 > 프로세스 상태와 계층 구조' 카테고리의 다른 글
프로세스 생성 기법 (0) | 2025.01.18 |
---|---|
프로세스 상태 (0) | 2025.01.16 |