반성이 많이 됐던 일주일이었습니다. pintos를 통해 새로운 내용을 접하고 익히는 과정에서 시간만 많이 들이고 몸이 고됨을 “새로운 내용을 배우고 있다”는 것으로 착각하지 않았나 싶습니다. 그래서 시간이 지났을 때, 남들과 같은 시간이 지났어도 남들보다 이해의 정도가 얕았던 것이라 생각합니다. 집에 돌아가는 길에, 1~3주차에 “어떻게든 주어진 시간내로 과제를 완료하고자”했던 ‘투지’에 대해 다시금 되돌아 볼 수 있었습니다. 앞으로 남은 4일간 주어진 시간내로 동료학습이든, 추상화든, 그림을 그리든 어떻게든 과제를 완료하기 위해 개념을 이해하고 코드를 작성하려고 노력하겠습니다.그리고 그 과정에서 많은 가르침과 영감을 주신 안x경님께 샤라웃을 보냅니다
PintOS Project 2 User Program을 구현하던 중, Condition Variable의 뜻과 "내가 현재 무엇을 위하여 이것을 구현하고 있는지?"에 대해 짚고 넘어가고자 작성했던 글입니다.
당시 발표용 자료를 풀어서 옮겨 적습니다.
💡 Alarm Clock(priority) - 우선 순위를 통한 동시성 스레드들의 스케줄링
Semaphore(Lock) - 세마포어 불변성을 활용한 상호 배제(Mutex) 구현
Condition Variable - ❓
Priority Donation - 우선 순위 역전 문제 해결
Multi Level Feedback Queue Schedule(MLFQS) - 스케줄링의 공정성과 성능 개선
각 파트에서 "왜 이걸 구현하는지"에 대해 간결하게 설명할 수 있었습니다. 그러나 이번 Condition Variable은 PintOS Gitbook에서의 설명이 어려워서인지, 주변 동료들도 정확히 "이겁니다!"라는 설명할 수 있는 사람이 없었습니다.
그래서 엔지니어링 관점에서 "무엇을, 뭘 위해서 구현하는지?"를 명확히 하고자 합니다.
💡 Lock(Mutex)으로 공유 자원의 접근은 상호 배타적이고, 세마포어에 threads waiters list가 있는데,
왜 세마포어들의 wait list를 또 만드는거지?
Condition은 무엇을 뜻하는지?

👉 세마포어는 상호 배제뿐만 아니라, 공유 자원으로의 접근을 스케줄링할 수 있습니다.

그렇다면 우선 순위 스케줄링과 무슨 차이일까요?
현재 쓰레드와 새로 만들어진 쓰레드에 이중으로 Lock을 왜 거는걸까요?
Condition Variable은 특정 조건을 만족하기를 기다리는 변수입니다.
하나의 thread가 waiting 중이면 조건을 만족한 thread에서 변수를 바꾸고 signaling을 통해 깨우는 방식입니다. 출처: Incheol’s TECH BLOG

❗ 스레드가 깨어나는 조건을 설정함으로써, 공유 객체로의 배타적 접근을 조절할 수 있습니다. 대표적인 문제로 읽기-쓰기 / 생산자-소비자 문제가 있습니다.

공연 티케팅을 하려는데 한 좌석만이 남은 상황을 상상해보세요.
빈 좌석이라는 상태는 모두가 '읽을 수' 있겠지만, 예매라는 '쓰기' 요청은 단 한 사람만이 가능해야 합니다.
👉W - 공유 객체에 접근하는 크리티컬 섹션(Instruction 진행 순서)으로의 접근을 제어합니다.
(즉, 한 개의 writer를 보장하는 것이죠.)
Mutex - 공유된 readcnt 변수로의 접근 제어합니다.

흐름을 따라가 볼까요?

결국 Condition Variable이란, 세마포어와 같이 공유 자원에 대한 상호 배제 기능뿐 아니라, 자원으로의 접근을 제어하기 위한 방법론인 것입니다. 이해되시나요?