Overview(확실하지 않음. 이해가 개선되는 대로 업데이트 중)
Priority preemption(한양대 자료 기준 첫 번째 priority scheduling)
Priority Scheduling-Synchronization(한양대 자료 기준 두 번쨰)
when threads are waiting for a lock, semaphore, or condition variable, the highest priority waiting thread should be awakened first.
Priority Inversion Problem(한양대 자료 기준 세 번째)
donate
함으로써 priority가 낮은 thread로 하여금 lock을 최대한 빠르게 release하게 하려는 전략이다. donate라고 하니 priority가 높은 thread가 자신의 priority를 잃게 되는 것 같이 보이지만, 사실 구현을 보면 priority가 낮은 thread의 priority를 donator의 priority로 일시적으로 격상시켜주는 것을 말한다. 당연하게도 low priority thread가 lock을 release하게 되면 더이상 high priority를 donate 받을 이유가 없어지기 때문에, 본래의 priority로 돌아간다.idle thread는 교육용 thread인가 아니면 실제 production-level OS에서도 쓰이는가?
freeze
된다고 함.system call이 비싼 이유가 뭐지? user thread간의 context switching보다 user thread와 kernel thread간의 context switching이 더 비싸기 때문인가?
list_remove 하고 나서 list_next 하면 undefined behavior가 나타날 수 있는 이유가 뭘까? list_remove가 앞 뒤로 연결
각 종 tick(timer-tick, thread-tick) 들이 언제 increment하는지?
kernel stack은 어떻게 접근하는지 알겠는데(%rsp) local stack pointer는 어떻게 찾는거지?
thread 구조체를 보면 interrupt handler가 있는데 이거 중요한 것 같다. 어떤 역할을 하는거지?
thread가 뭐임? process랑 뭐가 다른거지?
thread를 scheduling 한다는 게 뭐지?
when a thread is created, you are creating a new context to be scheduled
가 무슨 의미지?process state?
alarm-clock이 어떤 역할을 하는 거지?
interrupt level이 뭐지?
/* Interrupts on or off? */
enum intr_level {
INTR_OFF, /* Interrupts disabled. */
INTR_ON /* Interrupts enabled. */
};
try
in Dutch) and up(aka Verhoog meaning increment).intr_handler
-> timer_interrupt
-> thread_tick
함수가 호출되고, scheduler가 현재 thread가 yield가 필요하다고 판단하여 intr_yield_on_return
함수를 통해 interrupt handler 종료와 함께 thread를 yield하려 시도합니다. thread_yield 가 다시한번 호출되고, 여기서부터 많은 문제가 발생할 수 있습니다. 우선 현재 thread가 ready_list에 두번 삽입되어 logical bug를 일으킬 수도 있고, 최악에는 thread가 ready_list에 완전히 삽입되지 않은상태에서 (즉 list의 fd/bk가 완전히 연결되어있지 않은상태에서) 다시 ready_list에 접근하여 invalid memory access에 의한 kernel panic등이 발생할 수 있습니다.#define TIMER_FREQ 100
). 대략 10ms에 한 번 timer interrupt가 발생한다.ticks(이하 구분 위해 timer_ticks)
는 timer interrupt 발생할 때마다 1씩 올라간다. 이와 동시에 thread_ticks와 (idle_ticks or user_ticks or kernel_ticks) 중 한 개가 같이 올라간다. ticks의 경우 timer_interrupt
함수에서 올라가고, 나머지들은 thread_tick
함수에서 올라간다.#define TIME_SLICE 4
). 참고로, 특정 thread가 scheduling을 통해 current running thread가 되는 순간 thread_ticks는 0으로 초기화된다. 그리고 thread 본인이 thread_yield를 하지 않는 이상 계속해서 thread_ticks가 증가하게 된다. 이를 보다 못한 timer interrupt handler는 thread_ticks가 4가 되는 순간 yield_on_return
전역변수를 true로 변경시킴으로써 timer interrupt handler가 return 하는 순간 thread_yield를 호출해서 강제로 현재 thread의 CPU 점유권한을 빼앗는다.thread_exit
함수를 호출하면서 커널이 꺼지게 될 것이다.intr_context
함수가 필요한 이유ASSERT(!intr_context())
와 같이 external interrupt context가 아닌 것을 확신한 이후 thread_yield 코드가 진행되게 된다.