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 상태로 진입시키는 과정이다.
- 종료는 정상적 실행 종료 또는 오류·외부 요청에 의한 종료로 나뉘며,
- 운영체제는 자원을 회수하고 종료 상태를 부모에게 전달한다.
🔁 생성과 종료는 운영체제의 자원 관리, 상태 관리, 스케줄링, 보안 측면과 깊이 연결되어 있으며,
이 과정을 이해하면 프로세스 간 관계, 오류 처리, 시스템 최적화 전략까지 명확하게 이해할 수 있다.
반응형