[WEEK08] 20230426(수) 59일차. OS project 1. WIL.

kozi·2023년 4월 26일
0

SW사관학교 정글

목록 보기
30/33

핀토스 Threads - alarm clock 및 priority_donate 구현.

이번주는 본격적으로 정글 과정에서 악명이 높은 핀토스(PintOS) 프로젝트가 시작되는 주차였다.

본격적인 구현에 들어가기 전에 팀원들과 어떤 방식으로 구현을 진행할지 논의했는데,
먼저 각자 이론 공부를 한 다음 같이 모여서 로직을 짜고 코드를 작성하기로 했다.

여럿이서 한 화면을 보면서 코딩을 해본 경험은 이번이 처음이었는데, 혼자서는 생각해내지 못했을 아이디어를 팀원들에게 배우고, 내 로직이 맞는지 바로바로 확인할 수 있는 점이 좋았다.
또한 팀원들에게 내 아이디어에 대해 설명하면서 생각을 정리할 수 있는 점도 좋았다.

우리는 이러한 코딩을 케르베로스 코딩이라고 명명하였다.

며칠 전에 구매한 아이패드로 그림을 그려가며 서로의 로직을 확인했는데,
확실히 머릿속에 맴돌던 로직을 시각화해서 확인하니 이해가 더 잘 되었다.

케르베로스 코딩 사진

(사진은 팀원들과 케르베로스 코딩을 진행하는 모습)

나름대로 로직이 완벽하다고 생각했었고,
"우리의 로직은 이론상 무적이다."라는 말과 함께 테스트 케이스 파일에 연거푸 도전했지만,
계속해서 마주하는 각종 에러와 fail, 패닉 문구들은 우리를 panic 상태로 만들었다.

(우리를 좌절하게 만든 패닉 문구)

thread donation을 구현하며 마주했던 문제 상황들 중에 기억에 남는 케이스가 있었다.

alarm clock()을 모두 문제없이 구현하고 나서, thread_donation_one 테스트 케이스를 통과했는데,
앞에서 통과했던 alarm_clock 테스트 케이스가 모두 실패하는 문제가 발생했다.

처음에는 문제의 원인을 발견하지 못했는데, 결국 thread_unblock() 내부에서 thread_yield() 함수를 호출하는 과정에서 문제가 발생한다는 것을 알게 되었다.

thread_create(), thread_awake(), sema_up() 세 군데에서 thread_unblock() 함수를 호출하는데, thread_awake() 함수에서 thread_yield()를 할 때 문제가 발생하였다.

문제를 발견하고 나서 thread_yield() 안에 넣어놓은 조건문을 밖에 꺼내서,
thread_create()와 sema_up()에서만 thread_yield()를 하는 방식으로 문제 해결을 시도했다.

계속 구현을 해 나가며 테스트 케이스를 뜯어보다 보니, thread_awake() 과정에서 idle_thread가 yield를 하면 안되는 상황에서 yield를 하여 문제가 발생한다는 것을 알게 되었다.

그래서 다음과 같이 조건문을 수정한 결과, 구현했던 부분의 테스트 케이스가 모두 통과하는 것을 확인하였다.

끝까지 열심히 디버깅과 코딩을 진행한 결과 우리 팀의 최종 결과는 다음과 같았다.


(좀 더 발전된 케르베로스 코딩)

profile
어제보다 잘하고 싶은 개발자 Kozi 입니다.

3개의 댓글

comment-user-thumbnail
2023년 4월 27일

32인치 4K모니터 몰래 쓰면 편해요!! ㅎㅎ

2개의 답글