왜 fork, join이라는 이름일까?
다들 알고 있는 걸 괜히 늦게 알아서 쓰는 건지 걱정이된다. 예전 fork() 라는 시스템 콜을 첨 접했을 때, 하필이면 왜 '포크'라는 이름을 가졌을까라는 생각을 했었다. 'fork'를 사전에서 찾아보면[1]:

v.i.
1 <강R길R가지 등이> 갈래지다, (둘로) 분기하다. The road ∼s near the river. 길은 강 근처에서 갈라져 있다.

verb, intransitive
1. To divide into two or more branches: The river forks here.

와 같이 나와있다. 우리가 흔히 떠올리는 식기구 '포크'와도 일맥상통하는 뜻이다. 이와 비슷하게, 하나의 프로세스가 둘로 갈라진다는 의미에서 fork라는 이름이 지어진 것이다. fork의 행동 - 자신과 똑같은 프로세스를 복사 - 을 본다면 아주 정확한 작명이라 할 수 있다. 반면에, Win32에서는 fork와 정확히 매칭이 되는 함수가 내가 알기로는 없다. 대신에 직접 프로세스를 '만드는' CreateProcess라는 이름으로 존재한다.

지금 간단히 POSIX pthread 소스를 들여다보고 있는데, 거기서 pthread_join 이라는 함수를 볼 수 있었다. 왜 뜬금없이 'join'이라는 단어가 등장할까라고 생각했다. 찾아보니 이 함수는 특정 스레드가 종료될 때 까지 기다리게 하는 함수인 것이었다. 왜 fork와 join이라는 이름이 지어졌는지가 명확히 이해되는 순간이었다:
그림처럼 이렇게 갈라지고 다시 합쳐지는 것이다.

굳이 딴지를 걸자면 '합쳐진다'는 개념은 최근 native thread OS에서는 좀 틀렸다고 볼 수 있다. 그러나 과거 thread라는 것이 user level library에서 지원이 되었던 것을 상기하면, 한 프로세스에서 나뉘어졌던 여러 스레드가 본래 프로세스로 돌아간다라고 볼 수도 있으므로 join이라는 단어가 적절한 의미를 가진다고 볼 수 있다. 참고로 Win32의 경우에는 thread handle을 Wait 함수를 이용해서 기다리면 된다.


참고:
[1] Excerpted from The American Heritage(r) Dictionary of the English Language, Third Edition (c) 1996 by Houghton Mifflin Company. Electronic version licensed from INSO Corporation; further reproduction and distribution in accordance with the Copyright Law of the United States. All rights reserved.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by object | 2007/01/21 03:05 | 컴퓨터 | 트랙백 | 덧글(5)
트랙백 주소 : http://minjang.egloos.com/tb/834885
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by Ego君 at 2007/01/21 03:12
아 fork와 join 함수가 왜 이리 불렸는지 이제야 이해가 가네요^^
Commented by 빛의탑 at 2007/01/21 20:12
여담이지만.. 유닉스와 윈도우즈의 프로세스 생성 정책이 다르니 동일한 fork 함수가 양쪽에 있을 수 없는게 당연한게 아닌가 생각됩니다.

유닉스(리눅스)는 부모 프로세스를 복사하여 자식 프로세스를 생성하고, 윈도우즈는 그냥 생성하니깐요. 프로세스의 메모리 내용을 그대로 복사하기 때문에
부모의 환경변수 또한 자식에게 똑같이 복사되죠. 윈도우즈는 환경변수를 레지스터라는 덩치큰 파일에 몽땅 집어넣어서 관리하기에 프로그램이 많이 설치되면
엉겨서 문제가 발생하지 않나 싶습니다.
Commented by 미친병아리 at 2007/01/21 21:13
저는 프로세스가 분리되었다가 다시 합쳐지는 것이 별로 와닿지가 않습니다.. 생성되었다가 할일 다 했으면 죽으면 된다고 생각하는지라.. 그래도 그 명칭이 왜 그렇게 지어져야 했는지는 명쾌히 설명이 되네요..
Commented by 학주니 at 2007/01/22 10:04
확실히 그 명령어의 영어뜻을 보면 그 명령이 하는 일을 대충은 알 수 있을거 같습니다.
fork - wait의 조합과 pthread_create - ptherad_join의 조합은 프로세스와 쓰레드의 동기화에 있어서 아주 중요하죠. ^^;
그리고 아마도 분리된 프로세서를 다시 합치는 이유는 프로그램 효율성때문에 프로세스를 분리시켜서 처리하고 다시 합쳐서 처리하기 위해 분리된 자식 프로세서의 값을 받아서 처리할려고 그러는거 같습니다. 부모 프로세서의 처리는 이미 나왔는데 자식이 아직 안나와서 부모 프로세서 절차가 먼저 지나가버리면 프로그램이 꼬일 수 있기 때문이겠죠.
Commented by abraxsus at 2007/01/22 16:06
유닉스의 fork semantic은 현대에서는 골치거리중에 하납니다. 뭐 COW등으로 똘똘하게 해결하긴 했지만,
그 시절엔 나름대로 이유있는 설계였었읍니다. (아마 메모리가 magnetic drum이었던가 하는 이유때문이었죠)
과거의 유물중의 하나죠.. 뭐 리눅스에서도 내부적으로는 create_process등의 함수를 씁니다.
어차피 내부적으론 윈도나 리눅스나 거기서 거기..
그리고 create/join이라는 semantic도 역시 application domain에 따라서 그 효용가치가 빛을 발합니다..
우리가 짜는 코드등은 보통 Interactive인지라 join같은거 별로 쓸일은 없지만, scientific application에서는
빛을 발하죠.. 병렬처리를 주로쓰는 그쪽분야에선 join기능은 매우 편리한 기능입니다. 벡터 연산등을 할때
연산이 병렬적으로 쫙~ 흩어졌다가 어느 한지점에서 딱 만났다가 다시 또 쫙~ 펼쳐졌다가 만나는등의 흐름이라서
join으로 연산결과를 편리하게 모았다가 다시 또 create로 나눠서 뿌리고하면 딱이죠..

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스