이번 주에 정글 들어오기 전부터 악명이 높았던 pintos를 드디어 시작했다. 항상 모든 블로그에 pintos힘들다, 전화해서 울었다라고 쓰여있어서 좀 걱정이 됐었다.
사실 항상 블로그를 내가 뭘 배웠고 어떤 내용을 공부했었는지 적었는데 저번에 팀스파르타에서 그런 블로그는 의미가 없다고 하셔서 추천해주셨던 내가 어떤 걸 고민했고 어떤 식으로 고쳐나갔는지를 한번 적어보겠습니다.
처음 개념을 공부하는데 어떤 책에서는 뮤텍스 == 바이너리 세마포어다 라고 하고 어떤 책에서는 비슷하지만 약간 다른 점이 있다라고 설명이 되어있어서 뭐가 맞는지 헷갈렸습니다.
그래서 제가 공부한 바로는 둘이 하는 일은 비슷하다. 하지만 결정적인 차이는 누가 락을 풀어줄 수 있는지가 중요했습니다.
여기서 바이너리 세마포어가 락을 가지고 있더라도 다른 세마포어에서 락을 해제하면 문제가 생기는 거 아닌가? 하고 처음에 생각했습니다.
세마포어의 기능 중 임계영역에 접근을 막는 기능도 있지만 순서를 보장해줄려고 사용할 수도 있습니다.
예를 들어서, condition variable이나 순서가 보장되어야 하는 상황에서 적절히 up과 down을 해주면 됩니다.
처음 pintos로 condition variable을 공부하니 헷갈린게 많았습니다. 책에서는 "특정 조건을 만족하면 락이 풀린다" 라고 되어있지만 우리가 진행중인 pintos testcase에서는 조건이 보이지 않아 뭔가 했습니다.
하지만 pintos는 학생들이 좀 더 공부를 쉽게 하기 위해 경량화를 한 것이었고 결론적으로 condition variable은 위에서 설명한 특정조건이 만족될 때까지 wait하고 만족이 되었다면 signal을 보내어 잠자던 쓰레드를 깨우는 것입니다.
여기서 중요한게 signal을 보내더라도 다른 누군가 다시 소유권을 가져갈 수 있어서
이 조건을 확인하는 부분을 if문이 아니라 while문을 사용해 확실히 조건이 만족했는지를 보장해 줄 수 있습니다.
공부한 다른 예에서 기다리는 스레드들을 관리할 때 list로 관리하는 경우도 있고 이번 pintos같은 경우에는 바이너리 세마포어를 사용해서 기다리는 쓰레드들을 관리하는 것을 알 수 있었습니다.