※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
유닉스의 모든 프로세스는 init 프로세스의 자식이 되어 트리 구조를 이룹니다.
계층 구조
프로세스는 일반적으로 부모 - 자식 관계로 이루어집니다.
PID 0,1,2 등의 몇몇 조상 프로세스를 제외한 모든 프로세스는 부모 프로세스에 의해 생성됩니다.
( 조상 프로세스는 부팅 시 OS 차원에서 수작업으로 생성됨 )
부모 - 자식간 실행관계
부모가 자식을 생성한 후 일반적으로 자식의 종료를 기다리는 경우는 아래 그림과 같습니다.

만약 부모가 자식의 종료를 제때 받아주지 못하면 자식 프로세스는 좀비 상태가 됩니다.

좀비 프로세스 제거
좀비 프로세스가 메모리를 차지하지는 않습니다.
하지만, PCB 를 들고있기 때문에 PCB 의 낭비는 발생합니다.
이를 커널 입장에서 살펴보면..
- PCB 를 유지하기 위한 자원을 소모해야함
- 커널이 유지할 수 있는 PCB 테이블의 공간을 잡아먹음
때문에, 많은 좀비프로세스가 발생할 경우 시스템 성능에 영향을 줄 수 있습니다.
좀비 프로세스를 제거하려면
- 부모 프로세스에게 SIGCHLD 신호 보내기 → 부모 프로세스에서 wait() 호출해서 처리
- 부모에게 SIGCHLD 핸들러가 없다면.. 제거 불가능
- 부모 프로세스를 강제 종료 → 좀비를 고아 ( Orphan ) 화
- 좀비는 init 프로세스의 자식이 되고, init 이 wait() 호출해서 좀비 프로세스 제거
고아 프로세스 ( Orphan Process ) 는 부모가 먼저 종료한 자식 프로세스를 의미합니다.
부모 프로세스가 종료될 때 일반적으로
- 커널은 자식 프로세스가 있는지 확인
- 자식이 있으면, 자식 프로세스 ( 고아 ) 를 init 프로세스에게 입양
- PPID 가 1로 변경
- 혹은 모든 자식 프로세스 강제종료 할수도

다른 프로세스의 종류
-
백그라운드 프로세스 ( Background Process )
- 터미널에서 실행되었지만, 터미널 사용자와의 대화가 없는 채 실행되는 프로세스
- 포그라운드를 빼고 나머지
- 사용자와 현재 상호작용이 없는 프로세스
-
포그라운드 프로세스 ( Foreground Process )
- 내가 현재 창을 선택하고, 내 입력을 독점하는 프로세스
- 실행되는 동안 터미널 사용자의 입력을 독점하는 프로세스
-
CPU 집중 프로세스 ( CPU Intensive Process )
- 대부분의 시간을 CPU 작업을 하느라 보내는 프로세스
- CPU 속도가 성능 좌우
-
I/O 집중 프로세스 ( I/O Intensive Process )
- 입출력 작업을 하느라 대부분의 시간을 보내는 프로세스
- 입출력 장치나 윕출력 시스템의 속도가 성능 좌우
-
운영체제의 스케줄링 우선순위 : I/O 집중 프로세스 > CPU 집중 프로세스
- I/O 작업하는 동안 다른 프로세스에게 CPU 할당 가능
마지막
- 0번 프로세스
- swapper ( UNIX ) : 부팅 담당 및 init 생성
- idle ( LINUX ) , system idle process ( Windows )
- 우선 순위가 가장 낮은 프로세스
- 아무것도 안함
- 실행중인 프로세스가 1개도 없는 경우, 예외 사항들이 발생하기 때문에 이 상태에 빠지지 않기 위해 만든 프로세스 ( 실행중인 프로세스가 하나도 없으면 얘가 대신 들어가서 동작함 )
- 2번 프로세스 : kthreadd
- 커널 프로세스는 커널 공간에서만 실행하는 프로세스를 의미
- 대부분 커널 스레드 형태로 구동 ( 모든 커널 프로세스의 조상 )