목표
만약 지금 실행 중인 스레드보다 높은 우선 순위의 스레드가 Ready list에 들어왔다면, 실행 중인 스레드는 그 즉시 CPU를 해당 스레드에게 양보하여야 한다.
- 스레드의 우선 순위는
PRI_MIN (0)
에서 PRI_MAX (63)
이다. 숫자가 높을수록 우선 순위가 높다.
- 여러 스레드가 하나의 공유 자원에 접근하는 경우 lock, semaphore, condition variable 등의 waiting list 안에서 block 상태로 기다리게 된다. 이 때 가장 높은 우선 순위를 가진 스레드가 가장 먼저 처리되어야 한다(깨어나야 한다).
- 스레드 각각의 우선순위는 어느 때나 바꿀 수 있다. 만약 CPU를 사용하고 있을 때 우선 순위가 바뀌어 우선 순위의 값이 최대가 아니게 된다면 그 즉시 CPU를 반납해야 한다.
- Priority inversion 상황을 막기 위해 Priority donation 역시 구현해야 한다.
- Prioirity donation 시 발생할 수 있는 multiple donation이나 nested donation 상황도 같이 고려하도록 한다. 특히 nested donation의 경우 그 depth limit을 정해주어야 한다(예를 들면 8 정도).
- 모든 핀토스의 synchronization contructs들에 대해 priority scheduling을 구현한다. 하지만 priority donation은 Lock에 대해서만 구현하면 된다.
void thread_set_priority (int new_priority);
와 int thread_get_priority (void);
함수를 수정한다.
Step 1 : Ready list에서의 Priority Schduling
Step 2 : Synchronization Constructs들의 Waiting list에서의 Priority Schduling
Step 3 : Priority Donation