프로세스 간 통신(IPC: Inter-Process Communication)
프로세스 간 통신은 서로 다른 프로세스들이 데이터를 교환하고 협력하는 메커니즘이다.
- 파이프 (Pipes)
- 단방향 통신 채널로 주로 부모-자식 프로세스 간에 사용된다.
- 명명된 파이프(FIFO)를 사용ㅇ하면 관련 없는 프로세스 간에도 통신이 가능하다
- 예시 :
ls | grep txt (ls 명령의 출력을 grep 명령의 입력으로 전달)
- 메시지 큐 (Message Queues)
- 구조화된 데이터를 교환할 수 있어 복잡한 정보 전달에 적합하다.
- 여러 프로세스가 동시에 읽고 쓸 수 있어 다중 프로세스 통신에 유용하다.
- 주요 함수 : msgget() (생성/접근), msgsnd() (메시지 전송), msgrcv() (메시지 수신)
- 공유 메모리 (Shared Memory)
- 가장 빠른 IPC 방식으로 대용량 데이터 교환에 효율적이다.
- 여러 프로세스가 동시에 접근할 수 있어 세마포어 등의 동기화 메커니즘이 필요하다
- 주요 함수: shmget() (생성/접근), shmat() (메모리 연결), shmdt() (메모리 분리)
- 소켓 (Sockets)
- 네트워크를 통한 프로세스 간 통신을 지원한다.
- 같은 시스템 내의 로컬 통신과 다른 시스템 간의 원격 통신 모두 가능하다.
- 다양한 프로토콜을 사용할 수 있어 유연성이 높다
- 시그널 (Signals)
- 비동기적 이벤트를 통지하는 방식으로 프로세스에 특정 상황을 알린다.
- 제한된 양의 정보만 전달 가능하지만 프로세스 제어에 유용하다.
- 예: SIGINT (인터럽트), SIGKILL (강제 종료), SIGSTOP (일시 중지) 등
특수한 프로세스 상태
- 좀비 프로세스
- 실행 종료 후 부모가 wait() 호출로 상태를 수집하지 않은 프로세스
- 시스템 리소스 사용 최소화, 단 PID 점유
- ps 명령어에서
Z로 상태로 표시
- 부모 프로세스 종료 시 init 프로세스가 정리
- 고아 프로세스
- 부모 프로세스가 wait() 호출 없이 종료된 자식 프로세스
- init 프로세스(PID 1)가 새 부모로 관리
- 정상적 상황으로 시스템에 문제 없음
- 방지 방법
- SIGCHLD 시그널 처리로 자식 프로세스 종료 시 wait() 호출
- 더블 포크(double fork) 기법으로 데몬 프로세스 생성
- 첫 번째 fork로 자식 프로세스 생성
- 자식 프로세스가 다시 fork 하여 손자 프로세스 생성
- 자식 프로세스는 즉시 종료, 손자 프로세스는 init의 자식이 됨.