핵심 인사이트 (3줄 요약)

  1. 본질: 프로세스 그룹 (Process Group)은 여러 프로세스를 하나의 실행 단위처럼 묶어 같은 PGID (Process Group ID)로 관리하는 커널 객체다.
  2. 가치: 셸 (Shell)은 파이프라인과 작업 제어 (Job Control)를 구현할 때 프로세스 그룹을 사용해 Ctrl+C, Ctrl+Z, fg, bg를 개별 프로세스가 아닌 작업 단위로 처리한다.
  3. 판단 포인트: 프로세스 그룹은 자원 제한용 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
기본 목적실행 단위시그널·작업 제어 단위로그인/터미널 상위 경계자원 제한·회계
식별자PIDPGIDSID계층형 경로
대표 사용처개별 실행파이프라인, fg/bg로그인 셸, 데몬 분리CPU·메모리 제한
핵심 APIkill(pid)setpgid(), kill(-pgid)setsid()cgroupfs, systemd

예를 들어 프로세스 그룹은 Ctrl+C의 대상을 정하지만, 메모리 제한을 걸지는 않는다. 반대로 cgroup은 자원 격리에는 강력하지만 터미널 작업 제어를 직접 해결하지 않는다. 또한 세션은 여러 프로세스 그룹을 포괄하는 상위 개념으로, 로그인 셸이 하나의 세션을 만들고 그 아래 포그라운드·백그라운드 그룹이 나뉜다고 이해하면 경계가 분명해진다.

  • 📢 섹션 요약 비유: 프로세스가 선수 한 명이라면, 프로세스 그룹은 팀이고, 세션은 경기장이다. cgroup은 그와 별개로 팀별 예산표에 가깝다.

Ⅳ. 실무 적용 및 기술사 판단

실무에서 프로세스 그룹은 셸 구현, 터미널 프로그램, 잡 스케줄러, 디버거, 프로세스 감독 도구를 만들 때 중요하다. 특히 파이프라인 종료 문제를 다룰 때는 리더 하나만 죽이는 것이 아니라 그룹 전체에 시그널을 보내야 한다. 또한 자식 프로세스를 새 그룹으로 옮기는 setpgid() 호출은 보통 fork() 직후, exec() 전에 이뤄져야 한다. 시점을 놓치면 권한 오류나 예기치 않은 그룹 배치가 생길 수 있다.

판단 체크리스트

  1. 파이프라인 전체를 같은 PGID로 묶었는가? 그렇지 않으면 작업 제어가 분열된다.
  2. 종료 신호를 리더 하나가 아니라 그룹 전체에 보냈는가? 리더만 죽으면 하위 프로세스가 남을 수 있다.
  3. 세션·터미널 관계를 고려했는가? 백그라운드 그룹이 터미널 읽기를 시도하면 SIGTTIN 같은 시그널을 받을 수 있다.
  4. 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줄 비유 설명

  1. 프로세스 그룹은 컴퓨터가 여러 프로그램을 한 팀으로 묶어 두는 방법이에요.
  2. 그래서 Ctrl+C를 누르면 팀 전체가 함께 멈출 수 있어요.
  3. 한 명씩 부르는 게 아니라 팀 이름으로 불러서 더 쉽게 관리하는 거예요.