fork()와 vfork()의 차이점과 COW(Copy On Write)

아폴로 2013.05.02 21:07 조회 수 : 8340 추천:1

교재 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


번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2197
1585 Linux Device Model [2] file 김민호 2011.05.22 8459
1584 system_call 의 swapgs 인스트럭션에 대하여 [2] 지현구 2007.09.16 8438
» fork()와 vfork()의 차이점과 COW(Copy On Write) [1] 아폴로 2013.05.02 8340
1582 스핀락에 대한 나름대로의 정리와 3가지 질문.. [19] 이종인 2011.04.25 8335
1581 이번주 논의 사항 [2] 남현우 2008.05.10 8202
1580 죄송합니다. [1] 송형주 2008.05.13 8106
1579 스터디 장소 예약 했습니다. [13] 장병남 2010.04.05 8067
1578 [투표]이번주 모임 장소 투표해주세요. [15] 나영찬 2010.04.05 8014
1577 init_task의 thread info의 cpu값 설정. [8] 유경환 2011.10.21 8010
1576 ARM TCM Tightly Couple Memory a 2010.04.10 7954
1575 어제 sched_init()을 끝냈습니다. [1] 윤석훈 2010.08.22 7921
1574 [의미] Memory Barrier [10] 맥주 2007.12.17 7890
1573 ARMv8 아키텍쳐 관련 읽을거리 [3] K 2013.05.06 7829
1572 namespace file 유강희 2011.06.10 7824
1571 어제는 모두 잘 들어가셨나요'ㅅ' ㅎㅎㅎ [3] file 조은지 2010.04.11 7710
1570 2012.4.14 스터디 [6] 이한울 2012.04.14 7695
1569 smdk2440보드 회로도. [3] 김희근 2008.12.17 7690
1568 4/3 ARM C Study group 회의 내용 [10] file 강효민 2010.04.03 7670
1567 이제 start_kernel()에 함수가 38개밖에 안남았네요.. [4] 윤석훈 2010.11.30 7634
1566 리눅스 커널 심층분석 (4장 ~9장) 요약부분 [1] file 박재성 2011.06.03 7631
XE Login