현재 상황 : Round Robin

먼저 Ready queue에 들어온 스레드가 먼저 실행되는 FCFS(First Come First Served) 방식에, 일정 time slice가 지나면 CPU의 주도권을 다음 스레드에 넘기는 Round Robin 방식이다. Preemptive 방식의 스케줄링이 아니며, 우선 순위는 고려되지 않고 있다.

thread.c/thread_unblock()

block 상태의 스레드를 깨우고 난 뒤 ready list의 맨 뒤에 삽입한다.

void thread_unblock (struct thread *t) {
	enum intr_level old_level;

	ASSERT (is_thread (t));

	old_level = intr_disable ();
	ASSERT (t->status == THREAD_BLOCKED);
	list_push_back (&ready_list, &t->elem);  // 깨우고 난 뒤 ready list의 맨 뒤에 삽입.
	t->status = THREAD_READY;
	intr_set_level (old_level);
}

thread.c/schedule()

next_thread_to_run() 함수에 의해 다음 실행 스레드가 정의된다.

static void
schedule (void) {
	struct thread *curr = running_thread ();
	struct thread *next = next_thread_to_run ();  // CPU 주도권을 넘겨줄 다음 스레드

	ASSERT (intr_get_level () == INTR_OFF);
	ASSERT (curr->status != THREAD_RUNNING);
	ASSERT (is_thread (next));
	/* Mark us as running. */
	next->status = THREAD_RUNNING;  // 다음 스레드 상태 변경

	/* Start new time slice. */
	thread_ticks = 0;  // 현재 time slice는 4 ticks

....

		thread_launch (next);  // 다음 스레드 실행
	}
}

thread.c/next_thread_to_run()

ready list에서 맨 앞 스레드를 pop해 CPU 주도권을 넘겨줄 다음 스레드로 설정한다. 만약 ready list가 비어 있다면 idle 스레드가 다음 CPU 주도권을 잡도록 설정해준다.

static struct thread *
next_thread_to_run (void) {
	if (list_empty (&ready_list))
		return idle_thread;
	else
		return list_entry (list_pop_front (&ready_list), struct thread, elem);  // list에서 맨 앞
}

개선 방안

priority scheduling

우선순위 비교 및 선점 함수 선언