[운영체제]Fork & Exec

임정환·2023년 9월 8일
0

유닉스에서 일련의 프로세스 실행흐름을 따라가보자

Process

파일 시스템에 저장되어있는 실행 가능 바이너리 ( exe ) 가 메모리에 올라와있는 상태를 "Process"라고 부른다. 그러면, Linux에서 어떻게 프로그램이 프로세스가 될 수 있는지 생각해보자

운영체제 부팅

일단 , 컴퓨터에 전원이 들어오게 되면 BIOS가 실행되게 되고 초기 512바이트 ( 이하 , 부트섹터 )를 메모리에 적재하게 된다. 예전에야 , 운영체제의 용량이 작았기에 곧바로 운영체제가 메모리에 적재될 수 있었지만 현대의 운영체제는 상당히 큰 용량을 자랑하기에 512바이트로 해결할 수가 없다.
적재된 부트섹터는 다시 부트로더를 적재한다. 이후 , 부트로더가 커널을 메모리에 적재해야 비로서 부팅이 완료되는 것...!

Unix Processes

유닉스의 모든 프로세스는 무수한 fork의 반복으로 인해 , tree구조를 가지게 된다.
예를들어보자면 , bash쉘에서 특정 실행바이너리의 실행을 요청하면 쉘은
fork를 통해서 새로운 프로세스를 생성한다. Child는 실행을 요청받은 바이너리를 exec 시스템 콜을 통해서 해당 프로세스로 덮어씌어지게 된다. 이것이 , 프로그램이 프로세스가 되어 메모리에 올라오기까지의 일련의 과정이다.

Init

일단 운영체제는 메모리에 적재되면 , Init 을 통해서 최초의 프로세스를 만들게 된다. 동시에 , 커널이 직접 실행하는 유일한 프로세스이기도 하다.

Init을 통해 위와 같은 초기 제반설정을 진행하게 된다. 이후 , 시스템의 모든 프로세스는 Init으로 생성된 프로세스의 Child가 되게 된다.

Fork

이제 자식 프로세스를 생성할 때 , fork 시스템콜을 통하여 프로세스를 만들어 줄 수 있다. 자식은 프로세스는 부모 프로세스의 모든 상태를 그대로 가지고 부모와 병렬적으로 실행되게 된다.그럼 이제 , Init 프로세스는 수 많은 Child를 fork하며 이러한 fork로 인한 프로세스의 생성과 종료를 OS는 추적하면서 모니터링 한다. 물론 , fork된 자식 프로세스가 또 다른 자식을 fork하는 것도 가능하다. 그렇기에 , 다들 유닉스의 프로세스를 tree구조라고 표현한다.

Exec

자식 프로세스를 만드는 fork와는 다르게 , exec는 현재의 프로세스를 실행하고자하는 실행 바이너리로 덮어씌운다. 이제 조금 이해가 된다 , 만일 init 프로세스에서
fork가 아닌 exec를 하게된다면 해당 프로세스가 덮어씌어지고 커널 패닉이 일어날 것!!

Exit

이제 프로세스가 terminate상태에 도달하게되면 , exit 시스템 콜을 발생시킨다. 가지고 있는 모든 자원을 OS에게 반납하며 프로그램이 종료되게된다.

profile
CS 박제

0개의 댓글

관련 채용 정보