2025. 11. 26. 20:18ㆍ운영체제/QNX
프로세스가 종료될 때 뒷정리는 두 가지 레벨에서 일어남. 하나는 프로세스 내부 코드가 수행하는 정리(Internal)이고, 다른 하나는 QNX OS가 강제로 수행하는 정리(External)임. 이 둘의 차이를 명확히 알아야 함.
1. 내부 정리 (Internal Cleanup): "기회"의 문제
내부 정리는 프로세스 스스로가 자원을 정리할 기회를 갖는 것을 말함. 핵심은 "종료 방식에 따라 기회가 없을 수도 있다"는 점임.
1.1. 정상 종료 (Normal Termination)
exit()이 호출되거나 메인 스레드가 main() 함수에서 리턴하는 경우임. 이때는 다음과 같은 정리 루틴이 실행됨.
- atexit() 핸들러 실행: 종료 시 실행하라고 등록해둔 함수들이 호출됨.
- 버퍼 플러시 (Buffer Flushing): stdio나 C++ 스트림에 남아있던 데이터가 실제 스토리지나 출력 장치로 써짐.
- 소멸자 호출: C++ 전역 객체(Global Object)들의 소멸자(Destructor)가 실행됨.
1.2. 비정상 종료 (Abnormal Termination)
프로세스가 크래시(SIGSEGV 등) 나거나, 처리하지 못한 시그널(SIGKILL, SIGTERM)을 받거나, 마지막 스레드가 pthread_exit()으로 그냥 나가버리는 경우임.
- 특징: 정리 코드가 전혀 실행되지 않음.
- 결과: atexit() 무시, 버퍼 데이터 유실, C++ 소멸자 미실행. 로그 파일에 마지막 줄이 안 찍히는 이유가 보통 이 버퍼 플러시가 안 돼서임.
2. 외부 정리 (External Cleanup): OS의 보장
프로세스가 정상 종료되든 비정상 종료되든 상관없이, QNX 커널이 보장하는 정리 작업임. 프로세스가 소유했던(Owned) 자원은 주인이 사라졌으므로 OS가 무조건 회수함.
- 파일 디스크립터: 열려있던 모든 파일(close 안 한 것 포함)이 닫힘.
- IPC 리소스: QNX 커널 연결(Connection), 채널(Channel)이 파괴됨.
- 메모리 매핑 (핵심):
- 스택(Stack), 힙(Heap), 코드/데이터 세그먼트가 해제됨.
- mmap으로 잡았던 공유 메모리(Shared Memory)나 하드웨어 레지스터 매핑도 언맵(Unmap)됨.
- 즉, 프로세스가 죽으면 해당 프로세스가 접근하던 하드웨어 접근 권한도 즉시 사라짐.
- 기타: 타이머, 인터럽트 핸들러 등도 모두 제거됨.
3. 예외: 살아남는 것들 (Persistence)
OS가 모든 것을 정리해 주지만, "이름(Path Name)"을 가진 자원은 프로세스가 죽어도 살아남음. 이 부분이 자원 누수(Leak)의 주범이 될 수 있음.
3.1. 영속성 객체 (Persistent Objects)
파일 시스템의 파일처럼, 이름을 통해 접근하는 IPC 객체들은 프로세스 종속적이지 않음.
- 대상:
- 일반 파일 (open with O_CREAT)
- POSIX 공유 메모리 (shm_open)
- 네임드 세마포어 (sem_open)
- POSIX 메시지 큐 (mq_open)
3.2. 정리 조건 (Cleanup Condition)
이 객체들이 시스템에서 완전히 사라지려면 두 가지 조건이 모두 충족되어야 함.
- Unlink: 명시적으로 unlink 함수(shm_unlink, sem_unlink 등)를 호출해서 이름을 지워야 함.
- Reference Count 0: 해당 객체를 열고 있는 모든 프로세스가 파일을 닫거나(close), 죽어서 OS가 대신 닫아줘야 함.
즉, 프로세스가 shm_unlink를 안 하고 죽으면, 그 공유 메모리 덩어리는 시스템 메모리에 계속 남아있음(좀비 리소스). 재부팅 하거나 다른 프로세스가 지워줄 때까지 유지됨.
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 4-9. Synchronization - Mutexes (0) | 2025.11.26 |
|---|---|
| QNX RTOS: 4-8. Synchronization (Race Condition) (0) | 2025.11.26 |
| QNX RTOS: 4-6. Threads - Operations (0) | 2025.11.26 |
| QNX RTOS: 4-5. Threads - Creation (0) | 2025.11.26 |
| QNX RTOS: 4-4. Thread (0) | 2025.11.26 |