1 분 소요

Priority Scheduling

Part 1 : Threads

1주차의 과제는 총 3개인데

  • Alarm Clock
  • Priority Scheduling
  • Advanced Scheduler

이며,
현재 진행하는 과제는 Priority Scheduling이다

Priority Scheduling은
해당 thread에 ‘우선순위’를 부여하여,
현재 작업 중인 스레드보다 새로 들어온 스레드의 우선순위가
더 높은 경우, 현재의 스레드를 ready_list에 밀어넣고
새로운 스레드를 작업하는 방식이다

말 그대로, ‘우선순위’가 더 높은 작업을 먼저 처리하는 방식이다

구현 방식은 thread의 priority 필드를
실제로 사용하게 만들며,
이에 따라 ready_list에 삽입될 때, 우선순위가 높은 것이
앞에 오도록 하는 ‘내림차순’ 방식을 이용하였다

이에 따라,
thread_create, thread_yield, thread_unblock,
thread_set_priority 함수를 수정하였다

또한, list의 compare 용 함수인
cmp_priority 함수를 만들어
첫번째 인자가 두번째 인자보다 높은 경우 true를 반환하도록 하였다
(내림차순을 위함)

구현시 깜빡한 점

  • set_priority 함수에서 처음에는
    ready_list를 sort하는 방식이었는데
    생각해보니 thread_current의 값을 수정하는데
    ready_list만 sort하는 방식은 별로 좋지 못한것 같았다
    이에 따라 바뀐 값과 list의 첫번째 값(내림차순이기에 이녀석이 제일 큼)
    과 비교하여 그에 따라 수정
    (애초에 insert 할 때, orderer 를 호출하고 있었기에
    굳이 sort를 호출할 필요는 없었다)
  • 자꾸 에러가 나기에 확인했더니,
    cmp 함수에서 a->priority 와 b 자체를 비교하고 있었다…
    b->priority로 수정 (항상 오타 조심…)
  • 특정 test case를 통과하지 못하여 확인하였는데,
    list_front 같은 함수는 list_empty인 상황을 따로 검사하지 않았다
    (null return이 아니라 그냥 assert 해버렸다)
    해당 함수를 호출 시, list_empty를 따로 호출해서 예외처리를 하였다

다만 priority 부분 중, 현재는
thread의 ready_list 부분만 처리한 것이며,
동기화 도구에 따른 문제가 아직 남아있는 상황이다

Priority_Scheduel

Priority_Scheduel_sema1

[GitHub] : https://github.com/hnjog/pintos-kaist/tree/hnjog

댓글남기기