목차
프로세스 생성 과정
프로세스의 생명 주기는 크게 생성, 준비, 실행, 대기, 완료(종료)의 단계로 구성됩니다
1. 생성
•
프로세스의 생성은 사용자의 요청이나 시스템의 필요에 의해 시작됩니다. 이 단계에서 운영체제는 프로세스에 필요한 초기 메모리 공간을 할당하고, 프로세스 제어 블록을 초기화하여 프로세스에 대한 중요 정보(프로세스 ID, 상태, 우선순위 등)를 관리합니다.
프로세스 생성 과정을 자세히 조사해 보면 대부분 UNIX/LINUX 체제의 fork(), exec() 생성 과정에 대해 설명하고 있습니다. 하지만 유니티 개발자들은 일반적으로 윈도우나 안드로이드 같은 생산성을 중심으로 한 운영 체제에서 개발을 주로 합니다.
•
그러므로 이 부분은 아래에 있는 좀비 프로세스 설명처럼 간단하게 이해하고 넘어가는 것이 좋습니다.
유닉스/리눅스 : 복제(fork), 덮어쓰기(exec) 해당 운영체제에서는 프로세스를 만들 때, 이 두 가지를 조합해서 사용합니다. fork는 현재 프로세스를 그대로 복제해서 자식 프로세스를 만드는 과정입니다. exec은 그렇게 만들어진 프로세스의 내용을 새로운 프로그램으로 덮어쓰는 과정이죠.
즉, 새 프로그램을 실행할 때는 fork로 복제한 뒤 exec으로 갈아끼우는 순서로 진행됩니다.
윈도우 : 윈도우는 CreateProcess로 처음부터 새 프로세스를 만듭니다. fork처럼 복제하는 방식이 아니라서, 메모리와 상태를 처음부터 독립적으로 갖게 되죠.
안드로이드는 리눅스 기반이라 내부적으로는 fork를 사용합니다. 다만 그 과정을 시스템이 대신 처리해주죠. 즉, 앱 개발자가 자식 프로세스를 직접 다룰 일이 거의 없다는 점이 유닉스/리눅스와의 차이입니다.
2. 준비
•
생성된 프로세스는 실행을 위해 준비 상태로 전환됩니다. 이 상태의 프로세스는 CPU 할당을 기다리고 있으며, 준비 큐에서 실행을 위한 차례를 기다립니다.
3. 실행
•
준비 상태의 프로세스 중 하나가 CPU 스케줄러에 의해 선택되면 실행 상태로 전환됩니다. 이 단계에서 프로세스는 실제로 CPU를 할당받아 명령어를 실행하기 시작합니다.
4. 대기
•
실행 중인 프로세스가 입출력 작업 같은 이벤트를 기다려야 할 필요가 있을 경우, 대기 상태로 전환됩니다. 대기 상태의 프로세스는 해당 이벤트가 완료될 때까지 CPU를 할당받지 않습니다.
5. 완료
•
프로세스가 모든 작업을 마치고 종료되면 완료 상태로 전환됩니다. 이 단계에서 운영체제는 프로세스가 사용했던 모든 자원을 회수하고, PCB를 제거합니다.
좀비 프로세스
좀비 프로세스는 자식 프로세스가 종료되었지만, 부모 프로세스가 자식 프로세스의 종료 상태를 아직 회수하지 않아 프로세스 테이블에서 여전히 항목을 차지하고 있는 상태를 말합니다.
좀비 프로세스는 시스템 자원을 소비하지 않지만, 프로세스 테이블에서 항목을 차지하여 오버헤드를 발생시킵니다.
좀비 프로세스는 일반적으로 생산성 중심의 운영체제에서는 발생하지 않습니다.
윈도우에서는 자식 프로세스를 생성할 수 있지만, 자식 프로세스의 테이블 관리를 부모에게 위임하지 않습니다. 대신, 자식 프로세스가 종료될 때 회수됩니다.
안드로이드는 리눅스 커널 기반이라 자식 프로세스 개념 자체는 존재합니다. 실제로 앱 프로세스도 Zygote를 fork해서 만들어지죠.
다만 그 과정을 시스템이 알아서 관리하기 때문에, 앱 개발자가 직접 fork로 자식 프로세스를 만들 일은 거의 없습니다.
따라서 유니티 클라이언트 개발자는 멀티 프로세스 관리를 할 때, 좀비 프로세스를 고려하는 것이 적절하지 않습니다.
지금은 그저 C언어에서 부모 프로세스가 wait()나 waitpid()를 호출하지 않아 자식 프로세스를 제대로 회수하지 않으면 발생하는 상황이 좀비 프로세스다 라고만 알고계시면됩니다.




