728x90
➡️ 과제 설명(Gitbook)
Priority Scheduling
➡️ 구현 [Section 2] Semaphore
📌 코드부분은 한글 주석을 달아놓은 부분이 추가된 부분입니다!
🎯 Goal
- Functions to modify
- sema_down() : 세마포어 P연산
- sema_up() : 세마포어 V연산
- Modified files
threads/synch.c
📝 Functions List
1. sema_down
<구현 사항>
- 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
<구현 사항>
- waiters에 있는 스레드의 우선순위가 변경 되었을 경우를 고려해서 waiters를 정렬한다.
- 세마포어 해제 후, 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
'🌱 Dev Diary > 📄 TIL' 카테고리의 다른 글
Project 2. System Calls 구현 (2) - File related (0) | 2023.01.02 |
---|---|
Project 2. System Calls 구현 (1) - 개요 (0) | 2023.01.02 |
Project 1. Priority Scheduling 구현 (1) (1) | 2022.12.26 |
Project 1. Alarm Clock 구현 (0) | 2022.12.24 |
PintOS 시작하기 + Project 1 개요 (0) | 2022.12.23 |