[PintOS: Priority-based Context Switching Query]
PintOS의 busy waiting 방식을 개선한 후, 'alarm-priority' 테스트 케이스를 통과하기 위해 우선순위를 고려한 컨텍스트 스위칭을 구현하는 과정에서 궁금증이 생겼습니다.
문제 상황은 다음과 같습니다:
ready_list는 내림차순으로 정렬되는 것으로 보입니다.Running 스레드와 ready_list의 첫 번째 스레드 중 우선순위가 높은 스레드를 Running 상태로 전환하는 로직을 구현하고 있습니다. 특히, 이 로직을 저희가 만든 wake_up 함수에서 실행할 경우 문제가 발생하는 것 같습니다.create_thread, set_priority, thread_wakeup 세 가지 함수에 구현했습니다. 여기서 thread_wakeup 함수는 timer_interrupt() 내에서 조건에 맞는 스레드를 깨우는 역할을 합니다.문제는, 위 세 함수에서 컨텍스트 스위칭을 수행할 때 테스트 케이스가 실패하며, create_thread와 set_priority만 사용할 경우에는 테스트가 통과한다는 점 입니다. 이는 BLOCK 상태에서 READY 상태로 전환되는 스레드가 ready_list에 추가될 때, 해당 스레드의 우선순위가 높다면 즉시 Running 상태로 전환될 수 있어야 한다고 이해했기 때문에 혼란스럽습니다.
질문:
thread_wakeup()을 실행할 때 컨텍스트 스위칭을 수행하면 왜 문제가 발생하는 걸까요?thread_wakeup()으로 깨어난 스레드의 우선순위가 높을 경우, 바로 Running 상태로 전환되지 않는 이유는 무엇인가요?스위칭 함수 코드:
void thread_switching(void) {
int now_priority = thread_get_priority();
struct list_elem *e = list_front(&ready_list);
struct thread *ready_front = list_entry(e, struct thread, elem);
int new_priority = ready_front -> priority;
if ( new_priority > now_priority) {
thread_yield(); // 스위칭 진행
}
}
void thread_wakeup(int64_t ticks) {
if (ticks < min_wake_tics)
return;
struct list_elem *e = list_begin(&sleep_list);
while (e != list_end(&sleep_list)) {
struct thread *t = list_entry(e, struct thread, elem);
if (t->wake_up_time <= ticks) {
e = list_remove(e);
thread_unblock(t);
e = list_prev(e);
} else {
e = list_next(e);
}
}
}