티스토리 뷰

시스템프로그래밍

clone 과 fork의 차이

4whomtbts 2020. 9. 24. 02:58

clone 과 fork는 새로운 프로세스를 생성한다는 관점에서는 비슷하지만,

fork 는 사실 clone() 시스템 콜이 레이어드 되어 있는 라이브러리 함수이다.

fork와는 다르게 clone()은 자식 프로세스가 실행 컨텍스트를 호출 프로세스와 공유할 수 있게 해준다.

예를들어 메모리 공간, 파일 디스크립터 테이블, 시그널 핸들러 테이블 등을 공유한다.

clone 의 주 사용처는 공유되는 메모리 공간에서 동시에 실행되는 쓰레드 구현이다.

자식 프로세스가 clone()으로 생성되면,  가장 처음 fn(arg)라는 함수를 호출한다. 이렇게 fn 을 호출하는 것은

fork와 다른데, 아시다시피 fork를 호출하고나서는 자식 프로세스는 fork 호출 시점부터 실행을 시작하기 때문이다.

fn argument는 실행 초반에 자식 프로세스로 부터 호출되는 함수에 대한 포인터이다.

fn 함수가 리턴하면, 자식 프로세스는 종료되게 된다. fn 의 리턴 값인 int 값은 자식 프로세스의 종료 코드이다.

자식 프로세스는 exit을 호출해서 명시적으로 종료하거나, fatal signal을 받고서 종료되게 된다.

이 글을 쓴 목적이 CLONE_VFORK 가 무엇인지 공부하려고 쓴 것이니 

CLONE_VFORK만 다루고 넘어가면, Linux 2.2 부터 지원되며, CLONE_VFORK가 설정되면, 호출 프로세스는

자식 프로세스가 execve 나 exit 을 통해서 가상 메모리 리소스를 릴리즈 할 때 까지 suspend 된다.

만약에 CLONE_VFORK가 설정되지 않으면, 호출 프로세스와 자식 프로세스는 호출 후에 스케줄될 수 있으며

어플리케이션은 특정 순서를 가지는 실행에 의존해서는 안 된다.

 

'시스템프로그래밍' 카테고리의 다른 글

컨테이너 오픈소스 연구..  (0) 2020.09.26
댓글