프로세스 생애 | 프로세스가 만들어지고 소멸되는 과정

설현아·2025년 4월 23일
post-thumbnail

프로세스는 어떻게 만들어지고 종료될까?

fork()는 실행 중인 프로세스를 복제하는 시스템 콜이며, 프로세스는 fork()에 의해 만들어진다. 부모와 새롭게 생성된 자식 간에 서로 다른 PID를 가진다.

프로세스도 트리 구조라고 생각할 수 있다.
부모 프로세스에서 fork를 통해 동일한 구조의 자식 프로세스가 생기기 때문이다.

자식 프로세스가 종료되면 운영체제는 그 종료 정보를 프로세스 테이블에 잠시 보관한다. 그런 다음, 부모가 wait()으로 그 정보를 가져갈 때까지 기다리게 된다.

하지만 부모 프로세스가 자식 프로세스를 잊고 청소(wait)를 하지 않는다면 이 프로세스 테이블이 꽉 차면서 overflow가 일어나게 된다. 이 때 청소되지 않은 자식 프로세스를 좀비 프로세스라고 하고, 좀비 프로세스는 리소스를 차지하게 되며 시스템 자원의 고갈을 야기한다.

이를 방지하기 위해서 프로세스 중에 가장 루트 프로세스가 존재한다. init 프로세스다.
init 프로세스는 고아가 된 모든 자식들을 대신 청소해준다.

위와 같이 init 프로세스의 PID는 1번이며 모든 프로세스의 조상이다. 내 맥북에서는 /sbin/launchd 프로세스가 init 프로세스로 동작한다.

지금 실행되고 있는 대부분의 프로세스 또한, /sbin/launchd 프로세스를 fork() 하고 exec() 함수로 새 프로그램을 현재 프로세스의 컨텍스트 내에 로드하고 실행한다.(덮어씀)

이렇게 되면 PID는 유지되지만, 코드, 데이터, 스택 전부 새롭게 바뀐다.


프로세스의 상태

https://wikidocs.net/231651

준비 Ready

프로세스 생성 직후에 CPU 실행을 대기한다.

실행 Running

CPU에서 실제로 실행 중인 상태로 커널에 의해 스케줄된다.

중지 Stopped

CPU에서 실행이 정지된 상태로 스케줄 되지 않는다.

SIGSTOP, Ctrl+Z, sleep 등으로 일시 중단될 수 있다. 이 상태에서는 SIGCONT 시그널을 받을 떄까지 정지 상태로 남아있는다.

종료 Terminated

exit() 호출 후, 프로세스를 영구적으로 정지한다. 하지만 부모가 아직 wait()를 하기 전이다.

소멸 Reaped

부모가 wait()을 하며 프로세스 목록에서 정보까지 소멸된다.

profile
어서오세요! ☺️ 후회 없는 내일을 위해 오늘을 열심히 살아가는 개발자입니다.

0개의 댓글