반응형
3️⃣ 프로세스 관리 - 프로세스의 생성과 종료
📌 프로세스 종료 및 자원 반환 (Process Termination & Resource Deallocation)
운영체제에서 프로세스는 단순히 “종료”된다고 끝나는 것이 아니다.
실행이 끝난 이후에도 운영체제는 프로세스가 점유하고 있던 자원들을 안전하게 회수하고 정리해야 하며,
이 과정을 통해 다른 프로세스들이 시스템 자원을 원활하게 사용할 수 있도록 보장한다.
1️⃣ 프로세스 종료의 정의
- 프로세스 종료(Process Termination)란,
프로세스가 자신의 실행을 끝내고 운영체제에 종료 의사를 알리는 상태 전이를 의미한다.
종료는 정상적 종료(normal termination)와 비정상적 종료(abnormal termination)로 나뉜다.
2️⃣ 종료 방식의 종류
종료 방식 | 설명 |
✅ 정상 종료 | 프로그램이 의도대로 작업을 마치고 종료 (return, exit() 등) |
❌ 비정상 종료 | 예외, 오류, 시그널(SIGKILL, SIGSEGV 등)로 인해 강제 종료 |
❌ 강제 종료 | 외부 요청(kill, taskkill, 관리자 권한) 또는 시스템 강제 종료 |
3️⃣ 프로세스 종료 시 커널이 수행하는 작업
✅ 1. 종료 코드(exit status) 저장
- 자식 프로세스는 exit(status)로 종료 코드를 반환
- 부모는 wait() 또는 waitpid() 호출 시 해당 값을 수신
- 상태 코드(0: 성공, 1~255: 오류 코드)는 부모의 제어 흐름에 사용됨
✅ 2. 열린 파일, 디바이스 핸들 해제
- open()으로 열었던 파일, 소켓, 파이프 등의 파일 디스크립터(fd) 모두 닫힘 (close())
- 디스크에 flush되지 않은 데이터는 강제 기록(flush)되거나 손실 방지 처리
- 연결된 네트워크 소켓은 FIN 패킷 또는 강제 종료(RST)로 처리됨
✅ 3. 메모리 자원 회수
- 프로세스가 사용하던 전체 주소 공간(코드, 데이터, 힙, 스택)은 커널에 의해 반환
- malloc()으로 할당한 힙 메모리도 강제 회수됨 (사용자가 free() 하지 않아도)
- mmap()이나 공유 메모리도 매핑 해제되며, 참조 카운트가 0이면 삭제
✅ 4. IPC 자원 정리
- 프로세스가 소유하던 다음과 같은 자원은 제거됨 또는 참조 감소
- 세마포어
- 메시지 큐
- 공유 메모리
- 파이프, 익명 소켓
단, 공유 자원은 다른 프로세스가 접근 중인 경우 즉시 제거되지 않음
✅ 5. 커널 자료구조 해제
- 프로세스 관련 정보가 담긴 PCB(Process Control Block)는 종료 이후 커널이 회수
- 사용하던 커널 스택, 커널 내부 대기 큐 정보 등도 모두 제거
✅ 6. 부모 프로세스에게 종료 알림
- 부모는 wait()을 통해 자식 종료 여부를 확인하고 exit code를 수거
- 부모가 수거하지 않으면 좀비 프로세스(Zombie) 상태로 남게 됨
4️⃣ 좀비 프로세스와 Orphan 프로세스
🧟♂️ 좀비(Zombie) 프로세스
- 프로세스는 종료됐지만, 부모가 아직 종료 상태를 수거하지 않아 PCB만 남아 있는 상태
- 실제로 실행은 되지 않지만, PID와 PCB는 커널에 남아 있음
- 수거되지 않으면 시스템에 PID 고갈, 프로세스 테이블 낭비 문제 발생
해결 방법: 부모 프로세스가 wait() 또는 waitpid() 호출하여 종료 상태 수거
👻 고아(Orphan) 프로세스
- 부모 프로세스가 먼저 종료되고, 자식 프로세스가 여전히 실행 중인 상태
- Linux에서는 init 또는 systemd가 고아 프로세스를 수거하여 상태 관리
- 자식 프로세스는 독립적으로 계속 실행됨
5️⃣ 프로세스 종료 흐름 (Linux 예시)
1. 프로세스가 `exit(status)` 호출
2. 열린 파일/소켓 닫기
3. 메모리 공간 반환
4. 커널은 exit code를 부모에게 전달
5. 상태를 “Zombie”로 전환
6. 부모가 `wait()`로 수거
7. 커널이 PCB 제거 → 완전한 종료
6️⃣ Windows에서의 자원 반환
자원 유형 | 반환 방법 또는 상태 |
파일 핸들 | 자동 해제 또는 CloseHandle() |
메모리 | VirtualFree() 또는 프로세스 종료 시 자동 해제 |
GDI 객체 | 자동 해제 또는 DeleteObject() 필요 |
프로세스 핸들 | 커널이 관리하며 WaitForSingleObject() 등으로 수거 |
쓰레드 | ExitThread() 또는 ExitProcess()로 함께 종료 |
7️⃣ 종료된 자원의 상태 추적 도구 (Linux)
도구 | 설명 |
ps | 종료되지 않은 프로세스 상태 확인 |
top, htop | 실행 중인/좀비 상태 확인 |
lsof | 열린 파일 확인 (종료 전 상태 추적) |
/proc/[pid]/ | 특정 프로세스의 상세 정보 디렉터리 |
wait, kill | 종료 대기 또는 강제 종료 수행 |
📌 요약
- 프로세스 종료 시 운영체제는 모든 자원을 정확하게 회수하여 시스템 안정성을 유지함
- 열린 파일, 메모리, IPC 자원, 커널 내부 자료구조 등 종류별로 다르게 처리되며
- 부모 프로세스가 자식 종료 상태를 수거하지 않으면 좀비 프로세스 발생
- 자원 누수 없이 안전하게 종료되는 프로세스를 만들기 위해서는,
- 종료 시점의 철저한 자원 정리와 부모-자식 프로세스 관계 관리가 필수
🧹 프로세스 종료는 단순한 '끝남'이 아니라,
시스템 자원 회수, 상태 수거, 커널 구조 정리 등 복합적인 운영체제 기능이 총동원되는 과정이다.
반응형
'IT > 운영체제' 카테고리의 다른 글
⚙️ [운영체제] 고아 프로세스(Orphan Process)와 좀비 프로세스(Zombie Process) (0) | 2025.06.26 |
---|---|
⚙️ [운영체제] 부모-자식 관계 구조 (0) | 2025.06.25 |
⚙️ [운영체제] 프로세스 생성 과정 (fork(), exec() 등) (0) | 2025.05.29 |
⚙️ [운영체제] 프로세스 상태 (New, Ready, Running, Waiting, Terminated) (1) | 2025.05.28 |
⚙️ [운영체제] 프로세스의 정의 (0) | 2025.05.27 |