정글에는 여러 사람들이 성장 외에도 다양한 이유로 온다.
취업 때문에 입소한 사람.
PintOS한다고 정글에 입소한 사람.
그리고 둘다 아닌 멍청이도 있다.
-멍청이-

PintOS를 한다.
절대로 하고싶다는 생각은 들지 않지만 일단 한다....
우우우...
PintOS는 카이스트에서 제공하는 64비트 버전으로 수정한 PintOS-Kaist를 활용한다.
이번주차에 진행한건 핀토스 프로젝트 1: 스레드 이다.
프로젝트 1은 기본적으로 아무것도 안해도 OS가 돌아가도록 구현되어있다.
시작하자마자 수정 안해도 PASS 뜨는데 솔직히 하고 ㅣㅅㅍ지 안하ㅏㅏ다
아무튼, 기본적으로 스레드들이 굉장히 '비효율적'으로 사용되고 있기 떄문에, 이것들을 최적화 해줘야 한다.
우리의 PintOS 스레드들은 자지 않는다.
재워야 된다.
좀 자라.
기본적으로 Ready리스트에서 일어날 시간이 되기 전까지 계속 '일어나서'CPU를 양보하다가 일어날 시간이 될 때 그만 양보하고 일하는 Busy wait으로 구현되어있었다.
결국 thread_yield(양보)하는 것도 계산으로 들어가므로 계산을 줄이기 위해 양보 시키는 행위를 하지 않도록 하는 것이 중요하다.
여기서 알람 클락이라는 방법이 들어간다.

말 그대로 일어날 시간(틱)이 될때 깨우는 방법이다.
구현 방법은 간단하다.
글로벌 틱을 선언하고 스레드들을 일어나야 할 틱 기준으로 내림차순 정렬을 하여 현재 틱이 글로벌 틱보다 작을 때 Ready list에서 깨우도록 하였다.
그리고 Ready List가 아닌 Condition 리스트나 Semaphore 리스트에서는
저번주차에 사용했던 락 기법을 여기서 다시 사용한다.
세마포어를 0으로 선언하여 sema_down(세마포어가 양수가 되는 즉시 1 내리고 일어남)을 걸어놓고 잠에 들고
일어날 틱(시간)이 될때 깨워야 되는 스레드의 세마포어를 1로 바꾸어 일어나도록 만들었다.
우선순위가 높은 것부터 자원을 점유하게 만드는 방법이다.
그냥 우선순위 높은 것부터 자원을 먹도록 시키면 되지 않나? 싶지만, 우선순위 역전이라는 현상이 발생한다. 어떤 자원 X의 락을 잡고 있는 L이 자원 X가 필요하고 우선순위가 L보다 높은 H가 L 대신 자원 X를 점유 하려고 하면. H는 자원 X에 락이 걸려 있어서 점유를 못하고 L은 H보다 우선순위가 밀려서 락을 못풀어서 둘다 점유를 못하는 일이 일어난다. 그걸 해결하는것이 우선순위 기부라는 방법이다.
그런데.. 시간이 없어서 구현을 못했다.
테스트 케이스들 일일히 분석한다고 시간 날려먹고
머지하다가 날려먹어서 또 시간 날려먹고
아무튼 아쉬운 한주 였다...
이번 주에 좀 나아지나 싶었는데 아직 숙면을 잘 못취하고 있다.
다음 주에는 좀 나아지기를 바란다.