목차
1. 쓰레드를 위한 자료구조
2. 쓰레드 스케줄링
3. 시그널 처리(Signal Handling)
4. I/O 관리
5. 쓰레드의 동기화(Synchronization)
6. 쓰레드 관리자를 위한 자료구조
7. 쓰레드 관리자 인터페이스
2. 쓰레드 스케줄링
3. 시그널 처리(Signal Handling)
4. I/O 관리
5. 쓰레드의 동기화(Synchronization)
6. 쓰레드 관리자를 위한 자료구조
7. 쓰레드 관리자 인터페이스
본문내용
bool sigarrived : 시그널이 도착했는지 여부.
·static int tickitvl : clock tick 간격을 나타냄.
·static int maxidlecnt : idle 상태의 최대 쓰레드 수.
·static int cnt2sleep : sleep을 위한 카운터.
·static int sleeptime : sleep 시간.
7. 쓰레드 관리자 인터페이스
·static void init(InitAttr& initattr)
쓰레드 관리자를 초기화시킨다.
。 initattr.nthreads 동시에 수행되는 쓰레드의 개수
。 initattr.stacksize 각 쓰레드에 할당되는 스택의 크기
。 initattr.mainentry 각 쓰레드가 처음으로 수행되는 함수의 시작부분
。 initattr.tickitvl 내부 쓰레드 타이머의 세밀도
。 initattr.maxidletime 쓰레드 시스템 전체에서의 최대 idle 시간
。 initattr.sleeptime 쓰레드 시스템의 휴면기간
쓰레드 관리자는 이때 nthreads 개의 쓰레드 제어블럭을 생성/초기화 시켜 풀로 관리한다. 이때, 각 쓰레드를 위한 스택을 stacksize*sizeof(int) 바이트의 크기로 잡아 초기화시킨다. 이렇게 초기화된 쓰레드 중 하나를 할당하여, 그것을 시작지점을 entry로 세팅하여, 이것을 맨 처음 실행시킬 쓰레드로 지정한다.
·static void gothreadworld(void) : 시스템 쓰레드를 동작시킨다.
·static ThreadDesc* create
(int prior, ThreadEntry e, void* arg =0, int type = USERTHREAD)
: 쓰레드 하나를 생성한다. 이때 생성되는 쓰레드는 prior 의 우선 순위 갖게되고, 처음 수행되는 함수는 e에 의해 지정되고, 인자는 arg로, 타입은 type으로 전달된다. LONGJMP()를 부르게 되면 여기에서 저장해 놓은 프로그램 카운터, 스택 포인터 등을 복구하게 되고, 그러면 문맥 교환이 이루어져 이전 의 상태부터 계속 실행되는 것이다. 기본적으로 쓰레드가 처음 생성 시에 상태는 SUSPENDING의 상태를 갖는다. 이후 resume()을 수행해주어야만 실행되게 된다.
·static void exit(int xcode =0)
: 먼저 가장 높은 우선 순위를 획득한다. 그리고 나서, 쓰레드가 갖고 있는 영역을 반환하고, 다음으로 수행될 쓰레드를 위해 우선 순위 재조정하여 준다. 현재의 쓰레드가 종료하기를 기다리고 있는 쓰레드가 있으면 이를 깨워 대기 큐에 집어넣어 준다. 그리고 다음에 실행될 쓰레드를 디스패치(dispatch)하게 된다. .F static int kill(ThreadDesc* id, int xcode) id로 건네 받은 쓰레드를 없앤다. .F static void killall(int xcode) 모든 사용자 쓰레드를 없앤다.
·void resume(ThreadDesc* thread) : 쓰레드를 자신의 우선 순위에 맞는 스케줄러 대기 큐에 삽입한다. 이때 삽입되는 쓰레드의 우선 순위가 대기 큐의 모든 쓰레드보다 높다면, reschedule()을 불러서 스케줄이 다시 수행된다.
·static void suspend(void) : 수행중인 쓰레드를 SUSPENDING 상태로 만든다. 준비 큐에 있는 새로운 쓰레드를 디스패치하고, 우선 순위 조정해준다.
·static void reschedule(void)
: 수행되고 있는 쓰레드를 대기 큐에 삽입하고, 다른 쓰레드를 수행시킨다. 이때 수행 중이던 쓰레드의 문맥을 저장한다.
·static void delay(int millisec)
: 쓰레드에 millisec만큼의 sleep 시간을 할당한 후, 지연 리스트에 추가한 다음 suspend()함수를 수행하여 sleep 시킨다.
·static ThreadDesc* self(void) : 현재 수행중인 쓰레드 제어블럭을 반환한다.
·static int threadno(void) : 현재 수행중인 쓰레드 제어블럭의 리스트 번호를 반환한다.
·static ThreadDesc* threadno(int threadno)
: 인자로 주어진 threadno를 가진 쓰레드 제어블럭을 반환한다.
·static int threadno(ThreadDesc* thread)
: 인자로 주어진 thread 쓰레드 제어블럭의 리스트 번호를 반환한다.
·int priority(ThreadDesc* thread, int newPri)
: 쓰레드의 우선 순위를 newPri로 변경시킨다. 이때 newPri 의 값이 시스템에서 허용하는 최고 우선 순위보다 높은 경우에는 시스템의 허용하는 최고 값으로 보정되고, 새로운 우선 순위를 대기 큐 및 수행 중인 쓰레드의 그것보다 높은 경우에는 재 스케줄링이 수행된다.
·static ExitHandler atexit(ExitHandler xh) : exit 핸들러 루틴을 설정한다.
·static void setsighandler(int signo, SigHandler sighan)
: 시그널을 처리하는 루틴을 등록한다. 보다 자세한 설명은 sighand절을 참고하기 바란다.
·static void clrsighandler(int signo) : 시그널을 처리하는 루틴을 해제한다.
·static int dispatch(void)
: 대기 큐에서 적당한 쓰레드를 선택하여, 그 쓰레드를 수행시킨다. 이때 수행 중이던 쓰레드의 문맥은 저장하지 않는다.
·static void contextswitch(bool goreadyQ=true)
: 대기 큐에서 적당한 쓰레드를 선택하여, 그 쓰레드를 수행시킨다. 이때 수행 중이던 쓰레드의 문맥은 저장된다.
·static void adjustmaxpriority(void ) : 대기 큐에 있는 쓰레드들로부터 최고의 우선 순위를 다시 구한다.
·static void sigdeliver(void) : 지금까지 들어온 시그널을 처리한다. 보다 자세한 설명은 sighand절을 참고하기 바란다.
·static int tickitvl : clock tick 간격을 나타냄.
·static int maxidlecnt : idle 상태의 최대 쓰레드 수.
·static int cnt2sleep : sleep을 위한 카운터.
·static int sleeptime : sleep 시간.
7. 쓰레드 관리자 인터페이스
·static void init(InitAttr& initattr)
쓰레드 관리자를 초기화시킨다.
。 initattr.nthreads 동시에 수행되는 쓰레드의 개수
。 initattr.stacksize 각 쓰레드에 할당되는 스택의 크기
。 initattr.mainentry 각 쓰레드가 처음으로 수행되는 함수의 시작부분
。 initattr.tickitvl 내부 쓰레드 타이머의 세밀도
。 initattr.maxidletime 쓰레드 시스템 전체에서의 최대 idle 시간
。 initattr.sleeptime 쓰레드 시스템의 휴면기간
쓰레드 관리자는 이때 nthreads 개의 쓰레드 제어블럭을 생성/초기화 시켜 풀로 관리한다. 이때, 각 쓰레드를 위한 스택을 stacksize*sizeof(int) 바이트의 크기로 잡아 초기화시킨다. 이렇게 초기화된 쓰레드 중 하나를 할당하여, 그것을 시작지점을 entry로 세팅하여, 이것을 맨 처음 실행시킬 쓰레드로 지정한다.
·static void gothreadworld(void) : 시스템 쓰레드를 동작시킨다.
·static ThreadDesc* create
(int prior, ThreadEntry e, void* arg =0, int type = USERTHREAD)
: 쓰레드 하나를 생성한다. 이때 생성되는 쓰레드는 prior 의 우선 순위 갖게되고, 처음 수행되는 함수는 e에 의해 지정되고, 인자는 arg로, 타입은 type으로 전달된다. LONGJMP()를 부르게 되면 여기에서 저장해 놓은 프로그램 카운터, 스택 포인터 등을 복구하게 되고, 그러면 문맥 교환이 이루어져 이전 의 상태부터 계속 실행되는 것이다. 기본적으로 쓰레드가 처음 생성 시에 상태는 SUSPENDING의 상태를 갖는다. 이후 resume()을 수행해주어야만 실행되게 된다.
·static void exit(int xcode =0)
: 먼저 가장 높은 우선 순위를 획득한다. 그리고 나서, 쓰레드가 갖고 있는 영역을 반환하고, 다음으로 수행될 쓰레드를 위해 우선 순위 재조정하여 준다. 현재의 쓰레드가 종료하기를 기다리고 있는 쓰레드가 있으면 이를 깨워 대기 큐에 집어넣어 준다. 그리고 다음에 실행될 쓰레드를 디스패치(dispatch)하게 된다. .F static int kill(ThreadDesc* id, int xcode) id로 건네 받은 쓰레드를 없앤다. .F static void killall(int xcode) 모든 사용자 쓰레드를 없앤다.
·void resume(ThreadDesc* thread) : 쓰레드를 자신의 우선 순위에 맞는 스케줄러 대기 큐에 삽입한다. 이때 삽입되는 쓰레드의 우선 순위가 대기 큐의 모든 쓰레드보다 높다면, reschedule()을 불러서 스케줄이 다시 수행된다.
·static void suspend(void) : 수행중인 쓰레드를 SUSPENDING 상태로 만든다. 준비 큐에 있는 새로운 쓰레드를 디스패치하고, 우선 순위 조정해준다.
·static void reschedule(void)
: 수행되고 있는 쓰레드를 대기 큐에 삽입하고, 다른 쓰레드를 수행시킨다. 이때 수행 중이던 쓰레드의 문맥을 저장한다.
·static void delay(int millisec)
: 쓰레드에 millisec만큼의 sleep 시간을 할당한 후, 지연 리스트에 추가한 다음 suspend()함수를 수행하여 sleep 시킨다.
·static ThreadDesc* self(void) : 현재 수행중인 쓰레드 제어블럭을 반환한다.
·static int threadno(void) : 현재 수행중인 쓰레드 제어블럭의 리스트 번호를 반환한다.
·static ThreadDesc* threadno(int threadno)
: 인자로 주어진 threadno를 가진 쓰레드 제어블럭을 반환한다.
·static int threadno(ThreadDesc* thread)
: 인자로 주어진 thread 쓰레드 제어블럭의 리스트 번호를 반환한다.
·int priority(ThreadDesc* thread, int newPri)
: 쓰레드의 우선 순위를 newPri로 변경시킨다. 이때 newPri 의 값이 시스템에서 허용하는 최고 우선 순위보다 높은 경우에는 시스템의 허용하는 최고 값으로 보정되고, 새로운 우선 순위를 대기 큐 및 수행 중인 쓰레드의 그것보다 높은 경우에는 재 스케줄링이 수행된다.
·static ExitHandler atexit(ExitHandler xh) : exit 핸들러 루틴을 설정한다.
·static void setsighandler(int signo, SigHandler sighan)
: 시그널을 처리하는 루틴을 등록한다. 보다 자세한 설명은 sighand절을 참고하기 바란다.
·static void clrsighandler(int signo) : 시그널을 처리하는 루틴을 해제한다.
·static int dispatch(void)
: 대기 큐에서 적당한 쓰레드를 선택하여, 그 쓰레드를 수행시킨다. 이때 수행 중이던 쓰레드의 문맥은 저장하지 않는다.
·static void contextswitch(bool goreadyQ=true)
: 대기 큐에서 적당한 쓰레드를 선택하여, 그 쓰레드를 수행시킨다. 이때 수행 중이던 쓰레드의 문맥은 저장된다.
·static void adjustmaxpriority(void ) : 대기 큐에 있는 쓰레드들로부터 최고의 우선 순위를 다시 구한다.
·static void sigdeliver(void) : 지금까지 들어온 시그널을 처리한다. 보다 자세한 설명은 sighand절을 참고하기 바란다.