목차
1. Alarm::WaitUntil() 구현
A. 설계 및 디자인
B. 루틴에 대한 설명
C. 소스 코드
2. Thread::Join()의 구현
A. 설계 및 디자인
B. 루틴에 대한 설명
C. 소스코드
A. 설계 및 디자인
B. 루틴에 대한 설명
C. 소스 코드
2. Thread::Join()의 구현
A. 설계 및 디자인
B. 루틴에 대한 설명
C. 소스코드
본문내용
tThread가 부모Thread. 따라서 currentThread의 자식List에 this
thread 추가.
-this thread의 부모로 currentThread를 저장
3) Thread::Join()
-this thread의 상태가 ZOMBIE이면 return한다.
-부모Thread인 kernel->currentThread를 BLOCKED상태로 바꾸고 스케줄러의
NextThread로 context switch한다.
-Thread에 bool joined을 멤버변수로 둬서 둬서 부모가 join을 실행하면 자식은 부모
가 join을 실행했다는 증거로 이 변수를 TRUE로 만든다.
4) Thread::Finish()
-joined가 TRUE이면 부모가 BLOCKED상태라는 말이므로 다시 READY상태로 바꿔서
스케줄러에 넣음
-자신의 자식List를 비우면서 자식 중에 ZOMBIE인 것은 메모리 해제하고, 동작 중인
것은 자신의 부모로 부모를 변경한다.
-자신의 부모가 최상위 Thread이면 자신이 context switch되면서 메모리 해제가 되게
Sleep(TRUE)를 호출하고 그렇지 않으면 메모리 해제는 되지 않게 하면서 자신의 상
태를 ZOMBIE로 바꿀 수 있도록 Sleep(FALSE, TRUE)를 호출한다
5) Thread::Sleep(bool finishing, bool makeZombie = false)
-finishing이 TRUE이면 context switch를 하며 메모리에서 해제. FALSE이면 Thread
의 상태 변경 후 context switch
-makeZombie가 TRUE면 상태를 ZOMBIE로, 그렇지 않으면 BLOCKED로 변경한다 -우리의 criteria를 보존하기 위해서는 finishing과 makeZombie가 동시에 TRUE일 수
는 없다.(좀비이면서 메모리에서 해제되어 버리면 안된다.)
C. 소스코드
Thread::Join(){
DEBUG(dbgThread, "called join -_- " << this->name);
ASSERT (this != kernel->currentThread);// this means child, currentThread means parent
ASSERT (parent == kernel->currentThread);
if (this->status == ZOMBIE) return;
joined = true;
Thread *nextThread;
IntStatus oldlevel = kernel->interrupt->SetLevel(IntOff);
kernel->currentThread->setStatus(BLOCKED);
while( (nextThread = kernel->scheduler->FindNextToRun()) == NULL )
kernel->interrupt->Idle();
kernel->scheduler->Run(nextThread, FALSE);
(void) kernel->interrupt->SetLevel(oldlevel);
}
thread 추가.
-this thread의 부모로 currentThread를 저장
3) Thread::Join()
-this thread의 상태가 ZOMBIE이면 return한다.
-부모Thread인 kernel->currentThread를 BLOCKED상태로 바꾸고 스케줄러의
NextThread로 context switch한다.
-Thread에 bool joined을 멤버변수로 둬서 둬서 부모가 join을 실행하면 자식은 부모
가 join을 실행했다는 증거로 이 변수를 TRUE로 만든다.
4) Thread::Finish()
-joined가 TRUE이면 부모가 BLOCKED상태라는 말이므로 다시 READY상태로 바꿔서
스케줄러에 넣음
-자신의 자식List를 비우면서 자식 중에 ZOMBIE인 것은 메모리 해제하고, 동작 중인
것은 자신의 부모로 부모를 변경한다.
-자신의 부모가 최상위 Thread이면 자신이 context switch되면서 메모리 해제가 되게
Sleep(TRUE)를 호출하고 그렇지 않으면 메모리 해제는 되지 않게 하면서 자신의 상
태를 ZOMBIE로 바꿀 수 있도록 Sleep(FALSE, TRUE)를 호출한다
5) Thread::Sleep(bool finishing, bool makeZombie = false)
-finishing이 TRUE이면 context switch를 하며 메모리에서 해제. FALSE이면 Thread
의 상태 변경 후 context switch
-makeZombie가 TRUE면 상태를 ZOMBIE로, 그렇지 않으면 BLOCKED로 변경한다 -우리의 criteria를 보존하기 위해서는 finishing과 makeZombie가 동시에 TRUE일 수
는 없다.(좀비이면서 메모리에서 해제되어 버리면 안된다.)
C. 소스코드
Thread::Join(){
DEBUG(dbgThread, "called join -_- " << this->name);
ASSERT (this != kernel->currentThread);// this means child, currentThread means parent
ASSERT (parent == kernel->currentThread);
if (this->status == ZOMBIE) return;
joined = true;
Thread *nextThread;
IntStatus oldlevel = kernel->interrupt->SetLevel(IntOff);
kernel->currentThread->setStatus(BLOCKED);
while( (nextThread = kernel->scheduler->FindNextToRun()) == NULL )
kernel->interrupt->Idle();
kernel->scheduler->Run(nextThread, FALSE);
(void) kernel->interrupt->SetLevel(oldlevel);
}
소개글