교재 57쪽의 fork, vfork, COW 에 관한 자료가 있어서 가져왔습니다.^^
1. fork()란?
- 유닉스/리눅스에서는 새로운 프로세스를 생성하기 위해서 fork() 함수를 호출합니다.
호출을 통해 새로 생성된 프로세스를 흔히 자식 프로세스(Child Process)라고 호출한 프로세스를 부모 프로세스(Parent Process)라고 합니다.
- fork() 함수는 특성상 한번 호출을 통해 부모 프로세스와 자식 프로세스에게 두번 리턴되어지게 됩니다.
부모 프로세스에게는 자식 프로세스의 ID를 리턴하고, 자식 프로세스에게는 0을 리턴합니다.
자식 프로세스는 부모의 PID를 알고 싶을때는 getpid()를 호출할 수 있습니다.
2. vfork()란?
- 보통 fork() 함수의 호출을 통해 자식 프로세스의 데이터 부분은 부모 프로세스의 데이터 부분의 복사본을 갖게 됩니다.
fork()의 일반적인 사용형태를 보면 fork() 이후에 exec() 의 호출을 통해 새로운 바이너리로 교체하여 수행을 합니다.
따라서 fork()를 통해 부모 프로세스의 복사본을 만드는 작업은 불필요한 오버헤드가 되며,
이런 경우에 사용하는 시스템 호출이 바로 vfork()라고 합니다.
3. 개선된 fork()
- 하지만, fork 가 항상 메모리를 복사한다는 것은 예전 방식이고,
현재 리눅스에서 fork 는 COW(copy on write) 기법을 사용하여 프로세스 생성시 모든 자원을 복사하는 것이 아니고, 변경사항이 생길 경우에만 복사하도록 구현되어 있다고 합니다.
따라서 현재 fork 가 갖는 단점은 부모 프로세스의 페이지 테이블을 복사하는 것과 자식 프로세스를 기술하기 위한 프로세스 구조체를 할당받는 시간과 메모리 뿐이라고 합니다.
# 참고사이트 : http://unius.tistory.com/entry/fork-vs-vfork#footnote_link_309_1
http://pinocc.tistory.com/m/entry/fork-%EC%99%80-vfork-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
4.COW(Copy On Write)?
- vfork()처럼 부모 프로세스의 데이터 부분에 대한 참조만 소유하고 있다가 실제 변경이 발생하는 시점에 복사를 하여 사용하는 방식이라고 합니다.
# 참고사이트: http://talkingaboutme.tistory.com/451
.
감사합니다 도움이 많이되었어요