User level 쓰레드 구현에 관하여..
글쓴이: kaiji75 / 작성시간: 목, 2006/09/14 - 1:01오후
User level 쓰레드 구현을 해보려고하는데요.
일단 커널은 스레드의 존재를 모르기때문에 프로세스 당 하나의 user 스택, kernel 스택이 할당되어있을 텐데요 user level 쓰레드에서 쓰레드 생성시에는필연적으로 각 쓰레드마다 user 스택, kernel 스택을 각각 할당하여야 할텐데 이것을 어떻게 처리하는지 궁금합니다.
제가 알고 있기로는 user level쓰레드는 커널의 도움업이 라이브러리단에서 쓰레드를 구현한다고 알고 있는데 아무리 생각해도 커널의 도움업이 스택할당을 어떻게 할수 있는지 감이 안잡히는군요..
결과적으로 user level 쓰레드 구현에도 커널을 도움을 받아야 하는것인지 아니면 다른 방법이 있는것인지 궁금합니다.
고수님들의 답변 부탁드립니다.
Forums:
제가 처음 유저
제가 처음 유저 쓰레드 구현을 본 것이
위스콘신 대학의 Shore 1.0 이었습니다.
소스가 open되어 있었고, (지금도 어딘가에...)
거기에 user thread 구현이 있습니다.
또한, posix thread 의 초기 버젼 (MIT의 누가 박사 학위 결과물이라고..)에
user thread 형식으로 jmpbuf를 이용한 구현이 있습니다.
가장 구하기 쉬운 형태는 예전 netscape에서 내부에서 사용하기 위해 구현된 소스코드에서
user thread만 분리한 state thread (이름이 지금은 바뀌었는지 모르겠습니다. googling...)
라는 이름으로 소스가 있었습니다.
user thread는 그냥 커널이 하는 context switching을 user mode에서
흉내내는 것 뿐입니다. 소스를 보시면 쉽게 이해하실 듯 합니다.
좋은 결과 있으시길.
PS) 저 석사 논문이 DBMS에서의 thread 구조에 관련된 것이라...조금 압니다.
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
윗분 말처럼 간단한
윗분 말처럼 간단한 방법으론 pooling 으로 CPU를 나눠 먹는게 가장 간단할것 같구요
조금더 안전하게 갈려면 jmpbuf를 사용하는게 나을것 같네요. jmpbuf에 관해선 setjmp를 보시면 됩니다.
-- 아쉬운 하루 되세요 --
-- 아쉬운 하루 되세요 --
답변감사합니다...
생각해보니 쓰레드 생성시 스택할당은 그냥 힙영역에 일정크기만큼 잡고
그 크기와 포인터를 쓰레드정보 구조체에 넣어 보관만 하면 될거 같습니다.
쓰레드 수행시에는 기존의 sp, bp 레지스터를 쓰레드정보 구조체에 있는 힙영역에 할당된 메모리영역의 포인터로 치환해주면 그 영역을 스택으로 이용하게 될꺼 같네요.
context swiching 시에는 현재 sp와 bp를 다시 현재 쓰레드 정보 구조체에 저장하고새로 수행할 쓰레드의 정보구조체에 접근하여 그것에 할당된 힙메모리 영역으로 sp,bp할당...
이런 식으로 하면 될꺼 같네요... 아닌가??
아무튼 답변 주신분들 정말 감사드립니다..
댓글 달기