life is egg
[PINTOS] priority conditon variable test 본문

테스트 실패
priority conditon variable 테스트중 테스트 출력이 한칸씩 밀리는 상황이 발생했다!


왼쪽 사진이 테스트 실패하는 경우이고 오른쪽 사진이 테스트 성공하는 경우이다.
자세히 보면 Signaling.... 이 두번연속으로 찍히고 priority 21번 thread가 깨어나지 못 한 상황이다.
깨어나지 못 하고 프로그램이 종료 된다면 메모리 누수가 일어날 것이다
왜냐면..! 쓰레드를 메모리를 할당받아서 생성하기 때문..!이유를는 쓰레드의 생애주기와 관련이 있다고 생각..!여기다 같이 쓰려다 이 글의 주제와 결이 달라지는 듯해서 나중에.. 쓸 시간이 난다면 써야겠다.
무튼 그래서 해당 문제의 원인을 생각해본결과

테스트 코드상으로 main thread가 모든 thread를 생성하고 난뒤 가지고 있는 lock을 풀면서 sema_up을 하게되는데,
위의 코드에서는 thread_unblock을 하고난뒤에 sem의 value를 업해준다, 이렇게 되면 우리 팀은
thread_unblock 함수 내부에서 sema->waiters에 있는 있는 쓰레드들 중 가장 우선순위가 높은 thread를 꺼내서 ready queue에 넣고난뒤 현재 running중인 thread와 우선순위를 비교해서 새롭게 ready queue에 들어온 녀석이 우선순위가 높으면 thread_yield()를 실행해 컨텍스트 스위칭을한다.

결국 근본적인 문제는 thread_unblock 내부에서 우선순위를 비교해서 thread_yield()를 호출하는게 문제이긴했다.
이렇게 된이유는 thread_unblock 함수가 먼저 정의 되어있었고, 다양한 곳에서 thread_unblock을 사용하고 있는데, 우선순위 스케줄링으로 개선해나가는 과정에서 thread_unblock을 사용하는 곳마다 thread_unblock을 사용하고 난 뒤 우선순위 비교하는 함수를 추가적으로 호출해야했기 때문에... thread_unblock 함수 내부에 우선순위 비교함수를 넣어 놓으면 적게 수정하고 놓치는 곳이 없다고 생각했기 때문인데...
지금생각해보면 thread_unblock 함수의 기능을 훼손하는 코드가 아니였나.. ? 하는 생각도 든다..
무튼 그래서 해당오류를 수정 할 방법이 두가지가 있었는데.
1. run_highest_priority_thread() 함수 분리 ,
- sema_up 에서 thread_unblock 호출 종료 후 sema -> value ++ , 그휘에 우선순위 비교해서 thread_yield().

2. sema -> value ++을 먼저 해주고 thread_unblock 실행, thread unblock 함수 내부에서 우선순위 비교해서 thread_yield().

두가지 방법이 있었고 우리팀은 첫번째 방법보다는 두번째 방법을 택했다. 왜냐하면 첫번째 방법으로 한다고하면 thread_unblock을 호출하는 모든 함수에다가 우선순위를 비교해줘야하니까 간단하게 sema_up만 수정하자는 결론이 나왔다.
해당 부분을 고치고 난 뒤에 문제 없이 테스트를 통과할 수 있었는데..
나중에 안 사실인데, 위의 코드에서 인터럽트 비활성화를 해주고 다시 이전 상태로 돌려주는 코드를 필요한 부분만 해줘도 된다고 생각해서 sema->value ++ 하는 부분에서만 해줬는데, 이렇게 한다면 list_sort나 thread_unblock의 파라미터로 들어가는 함수에서 .. 원자성을 보장 받지 못한다.
'sw정글 > C' 카테고리의 다른 글
| [PINTOS] 구조체 초기화 (0) | 2024.05.21 |
|---|---|
| [PINTOS] syn_read 와... 인터럽트 검증 관련 오류 (0) | 2024.05.14 |
| [PINTOS] 타이머 인터럽트의 주체는 (0) | 2024.04.29 |
| [Malloc] Implict (0) | 2024.04.18 |
| [Malloc] Malloc Lab 개요 (0) | 2024.04.14 |