본문 바로가기

잡다한 IT/운영체제

fork , vfork , clone

fork , vfork, clone 의 특징


fork - 프로세스를 하나 더 생성한다. 과거에는 부모의 정보를 모두 복사해서 프로세스 생성에 시간이 오래 걸렸다. 하지만 최근에는 COW (Copy On Write) 라는 방식으로 쓰기가 일어날 떄만 복사하여 문제점을 해결했다.


vfork - 프로세스를 하나 더 생성하는 방식으로, fork 과 같다. 하지만 fork 나 vfork 는 결국 최종적으로 커널 내부에서 do_fork 함수를 호출하는데, 이때 vfork 일 경우에는 새로 생성된 프로세스가 exit 이나 exec 를 실행하기 전까지는 블락을 시킨다.


(참고 사이트 : http://pinocc.tistory.com/2 )


clone - 프로세스가 아닌 쓰레드를 생성한다. 쓰레드는 부모와 자원을 공유하기 때문에 LWP(light weight process) 가 되므로, 효율성이 높다.



clone , fork, vfork, pthread_create 는 모두 최종적으로 커널 내부에서 do_fork 함수를 실행한다. 리눅스 입장에서 본다면 모두 '태스크'를 생성하기 때문이다. fork 는 부모 태스크와 비교적 덜 공유하는 태스크이고, clone 은 부모 태스크와 비교적 많이 공유하는 태스크로 보기 때문이다. 즉, do_fork 함수에서 최종적으로 부모와 얼마나 많이 공유할지를 지정해줌으로서 fork 와 clone 의 차이가 발생한다.


그리고 이러한 태스크들은 모두 task_struct 구조체를 생성한다. 프로세스가 생기던, 쓰레드가 생기던 task_struct 를 가지게 된다. 그렇다면 어떻게 쓰레드와 프로세스를 구분할 수 있을까? 이에 대한 대답으로 리눅스는 tgid ( Thread Group ID) 라는 개념을 도입했다.


태스크가 생성되면 태스크는 유일한 pid를 갖게 된다. 그래서 만약 프로세스로 생성된 태스크는 tgid = pid 가 되므로, tgid 도 유일한 값이 된다. 하지만 쓰레드로 생성된 태스크는 tgid = 부모의 pid 가 되므로, 같은 부모의 쓰레드들은 동일한 tgid 를 갖게 되므로서 자원을 공유할 수 있게 되었다.


(참고 서적 - 리눅스 커널 내부구조)

반응형

'잡다한 IT > 운영체제' 카테고리의 다른 글

물리 메모리 관리  (0) 2018.05.04
스케줄링 고려할 점  (0) 2018.05.02
set-associative cache  (0) 2018.04.24
디바이스 드라이버와 디바이스 컨트롤러 차이  (0) 2018.04.21
polling 과 busy waiting 차이점  (0) 2018.04.17