[WEEK 08] Weekly I Learned

신호정 벨로그·2021년 10월 4일
0

Today I Learned

목록 보기
45/89

WEEK08 PintOS 프로젝트 1을 진행하면서 운영체제 전반에 대한 이해와 쓰레드의 스케줄링을 기반으로 한 프로세스의 운용 방식을 배울 수 있었다.

프로젝트 1과 2를 수행하는 과정에서 Semaphore, Lock, Condition Variable 등 동기화 기법이 어떤 메커니즘을 통해 작동하는지에 대해 이해할 수 있었고, 우선순위를 기준으로 정렬하는 Priority Scheduling 뿐만 아니라 RR과 MLFQS 등 스케줄링 알고리즘에 대해서도 이해를 넓힐 수 있었다.

먼저 프로젝트 1의 첫 번째 과제인 Alarm Clock을 진행하면서 기존의 핀토스 운영체제에서 발생하는 쓰레드의 busy waiting 문제를 해결하기 위해 필요한 시간 계산 방식이 어떻게 근본적으로 이루어지는지를 배웠다.

busy waiting 문제는 비효율성을 유발하기 때문에 개선되어야 하는 사항이다.

쓰레드가 RUNNING, READY, BLOCKED, DYING 상태로 변화하면서 이루어지는 진행 흐름을 파악하였다.

준비 상태로 대기 중인 쓰레드들을 인터럽트로부터 방해 받지 않는 수면 상태로 전환하고 깨우는 시간에 맞춰 기상할 수 있도록 thread_sleep()과 thread_awake() 함수를 수정하는 작업이 Alarm Clock 과제의 핵심이었다.

특히 코드를 구현하는 과정에서 idle thread라는 쓰레드를 두어 CPU가 지속적으로 실행을 멈추지 않도록 설계되었다는 사실과 실행 중인 쓰레드가 이 함수들을 실행시키지 않고 계속 CPU 소유권을 가지는 것을 방지하기 위해 존재하는 타이머 인터럽트라는 장치의 역할에 대해 새롭게 알게 되었다.

두 번째 과제인 Priority Scheduling 과제는 우선순위 기반 스케줄링을 채택함으로써 CPU의 사용을 우선순위 기반으로 쓰레드들이 점유하도록 변경하는 과제였다.

우선순위 스케줄링의 목적은 ready 상태인 쓰레드들의 순서를 관리하여 가장 높은 우선순위를 가진 쓰레드가 running 상태가 될 수 있도록 만들어주는 것이었다.

먼저 스케줄링 함수를 구현하기에 앞서 ready_list에 새로운 쓰레드가 추가되는지와 대기열에 있는 쓰레드를 어떤 방식으로 꺼내는지를 통해 현재 핀토스의 스케줄링은 우선순위를 고려하지 않고 ready_list의 맨 뒤에 새로운 쓰레드를 push하고, 맨 앞에서 pop하는 robin-round 방식을 채택하고 있다는 것을 알 수 있었다.

이를 쓰레드의 우선순위를 기반으로 한 스케줄링 방식으로 변경하기 위해 synchronization 함수들을 수정하였다.

Priority Scheduling 방식으로 변경하면서 우선순위가 높은 쓰레드가 CPU를 사용하기 위해 우선순위가 낮은 쓰레드의 실행을 기다려야 하는 상황인 Priority Inversion을 해결하는 것이 관건이었다.

우선순위가 높은 쓰레드가 자신의 실행을 위해 우선순위가 낮은 쓰레드에게 일시적으로 높은 우선순위를 양도함으로써 우선순위가 낮은 쓰레드가 자신과 동일한 우선순위를 가지고 우선적으로 실행할 수 있도록 하는 방법인 Priority Donation을 통해 이러한 상황을 해결할 수 있다는 점을 알 수 있었다.

한 주간 프로젝트 1의 과제를 진행하면서 느낀 점은 코드를 구현하면서 실수로 인해 예상치 못한 문제를 해결하는 과정에서 지나치게 많은 시간이 소요되었다는 점이 아쉬웠다. 그러나 조원들과 커뮤니케이션을 통해 유익한 정보를 공유하고 의견을 주고받으며 새로운 것들을 배우고 이해가 되지 않았던 부분을 이해할 수 있었던 점이 좋았다. 아쉬웠던 부분을 보완하여 새로운 주차에 과제를 더욱 완성도 있게 수행하고 도전 과제까지 마무리하고 싶다.

0개의 댓글