life is egg

[PINTOS] priority conditon variable test 본문

sw정글/C

[PINTOS] priority conditon variable test

삶은계란진재혁 2024. 5. 3. 10:00

테스트 실패

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
Comments