os에서 멀티 스레딩을 지원해주기 위한 기능을 업그레이드 시키기.
- alarm timer 성능 개선
alarm timer: timer interrupt를 활용하여 컴퓨터가 물리적인 시간을 알아차리도록 하고, 그 것을 tick이라는 변수로 표현할 수 있게 만들어져있다. 그 tick을 사용해 user가 sleep시킨 스레드가 충분히 잤는지 안잤는지를 확인하게 만드는 함수이다.
-
개념적으로 모자란 부분이 있었다. 인터럽트가 어떻게 발생하여, 인터럽트 핸들러는 어떻게 cpu를 점유하게 되는 것이며, 원래 있던 스레드는 어디 갔다가 돌아오는 것인가. 그런 모든 궁금증이, 하드웨어 신호에 대한 몰이해에서 비롯되었다. 컴퓨터 구조 공부에 대한 필요성을 더욱 느꼈다.
-
원래 busy waiting으로 계속해서 조건을 체크하던 alarm timer 함수를 수정하였다.
-
cpu의 한 틱을 잡아먹던 조건문 검사를 생략할 수 있게 되어 os의 성능이 한층 높아졌다.
- MLQ 구현하기
- 이름이 멀티레벨 큐여서 뭔가 큐를 이용해야할 것 같았는데, 그냥 개념상 큐인 것이고, 구현은 링크드 리스트로 가능했다. 이미 강력한 함수들이 많이 제공 되었기에, 적절하게 주어진 함수를 이용해 스무스하게 해결할 수 있었다.
- Priority Donation 구현하기
- 지시 사항에 오직 lock 구조체에 대해서만 donation을 이식하라고 되어있었다. 아마 학생의 편의를 봐주기 위해 그런 것 같다. 실제 OS는 얼마나 더 복잡하게 되어있을까? 두렵고 설렌다..
- 처음에 nested donation을 구현하려고 BFS 함수를 만들었는데, 알고보니 내가 너무 복잡하게 생각하고 있었다는 사실을 알 수 있었다. 몇가지 잠깐 생각해보면 알 수 있는 반드시 참이 되는 명제를 활용하여 생각을 해보면 고려할 필요가 없는 것들이 매우 많았다. 코딩을 본격적으로 시작하기 전에 반드시 생각을 잘 정리해야겠다.
- MLFQ 구현하기
- 전 상황과 반대로 MLFQ를 구현할 때에는 반드시 고려해야하는 상황을 고려하지 않은 경우가 있었는데, 그런 일이 발생한 이유는 크게, 지시사항을 제대로 읽지 않은 것, 그리고 생각을 깊게 하지 않은 것이 있다.
뭔가 이상하다. 금방이라도 고장날 것 같은 데 일단 돌아가긴 한다. 문제가 발생하지 않으면 문제를 알 수 없다는것은 굉장히 불안한 부분이다..
깃허브..
https://github.com/stkang9409/pintos