IT/운영체제

⚙️ [운영체제] 프로세스 생성 과정 (fork(), exec() 등)

BlogFlow 2025. 5. 29. 18:00
반응형

[운영체제 목차 바로가기]

3️⃣ 프로세스 관리 - 프로세스의 생성과 종료

 

📌 프로세스의 생성과 종료 (Process Creation and Termination)


운영체제는 사용자와 시스템 요구에 따라 새로운 프로세스를 생성하거나, 더 이상 필요 없는 프로세스를 종료한다.

이 과정은 단순한 실행·중지 이상의 의미를 가지며, 자원 할당, 부모-자식 관계 설정, 종료 상태 처리 등 다양한 시스템 동작과 연계된다.


1️⃣ 프로세스 생성 (Process Creation)

프로세스 생성은 다음과 같은 상황에서 발생한다:

사용자 요청에 의한 실행

  • 사용자가 명령어 또는 프로그램을 실행할 때
  • 예: 터미널에서 ./a.out, 윈도우에서 chrome.exe 실행

운영체제 또는 서비스에 의한 자동 실행

  • 시스템 백그라운드 서비스(데몬) 실행
  • 예약 작업(cron), 시스템 이벤트 발생 시 자동 실행

부모 프로세스가 자식 프로세스 생성

  • 예: fork() 호출 후 exec()로 다른 프로그램 실행
  • 웹 서버(Apache, Nginx) 등은 요청마다 자식 프로세스를 생성해 작업 처리

📌 프로세스 생성 과정 (Unix/Linux 기준)

1. 부모 프로세스가 `fork()` 호출
   → 새로운 프로세스(PID 생성, PCB 생성, 주소 공간 복제)

2. 자식 프로세스는 `exec()`를 통해 새로운 프로그램으로 대체 가능
   → 원래 코드를 새로운 코드로 덮어쓰기

3. 운영체제는 PID, PPID, 우선순위, 열린 파일 등 메타정보 설정

4. 자원 할당(메모리, 파일, 입출력 버퍼 등)

5. Ready Queue에 등록되어 실행 대기


✅ 부모-자식 관계 (Parent-Child)

  • 프로세스를 생성한 주체는 "부모 프로세스", 생성된 쪽은 "자식 프로세스"
  • 부모는 자식의 상태를 추적하고 종료 여부를 확인할 수 있다 (wait(), waitpid())
  • 부모가 먼저 종료되면, 자식은 고아 프로세스(Orphan Process)가 되고, init이 이를 수거
  • 자식이 먼저 종료되었지만 부모가 상태를 수거하지 않으면 좀비 프로세스(Zombie Process) 발생

✅ 프로세스 생성 시스템 콜 (Unix/Linux)

함수 설명
fork() 현재 프로세스 복제 (메모리 공간 공유 X)
vfork() fork()와 유사하나 성능 향상 목적 (동기화 필수)
clone() 커널 레벨에서 다양한 자원 공유 여부 지정 가능 (스레드 생성 포함)
exec() 현재 프로세스 주소 공간을 새로운 프로그램으로 대체

2️⃣ 프로세스 종료 (Process Termination)

프로세스는 다음과 같은 이유로 종료된다:

정상 종료

  • 프로그램의 실행이 끝나서 return, exit() 또는 ExitProcess() 호출
  • 커널은 종료 코드를 기록하고 PCB를 정리

비정상 종료

  • 오류 발생 (segmentation fault, divide by zero 등)
  • 잘못된 시스템 콜, 메모리 침범 등으로 커널이 종료 처리
  • 시그널(Signal) 수신에 의한 종료 (e.g. SIGTERM, SIGKILL)

강제 종료

  • 다른 프로세스나 사용자/관리자에 의해 종료됨
  • 예: kill 명령, taskkill, kill() 시스템 콜

종속 관계에 의한 종료

  • 부모 종료 시 자식도 같이 종료 (옵션에 따라)
  • 시스템 셧다운, 세션 로그아웃 등 이벤트

📌 프로세스 종료 처리 절차

1. 프로세스 종료 요청 (`exit()` 또는 오류)
2. 커널이 열린 자원 회수 (파일, 소켓, 메모리 등)
3. 종료 상태(exit code) 저장
4. 프로세스 상태를 “Terminated” 또는 “Zombie”로 전환
5. 부모 프로세스가 `wait()`로 수거
6. PCB 제거 및 완전한 제거


3️⃣ 좀비 프로세스와 고아 프로세스

유형 설명
좀비 프로세스 자식이 종료되었지만, 부모가 wait()를 호출하지 않아 PCB가 남아 있는 상태
고아 프로세스 부모가 먼저 종료되어 자식의 부모가 init/systemd로 변경된 상태 (Linux)

좀비 프로세스는 메모리를 많이 차지하진 않지만, PID를 소모하므로 과다 발생 시 시스템 자원 고갈 가능


4️⃣ Windows와 Linux의 차이점

항목 Linux/Unix Windows
생성 방식 fork() → exec() (2단계) CreateProcess() (1단계, 내부적으로 둘 다 포함)
PID 관리 커널이 전담 커널 + NTDLL + Windows API 체계
자원 정리 방식 wait(), 자동 수거 WaitForSingleObject(), 핸들 닫기 필요
종료 시 신호 SIGTERM, SIGKILL 등 TerminateProcess() 또는 Task Manager 사용

📌 요약

  • 프로세스 생성은 커널이 새로운 실행 단위를 만들고, 필요한 자원을 할당하여 Ready 상태로 진입시키는 과정이다.
  • 종료는 정상적 실행 종료 또는 오류·외부 요청에 의한 종료로 나뉘며,
  • 운영체제는 자원을 회수하고 종료 상태를 부모에게 전달한다.

🔁 생성과 종료는 운영체제의 자원 관리, 상태 관리, 스케줄링, 보안 측면과 깊이 연결되어 있으며,

이 과정을 이해하면 프로세스 간 관계, 오류 처리, 시스템 최적화 전략까지 명확하게 이해할 수 있다.

반응형