좀 원천적인 질문을 드릴까 하네요....이제막 공룡책을 조금씩 보구 있는데
쓰레드의 구현방식이 굉장히 궁금해 졌습니다.
이 책을 보신분은 아시겠지만 쓰레드 모델과 관련된 이야기가 좀 나오는데
쓰레드를 커널레벨의 쓰레드와 유저레벨의 쓰레드로 나누고 그 비율에 따라
1 대 1 모델 ,다 대 1모델, 다 대 다모델, 이 있다고 합니다.
간략히 window,linux 등은 1대1모델 이라고 하고 솔라리스는 다대다모델이라고 합니다.
우리는 리눅스 커널 스터디이니 일단 리눅스커널의 쓰레드 구현방식은 프로세스와 거의
동일하죠, 결국 커널레벨 쓰레드가 곧 유저레벨 쓰레드가 되는 것이라고 알 고 있습니다.
즉 위에서 말한 1대1 모델이 되는 것이겠죠.
일단 이정도로 접어두고..
유저레벨 쓰레드....라이브러리에 의존한다고 하는데 과연 이놈은 어떤 식으로 구현이 되어 있을까요. 책에서는 커널이 유저레벨 쓰레드의 존재를 모르므로 당연히 커널의 스케쥴 입장에서는 스케쥴 대상이 되지 않는다. 유저레벨쓰레드를 커널과 연결시키는 것은 라이브러리의 몫이다~라고 간략히 정리를 해보았는데 제대로 했는지..^^;..
이 라이브러리가 커널의 도움을 받지 않고 쓰레드를 구현했다는 것인데..어떤식으로 이렇게 했을까요??..그냥 간단히 단순무식하게 생각해보면 레지스터셋(스택포인터포함)의 저장공간을 유저공간에 마련해 놓고 타이머를 이용하여 이들을 스케쥴링 하게 되는 것일까요?? (정말 간단히 타이머를 적정시간 맞춰놓고 해당인터럽트 발생시 레지스터셋 변경 과 같은 방법)
두번째로 pThread에 관련한 건데 리눅스에 pthread를 구현해놓은 라이브러리는 일대일 모델로 구현이 되어 있었을텐데 그렇다면 그냥 단순히 fork를 하는것에 지나지않는가?? 라는 의문이 드네요....
음..질문이 이상하죠 그 이유는 제가 아는바가 없기 때문이겠죠.ㅋㅋㅋㅋ
뭐 꼭 이 질문에 대한 답이 아니더라도 쓰레드에 대한 clear한 어떤 그런 것을 답해주시면 더욱 감사하겠습니다~~^^
쓰레드의 구현방식이 굉장히 궁금해 졌습니다.
이 책을 보신분은 아시겠지만 쓰레드 모델과 관련된 이야기가 좀 나오는데
쓰레드를 커널레벨의 쓰레드와 유저레벨의 쓰레드로 나누고 그 비율에 따라
1 대 1 모델 ,다 대 1모델, 다 대 다모델, 이 있다고 합니다.
간략히 window,linux 등은 1대1모델 이라고 하고 솔라리스는 다대다모델이라고 합니다.
우리는 리눅스 커널 스터디이니 일단 리눅스커널의 쓰레드 구현방식은 프로세스와 거의
동일하죠, 결국 커널레벨 쓰레드가 곧 유저레벨 쓰레드가 되는 것이라고 알 고 있습니다.
즉 위에서 말한 1대1 모델이 되는 것이겠죠.
일단 이정도로 접어두고..
유저레벨 쓰레드....라이브러리에 의존한다고 하는데 과연 이놈은 어떤 식으로 구현이 되어 있을까요. 책에서는 커널이 유저레벨 쓰레드의 존재를 모르므로 당연히 커널의 스케쥴 입장에서는 스케쥴 대상이 되지 않는다. 유저레벨쓰레드를 커널과 연결시키는 것은 라이브러리의 몫이다~라고 간략히 정리를 해보았는데 제대로 했는지..^^;..
이 라이브러리가 커널의 도움을 받지 않고 쓰레드를 구현했다는 것인데..어떤식으로 이렇게 했을까요??..그냥 간단히 단순무식하게 생각해보면 레지스터셋(스택포인터포함)의 저장공간을 유저공간에 마련해 놓고 타이머를 이용하여 이들을 스케쥴링 하게 되는 것일까요?? (정말 간단히 타이머를 적정시간 맞춰놓고 해당인터럽트 발생시 레지스터셋 변경 과 같은 방법)
두번째로 pThread에 관련한 건데 리눅스에 pthread를 구현해놓은 라이브러리는 일대일 모델로 구현이 되어 있었을텐데 그렇다면 그냥 단순히 fork를 하는것에 지나지않는가?? 라는 의문이 드네요....
음..질문이 이상하죠 그 이유는 제가 아는바가 없기 때문이겠죠.ㅋㅋㅋㅋ
뭐 꼭 이 질문에 대한 답이 아니더라도 쓰레드에 대한 clear한 어떤 그런 것을 답해주시면 더욱 감사하겠습니다~~^^
댓글 4
-
백창우
2008.03.28 02:12
-
태훈
2008.03.28 08:38
그러면 스레드 스케쥴링은 스레드 라이브러리에서 하기 때문에 커널 입장에서는 멀티 쓰레드를 실행 중인 프로세스도 하나의 프로세스로 인식하는걸로 이해하면 되는지요?
-
백창우
2008.03.28 12:47
1:M 모델에서요. 라이브러리 쓰레드, 유저레벨 쓰레드를 물어보셔서...
우리는 보통 1:1 모델을 사용하니 각 쓰레드당 하나의 TCB(Task Control Block)가 할당되고 커널의 스케줄러에서 스케줄링 되겠죠.
-
박은병
2008.03.30 01:10
음..답변 감사합니당~^^
어느정도 감은 잡히는 것 같습니다. 언제 시간되면 pthread를 좀 자세히 들여다봐야겠네요.ㅋㅋ 항상 시간을 탓하게 되네요....게으른탓..ㅜㅜ
.
그러면 그 process가 수행되겠죠?
그 process에는 쓰레드 라이브러리가 있고 쓰레드 라이브러리에 쓰레드 스케줄러가 있습니다. 일단 아무른 쓰레드도 생성하지 않았을때는 main 쓰레드만 존재하기 때문에 쓰레드 스케줄러는 main 스레드만 수행하죠.
create_thread(...) 함수를 호출하면 새로운 쓰레드의 stack이 생성되고, TCB (Thread Control Block)가 생성되고, 생성된 TCB가 쓰레드 스케줄러에 넘어가게 됩니다.
그 이후에는 스케줄링 알고리즘에 따라 FIFO, RR 등으로 동작하는거죠.
fork와는 좀 틀립니다. clone() 시스템 콜을 사용하여 light weight process를 생성하는거죠.
기본적으로는 clone() 시스템 콜을 호출해서 하기 때문에 기본 원리는 그렇다라고 말할수 있지만 새로운 쓰레드를 위한 스택 할당/제거, 동기화 매커니즘 제공, 쓰레드 속성 처리등과 같은 여러 일들을 하기 때문에 그렇게 단순하게 볼것도 아니라고 생각합니다.