후... 10 of 27 tests failed로 줄였다.
자세한 코드는 내 github의 terapintos의 pass priority-donate-one으로 시작하는 곳을 참고하자.
https://github.com/hsb0818/terapintos/commit/4790d3967a7a7e4b9a0735ab1bdc463208b141e9
nested donation에선 문제 없었지만 multiple에선 문제 생겼던 것인데,
reset donation을 진행할 때
struct thread* pHighThread = list_entry (list_front (&lock->semaphore.waiters) , struct thread, elem); if (pCurThread->priority < pHighThread->priority) { pCurThread->priority = pCurThread->priority_origin; return; }이 부분..을 지워버리니까 잘 된다.당연히.. waitlist에 있는 가장 최상위 스레드의 우선 순위와 현재 스레드의 우선 순위를 비교했을 때,
같다면 - 대기 리스트 중 최상위 스레드로부터 donation된 것이기 때문에 다음 태스크를 진행하고,
현재 스레드의 우선 순위가 더 크다면 - 다른 스레드의 간섭을 받을 필요가 없어지기 때문에 그 다음 태스크(현재 스레드가 잡은 가장 최신의 락의 priority로 rollback -> 이전 상태로 롤백이란 뜻이다)를 진행하고,
현재 스레드의 우선 순위가 더 작다면 - > 이런 경우는 있을 수가 없다. waitlist에 대기하고 있는데, 게다가 현재 스레드의 우선 순위가 더 작은데도 donation이 안 됬다면 그건 그냥 잘못된 것이다.
반응형
'OS > Pintos 개발일지' 카테고리의 다른 글
[Pintos] 1. background (0) | 2018.10.22 |
---|---|
[Pintos 개발일지] [pass] priority-donate-nest (2) | 2014.05.29 |
[Pintos 개발일지] 음...Kernel Panic이나 Unexpected interrupt 0x0E 에러에 대해 (1) | 2014.05.27 |
[Pintos]Alarm Clock (0) | 2014.04.22 |