부모 프로세스는 자식 프로세스를 생성합니다. 이 때, 트리 구조로 프로세스를 생성합니다. 그리고 관리하기 위해서 프로세스는 생성될 때 process identifier (pid)
를 부여받습니다.
유닉스를 예로 들면,
이렇게 fork()
로 복제, exec()
로 새 프로그램 할당이 이루어집니다. 그리고 이는 트리 구조를 이룬다고 했는데,
이런 식으로 부모-자식 관계가 트리 구조를 이룹니다. C언어에서 프로세스 생성을 살펴보면
fork()
함수를 호출하면, 자식 프로세스를 생성합니다. 이 때 자식 프로세스는 부모와 모든 데이터가 동일하게 복사됩니다. Program Counter 또한 같기 때문에 자식 프로세스는 해당 코드에서 동일한 부분까지 실행됩니다.
fork()
가 호출되면 부모 프로세스에는 자식 프로세스의 pid가 저장됩니다. 그리고 자식 프로세스에는 0이 저장됩니다. 이 점을 이용하여 자식/부모 프로세스를 구분할 수 있습니다.
exec()
는 현재 프로세스 공간을 대체하겠다는 의미입니다. 즉, 프로세스 자체가 바뀝니다.
반면, CreateProcess()
함수는 자식 프로세스가 생성될 때, 새로운 주소 공간을 생성합니다.
프로세스는 마지막 명령어를 실행한 후, 운영체제에게 exit()
시스템 콜을 통해 제거합니다. 제거되면, 상태 정보를 부모 프로세스에게 전달합니다. 그 후 할당받았던 자원을 해제합니다. 부모 프로세스는 abort()
시스템 콜을 통해 자식 프로세스를 종료시킬 수 있습니다.
부모 프로세스가 없는 자식 프로세스는 존재할 수 없습니다! 따라서 프로세스가 종료되면, 후속 프로세스 모두 종료한 후에 프로세스가 종료됩니다. 이를 cascading termination
이라고 합니다.
부모 프로세스는 wait()
시스템 콜을 사용하여 자식 프로세스의 종료까지 대기할 수 있습니다.
부모가 wait()
하지 않는 자식 프로세스가 만약 종료되면, 커널은 부모 프로세스가 자식의 상태를 알고싶을 수 있기 때문에 자식이 종료되더라도 최소한의 정보(pid, status)를 유지합니다. 그리고 이러한 자식 프로세스를 zombie 프로세스라고 합니다.
만약 부모 프로세스가 wait()
없이 종료되면, 프로세스는 orphan 이 됩니다.
즉,
wait()
이 없는 상태에서 부모가 먼저 종료되면 자식 프로세스는 orphan, 자식이 먼저 종료되면 zombie 입니다.
안드로이드 운영체제에서는 메모리와 같은 자원을 회수하기 위해 프로세스를 종료시킵니다. 다음 순서로 프로세스를 보존시킵니다.
- Foreground process
- Visible process
- Service process
- Background process
- Empty process
이래서 !! 안드로이드의 경우에는 백그라운드 프로세스가 자꾸 꺼지는 이유가 바로 자원 회수를 위해 운영체제가 지속적으로 종료시키기 때문... 이었습니다.
크롬 브라우저는 3개의 프로세스를 사용하는 멀티-프로세스 프로그램 입니다.
따라서 하나의 웹사이트가 문제를 일으켜도, 다른 탭의 프로세스에는 영향을 주지 않습니다.