fork는 프로세스를 만들게 되고 프로세스간의 context switching을 하게
됩니다. 물론 어떤 스케쥴 정책을 채택하느냐에 따라서 다양한 결과가 나
타날 수 있습니다. thread역시 크게 다를 바는 없습니다. 그러나 thread
는 LWP(Light weight process)라고 부르듯이 thread는 가볍습니다. 왜 가
볍냐구요? thread는 fork에서 생성되는 프로세스가 완전히 별개인 것과 비
교해서 메모리를 공유하게 됩니다. 즉, thread는 현재 살아있는 모습을 나
타내기 위한 정보만을 갖게 됩니다. 예를 들면, 레지스터의 값과 같은 것
들이죠. 공부한지 얼마 안 지났지만 다 잊어버려서...
그래서 context switching을 위한 오버헤드가 프로세스를 중심으로 하는
것보다 더 적을 수 밖에 없습니다. 즉 가볍고 빠르다는 얘기이긴 합니다
만 더 정확하고 자세한 얘기는 다른 분들이 해주실거라 믿습니다. ^^;
Re: fork와 쓰레드의 차이점은 무엇이죠??
fork는 프로세스를 만들게 되고 프로세스간의 context switching을 하게
됩니다. 물론 어떤 스케쥴 정책을 채택하느냐에 따라서 다양한 결과가 나
타날 수 있습니다. thread역시 크게 다를 바는 없습니다. 그러나 thread
는 LWP(Light weight process)라고 부르듯이 thread는 가볍습니다. 왜 가
볍냐구요? thread는 fork에서 생성되는 프로세스가 완전히 별개인 것과 비
교해서 메모리를 공유하게 됩니다. 즉, thread는 현재 살아있는 모습을 나
타내기 위한 정보만을 갖게 됩니다. 예를 들면, 레지스터의 값과 같은 것
들이죠. 공부한지 얼마 안 지났지만 다 잊어버려서...
그래서 context switching을 위한 오버헤드가 프로세스를 중심으로 하는
것보다 더 적을 수 밖에 없습니다. 즉 가볍고 빠르다는 얘기이긴 합니다
만 더 정확하고 자세한 얘기는 다른 분들이 해주실거라 믿습니다. ^^;
즐거운 하루 되시길 바랍니다. ^^;
Re^2: fork와 쓰레드의 차이점은 무엇이죠??
쉽게 말해서....
저도 오래 되어서 틀릴 수도 있지만.....
참고하시기 바랍니다.
프로세스가 만들어지면,
데이타, 코드, 스택, 기타 세그먼트들이 메모리에 적재되죠.
프로세스가 fork가 되면,
부모의 데이타,코드,스택,..의 세그먼트를
그대로 복사를 하게 됩니다.
줄여서 부모의 메모리 맵을 그대로 자식이 통째로 복제를 합니다.
이렇게 부모에서 자식으로 포크되는 과정이 하나 있고,
그런데 쓰레드란 놈은 다르죠.
한 프로세스의 코드만 복제를 하고 나머지 데이타, 스택,...을
공유합니다.
그래서 fork가 쓰레드보다 자원 소모가 더 많고,
프로세스를 fork로 새로 하나 띄우는 것이 쓰레드보다
시간이 오래 걸리죠.
그리고, 정리 하자면, 한 프로세스 안에 한개 이상의 쓰레드가
존재하게 되는 겁니다.
그렇다면 stack은 어떤식으로 ????
thread는 stack영역도 공유한다고 하셨는데
궁금증이 생기네요.
function call시 arg를 스택에 넣고 jump를 하는데
그렇다면 두 thread(main thread, child thread)간 스택은
어떻게 나눠쓰는지 이해가 안가네요.
이것역시 context switching으로 설명이 되는것인지도 모르겠고...
아시는 분 답변좀 부탁합니다.^^*
Re^4: 그렇다면 stack은 어떤식으로 ????
자세히 알고 싶다면, 커널 공부 하시기 바랍니다.
그게 아니라면,
포크는 비용이 많이 들고, 무겁다.
쓰레드는 비용이 적게 들고, 가볍다.
라고 이해하시면 됩니다.
참고로, 리눅스에서는 너무 많은 쓰레드생성시
다른 프로세스에 비해 스케쥴링 시간을 많이 잡아 먹는
걸로 알고 있는데, 기억이 잘 안나네요. 헤헤...
댓글 달기