핵심 인사이트 (3줄 요약)
- 본질: 프로세스 그룹 (Process Group)은 여러 프로세스를 하나의 실행 단위처럼 묶어 같은 PGID (Process Group ID)로 관리하는 커널 객체다.
- 가치: 셸 (Shell)은 파이프라인과 작업 제어 (Job Control)를 구현할 때 프로세스 그룹을 사용해
Ctrl+C,Ctrl+Z,fg,bg를 개별 프로세스가 아닌 작업 단위로 처리한다.- 판단 포인트: 프로세스 그룹은 자원 제한용 cgroup (Control Group)과 다르며, 세션 (Session), 제어 터미널 (Controlling Terminal),
setpgid(),tcsetpgrp()의 관계를 함께 이해해야 실무 장애를 줄일 수 있다.
Ⅰ. 개요 및 필요성
프로세스 그룹은 관련 있는 프로세스들을 하나의 논리적 묶음으로 관리하기 위한 운영체제 단위다. 같은 작업에서 생성된 프로세스들은 보통 하나의 PGID를 공유하고, 커널은 이 그룹을 기준으로 시그널 (Signal)을 일괄 전달하거나 포그라운드·백그라운드 작업을 구분한다. 즉 프로세스 그룹은 “프로세스 하나”보다 큰, 하지만 “세션 전체”보다는 작은 제어 단위다.
이 개념이 필요한 이유는 셸이 실제 작업을 개별 프로세스 하나로만 실행하지 않기 때문이다. 예를 들어 cat file | grep x | wc -l은 여러 프로세스로 구성되지만, 사용자는 이를 하나의 작업으로 인식한다. 만약 그룹 개념이 없다면 Ctrl+C를 눌렀을 때 앞 프로세스만 종료되고 뒤 프로세스는 남아 파이프라인이 꼬일 수 있다. 프로세스 그룹은 이런 불완전 종료와 터미널 제어 혼란을 막기 위해 등장했다.
- 📢 섹션 요약 비유: 프로세스 그룹은 이어달리기 팀과 같다. 선수는 여러 명이지만, 심판은 출발·중지 신호를 팀 전체에 한 번에 보낸다.
Ⅱ. 아키텍처 및 핵심 원리
프로세스 그룹은 보통 셸이 fork()로 자식들을 만든 뒤 setpgid()로 같은 그룹에 묶으면서 형성된다. 그룹에는 보통 리더가 있으며, 리더의 PID (Process Identifier)가 곧 PGID가 되는 경우가 많다. 다만 중요한 점은 “리더가 존재한다”와 “리더가 살아 있어야 그룹이 유지된다”가 같지 않다는 점이다. 리더가 종료돼도 그룹 자체는 남을 수 있다.
핵심 객체와 역할
| 객체 | 의미 | 운영 포인트 |
|---|---|---|
| PID | 개별 프로세스 식별자 | 프로세스 하나를 직접 제어 |
| PGID | 프로세스 그룹 식별자 | 관련 프로세스를 묶어 시그널 전달 |
| SID (Session ID) | 세션 식별자 | 여러 프로세스 그룹의 상위 경계 |
| 포그라운드 그룹 | 터미널 입력을 받는 그룹 | Ctrl+C, Ctrl+Z 대상 |
| 제어 터미널 | 세션과 연결된 터미널 | 포그라운드 그룹에 터미널 시그널 전달 |
아래 그림은 세션, 프로세스 그룹, 터미널의 관계를 요약한다.
┌────────────────────────────────────────────────────────────────────────────┐
│ session / terminal / process-group relationship │
├────────────────────────────────────────────────────────────────────────────┤
│ Session SID=4100, controlling terminal=/dev/pts/3 │
│ │
│ Shell PID=4100, PGID=4100 │
│ │ │
│ ├── Foreground PGID=5200 [vim] │
│ │ ▲ │
│ │ └── terminal SIGINT, SIGTSTP go here │
│ │ │
│ └── Background PGID=5300 [find | sort] │
│ ├── PID=5300 │
│ └── PID=5301 │
│ │
│ kill(-5300, SIGTERM) ──▶ send signal to whole background group │
└────────────────────────────────────────────────────────────────────────────┘
이 구조에서 핵심은 터미널 시그널이 “현재 포그라운드 프로세스 그룹”으로 전달된다는 점이다. 셸은 tcsetpgrp()로 어느 그룹이 터미널을 받을지 바꾸고, kill(-pgid, sig)처럼 음수 PID를 사용해 그룹 전체에 시그널을 보낸다. 따라서 프로세스 그룹은 시그널링, 작업 제어, 파이프라인 관리가 만나는 접점이다.
- 📢 섹션 요약 비유: 프로세스 그룹은 무대 위 합창단과 같다. 마이크는 지금 중앙에 선 합창단 한 팀에게만 열리고, 지휘자의 멈춤 신호도 그 팀 전체가 함께 받는다.
Ⅲ. 비교 및 연결
프로세스 그룹은 자주 세션이나 cgroup (Control Group)과 혼동된다. 하지만 세 개는 관리 목적이 다르다.
| 구분 | 프로세스 (Process) | 프로세스 그룹 (Process Group) | 세션 (Session) | cgroup |
|---|---|---|---|---|
| 기본 목적 | 실행 단위 | 시그널·작업 제어 단위 | 로그인/터미널 상위 경계 | 자원 제한·회계 |
| 식별자 | PID | PGID | SID | 계층형 경로 |
| 대표 사용처 | 개별 실행 | 파이프라인, fg/bg | 로그인 셸, 데몬 분리 | CPU·메모리 제한 |
| 핵심 API | kill(pid) | setpgid(), kill(-pgid) | setsid() | cgroupfs, systemd |
예를 들어 프로세스 그룹은 Ctrl+C의 대상을 정하지만, 메모리 제한을 걸지는 않는다. 반대로 cgroup은 자원 격리에는 강력하지만 터미널 작업 제어를 직접 해결하지 않는다. 또한 세션은 여러 프로세스 그룹을 포괄하는 상위 개념으로, 로그인 셸이 하나의 세션을 만들고 그 아래 포그라운드·백그라운드 그룹이 나뉜다고 이해하면 경계가 분명해진다.
- 📢 섹션 요약 비유: 프로세스가 선수 한 명이라면, 프로세스 그룹은 팀이고, 세션은 경기장이다. cgroup은 그와 별개로 팀별 예산표에 가깝다.
Ⅳ. 실무 적용 및 기술사 판단
실무에서 프로세스 그룹은 셸 구현, 터미널 프로그램, 잡 스케줄러, 디버거, 프로세스 감독 도구를 만들 때 중요하다. 특히 파이프라인 종료 문제를 다룰 때는 리더 하나만 죽이는 것이 아니라 그룹 전체에 시그널을 보내야 한다. 또한 자식 프로세스를 새 그룹으로 옮기는 setpgid() 호출은 보통 fork() 직후, exec() 전에 이뤄져야 한다. 시점을 놓치면 권한 오류나 예기치 않은 그룹 배치가 생길 수 있다.
판단 체크리스트
- 파이프라인 전체를 같은 PGID로 묶었는가? 그렇지 않으면 작업 제어가 분열된다.
- 종료 신호를 리더 하나가 아니라 그룹 전체에 보냈는가? 리더만 죽으면 하위 프로세스가 남을 수 있다.
- 세션·터미널 관계를 고려했는가? 백그라운드 그룹이 터미널 읽기를 시도하면
SIGTTIN같은 시그널을 받을 수 있다. - cgroup과 역할을 혼동하지 않았는가? 자원 제한 문제는 다른 메커니즘으로 풀어야 한다.
안티패턴
-
kill(pid)만 사용해 파이프라인 잔여 프로세스를 남기는 종료 로직 -
exec()이후 뒤늦게setpgid()를 호출하려다 실패하는 구현 -
프로세스 그룹으로 CPU·메모리 격리까지 해결하려는 잘못된 설계
-
📢 섹션 요약 비유: 프로세스 그룹 제어는 버스 기사에게 승객 한 명씩 내리라고 외치는 일이 아니라, “이 버스는 여기서 정차”라고 차량 단위로 지시하는 것과 같다.
Ⅴ. 기대효과 및 결론
프로세스 그룹을 올바르게 사용하면 셸과 터미널 기반 프로그램은 사용자 관점의 “작업”과 커널 관점의 “프로세스 묶음”을 자연스럽게 일치시킬 수 있다. 그 결과 파이프라인 종료, 중지·재개, 포그라운드 전환, 터미널 시그널 처리의 예측 가능성이 높아진다. 운영체제 이론에서 자주 나오는 세션, 제어 터미널, 데몬화도 이 구조를 기반으로 설명된다.
다만 프로세스 그룹은 만능 관리 단위가 아니다. 자원 격리나 보안 경계는 cgroup, 네임스페이스 (Namespace), 권한 모델과 함께 설계해야 한다. 따라서 프로세스 그룹은 **“여러 프로세스를 같은 작업처럼 제어하기 위한 시그널·터미널 중심 단위”**로 기억하는 것이 가장 정확하다.
- 📢 섹션 요약 비유: 프로세스 그룹은 여러 악기를 묶어 한 파트로 지휘하는 오케스트라 편성과 같다. 개별 연주자는 따로 존재하지만, 실제 지휘는 파트 단위로 이뤄진다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| PGID (Process Group ID) | 프로세스 그룹을 식별하는 핵심 값 |
| 세션 (Session) | 여러 프로세스 그룹을 포함하는 상위 경계 |
| 제어 터미널 (Controlling Terminal) | 포그라운드 그룹에 터미널 시그널을 전달 |
| 작업 제어 (Job Control) | fg, bg, Ctrl+Z를 프로세스 그룹 단위로 구현 |
setpgid() / getpgid() | 그룹 생성과 조회의 기본 시스템 호출 |
setsid() | 새 세션 생성과 터미널 분리를 담당하는 관련 메커니즘 |
📈 관련 키워드 및 발전 흐름도
개별 프로세스 생성
│
▼
프로세스 그룹 (PGID) 형성
│
├── 파이프라인 묶기
├── 그룹 시그널 전달
│
▼
포그라운드 / 백그라운드 작업 제어
│
▼
세션 (Session) · 제어 터미널 · 데몬화와 연결
이 흐름은 프로세스 그룹이 단순한 식별 번호가 아니라, 파이프라인 실행에서 시작해 터미널 제어와 세션 구조로 확장되는 운영체제 핵심 개념임을 보여 준다.
👶 어린이를 위한 3줄 비유 설명
- 프로세스 그룹은 컴퓨터가 여러 프로그램을 한 팀으로 묶어 두는 방법이에요.
- 그래서
Ctrl+C를 누르면 팀 전체가 함께 멈출 수 있어요. - 한 명씩 부르는 게 아니라 팀 이름으로 불러서 더 쉽게 관리하는 거예요.