크래프톤 정글 2기

[크래프톤 정글 2기] Day 58

KimCookieYa 2023. 5. 31. 11:24

회고

오늘은 Pint OS의 Project 1의 Priority Scheduling과 Synchronization을 구현했다. 그러나 제일 중요한 부분은 너무 어려워서 결국 솔루션을 봤다. 개념을 알 것 같다가도 코드를 보면 이해를 못해서 몇 번이나 개념을 숙지하려고 노력했다. 특히 어려웠던 것은 운영체제 교재에서 알려주는 락, 컨디션 변수, 세마포어와 핀토스에서 주어진 자료구조가 사용법이 달라서 이걸 이해하는 것이었다. 컨디션 변수의 waiting list의 우선순위 정렬을 하려면 아래와 같은 함수를 써야 한다. 자료구조가 복잡해서 스레드 간 우선순위를 비교하는 것만 해도 이렇게 타고 들어가야 한다는게 어려웠다.

bool
cmp_sem_priority (const struct list_elem *a, const struct list_elem *b, void *aux) {
    struct semaphore_elem * sema_a = list_entry (a, struct semaphore_elem, elem);
    struct semaphore_elem * sema_b = list_entry (b, struct semaphore_elem, elem);

    struct list * waiter_a = &(sema_a->semaphore.waiters);
    struct list * waiter_b = &(sema_b->semaphore.waiters);

    struct thread * thread_a = list_entry (list_begin(waiter_a), struct thread, elem);
    struct thread * thread_b = list_entry (list_begin(waiter_b), struct thread, elem);

    return thread_a->priority > thread_b->priority;
}

하나의 컨디션 변수 cond에 대해, cond는 하나의 조건이 만족할 때까지 대기하는 waiting list인 cond->waiters 를 가지고 있다. cond->waiters는 cond_wait()를 호출한 스레드를 리스트로 가지고 있다. 좀 특이한게, cond->waiters에서 직접적으로 스레드에 대한 정보를 가지고 있는게 아니라, semaphore_elem->semaphore->waiters->thread라는 객체로 하나의 스레드에 대한 정보를 리스트 요소로 가진다. 따라서 cond->waiters 내의 요소들을 우선순위순으로 정렬하기 위해서는 cmp_sem_pppriority() 함수를 사용해서 타고 들어가는 방식으로 우선순위를 꺼낼 수 있다. 나도 코드를 보고 무슨 소린가 싶었는데 자료구조를 보면서 간신히 이해했다.

 

오후 3시부터 소동이 있었다. 블루반에서 갑자기 2명이 코로나 확진 판정을 받아, 모두가 확진된 게 아니냐는 말이 나왔다. 주말에 부모님을 보기로 했는데 큰일이다. 바로 인근 이비인후과를 찾아 코로나 검사를 받기로 했다. 결과적으로 2명이 더 확진되기는 했지만, 나를 포함한 대부분이 음성이었다. 그래도 갑자기 확진자가 우수수 나오는 바람에 강의실 소독을 신청하고 자기 건강을 위해 마스크를 쓰기로 했다.

 

저녁부터는 Priority Donation에 대해 공부했는데 이것도 정말 어렵다. 개념은 알겠는데 구현을 못하겠다. 어떤 함수를 구현하라고 프로토타입을 제시해줬는데도 이걸 어쩌라는건지를 못 알아먹겠다. 오늘은 그냥 개념 숙지만 하고, 내일 제대로 구현해봐야겠다. 핀토스 첫주차도 벌써 막바지다.

 

오후 11시. 5일만의 헬스장을 갔다와서 다시 공부를 하러 강의실에 왔다. 에러에 고통받는 동료가 있어서 도와주려고 했는데, 대체 에러가 뭔지 알 수 없어서 새벽 4시까지 강의실에 있었다. 알고보니 struct semaphore_elem을 선언하기 전에 cmp_sem_priority() 를 선언해서 semaphore_elem을 찾지 못하는 문제였다. 정말 사소한 문제였다.