728x90

➡️ 과제 설명(Gitbook)

Priority Scheduling

 

[Krafton Jungle | TIL_22.12.20] Project 1. Priority Scheduling 구현 (1)

➡️ 과제 설명(Gitbook) Priority Scheduling 🎯 Goal - 우선 순위 스케줄링과 우선 순위 기부를 구현하라 - 'threads/thread.c' 에서 'thread_set_priority' 와 'thread_get_priority' 를 구현하라 현재 실행 중인 스레드보

olive-su.tistory.com

 

 


➡️ 구현 [Section 2] Semaphore

 

📌 코드부분은 한글 주석을 달아놓은 부분이 추가된 부분입니다!

 

🎯 Goal

  • Functions to modify
    • sema_down() : 세마포어 P연산
    • sema_up() : 세마포어 V연산

 

  • Modified files
    • threads/synch.c

📝 Functions List

  1. sema_down
  2. sema_up

 


1. sema_down

<구현 사항>

  1. semaphore 를 얻고 waiters삽입 시, 우선 순위대로 삽입되도록 수정한다.

 

  • threads/synch.c
void
sema_down (struct semaphore *sema) {
	enum intr_level old_level;

	ASSERT (sema != NULL);
	ASSERT (!intr_context ());

	old_level = intr_disable ();
	while (sema->value == 0) { // 공유 자원을 이용할 수 없는 상태
		list_insert_ordered(&sema->waiters, &thread_current ()->elem, cmp_priority, NULL);
		// list_push_back (&sema->waiters, &thread_current ()->elem);
		thread_block ();
	}
	sema->value--;
	intr_set_level (old_level);
}

 

  • 주석 설명 정리
    • 세마포어의 “down 연산” 혹은 “P 연산”이라고 한다.
    • 세마포어의 값이 양수가 될 때까지 기다렸다가 감소시킨다.
    • 인터럽트가 비활성화된 상태에서 호출할 수 있다.
    • down 연산 후, 해당 스레드가 sleep 상태였다면 그 다음 스레드는 인터럽트를 킬 것이다.

 

 


2. sema_up

<구현 사항>

  1. waiters에 있는 스레드의 우선순위가 변경 되었을 경우를 고려해서 waiters를 정렬한다.
  2. 세마포어 해제 후, priority preemption 기능을 추가한다.

 

  • threads/synch.c
void
sema_up (struct semaphore *sema) {
    enum intr_level old_level;

    ASSERT (sema != NULL);

    old_level = intr_disable ();
    sema->value++;
    if (!list_empty (&sema->waiters)){
        list_sort(&sema->waiters, cmp_priority, NULL); // waiter_list 정렬
        struct thread *new_lockholder = list_entry(list_pop_front (&sema->waiters), struct thread, elem);
        thread_unblock (new_lockholder); // 세마포어를 해제하고 레디 상태로 만들어준다.
        if (thread_get_priority() < new_lockholder->priority )
            thread_yield();
    }
    intr_set_level (old_level);
}
  • 주석 설명 정리
    • 세마포어의 “up 연산” 혹은 “V 연산”이라한다.
    • 세마포어의 값을 증가시키고 세마포어를 기다리는 스레드 중 하나를 READY 상태로 전환한다.
    • 인터럽트가 비활성화된 상태에서 호출할 수 있다.

 

 


🎉 Test Result

>>> cd ./pintos-kaist/threads
>>> make check

 

 

728x90