우선 순위 기부 - 쓰레드 구조체에서 도네이션 리스트 구성 및 도네이션 리스트에서 같은 락 걸린 제일 빠른 같은 락 도네이션 elem 찾기?
thread.h에 thread 구조체가 있기 때문, 이미 구조체가 있기 때문에 thread 구조체에 선언만 하면 됨
struct threadstruct lock* wait_on_lockstruct list donor_liststruct list_elem donor_elempriority) 값을 덮어써버리면, 기부가 끝났을 때 원래 우선순위를 복원할 수 없게 되므로 문제 발생함수 :
int get_effective_priority(struct thread *)int get_effective_priority(struct thread * t) {
/* 도우너 스레드 = list_entry(가장 뒤에 있는 donor_list_elem, thread, donor_elem)
return donor_list->priority; <- 왜냐 나를 락거는 애들은 나보다 우선순위가 크기 때문*/
}int thread_get_priority(void)int
thread_get_priority (void) {
/*
현재 스레드의 get_effective_priority()를 가져오면
스레드의 현재 가지고 있는 우선 순위를 가져올 수 있음
return get_effective_priority(thread_current ());
*/
}void set_priority(int)void set_priority(int new_priority) {
/*
현재 스레드의 우선순위 = 입력 받은 우선 순위
cur_priority = new_priority
while로 donor_list를 순회하면서,
각 donor 스레드의 실질적인 우선순위(get_effective_priority)를 얻어옴
이 우선순위를 기준으로 기부를 유지할지 회수할지 판단하기 위해 사용
donor의 우선순위가 새 priority보다 작거나 같으면
donor_list에서 해당 donor 이후 전체 리스트를 잘라냄(extract)
마지막 yield*/
}함수 추가 :
int list_extend(strcut list *dest, struct list *src)int list_extend(struct list *dest, struct list *src)
{
/*
dest나 src가 null이면 에러
만약 src의 사이즈가 0이면 return 0
dest의 tail전 원소 d_end를 찾음
src의 head 다음 원소 s_start를 찾음
d_end , s_start 연결
dest의 tail 전 원소 s_end를 찾음
s_end, src.tail 연결
return 0
*/
}
struct list * list_extract(struct list *list)struct list *list_extract(struct list *list)
{
// list보다 앞에 다른 원소가 있는지 확인
// (head -> next) -> prev != head
// list보다 뒤에 다른 원소가 있는지 확인
// (tail -> prev) -> next != tail
// 앞뒤에 원소가 둘 다 있으면 둘이 연결
// list 첫 원소가 head를 다시 가리키도록 연결
// list의 끝 원소가 tail을 다시 가리키도록 연결
// return list
}
쉣 세임 낫 세임
lock_acquire(struct lock *lock)void
lock_acquire (struct lock *lock) {
ASSERT (lock != NULL);
ASSERT (!intr_context ());
ASSERT (!lock_held_by_current_thread (lock));
enum intr_level old_level;
old_level = intr_disable ();
if(! sema_try_down(&lock->semaphore)) {
struct thread *donor = thread_current(), *holder = lock->holder;
donor->wait_on_lock = lock;
/*
TODO : 우선순위 기부 로직
donor의 donor_list를 순회하며 이 lock을 쓰고있는 쓰레드 donor elem을 찾으면 list_extract
holder 의 donor list 제일 뒤에 donor의 donor list를 추가
*/
intr_set_level(old_level);
sema_down (&lock->semaphore);
} else{
intr_set_level(old_level);
}
lock->holder = thread_current ();
}lock_release(struct lock *lock)void
lock_release (struct lock *lock) {
ASSERT (lock != NULL);
ASSERT (lock_held_by_current_thread (lock));
/*
TODO : 우선순위 가져오는 로직 구현
인터럽트 걸고
semaphore의 wait_list의 front를 holder의 donor_list에서 extract
lock->holder = NULL;
sema_up (&lock->semaphore);
인터럽트 풀기
*/
}