ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pintos] Project1_Alarm Clock 해설
    Pintos 2023. 6. 27. 16:08

    Alarm Clock

    Reimplement timer_sleep(), defined in devices/timer.c.

     

    devices/timer.c에 정의된 timer_sleep()을 다시 구현합니다.

    작동하는 구현이 제공되지만, 현재 시간을 확인하고 충분한 시간이 경과할 때까지 thread_yield()를 호출하는 루프를 돌리는 등 바쁘게 대기합니다. 바쁜 대기를 피하려면 다시 구현하세요.

    void timer_sleep (int64_t ticks);

    시간이 x timer ticks 이상 진행될 때까지 호출 스레드의 실행을 일시 중단합니다. 시스템이 idle 상태가 아닌 한 스레드는 정확히 x tick 후에 깨어날 필요가 없습니다. 적절한 시간 동안 기다린 후 준비 대기열에 넣으면 됩니다.

     

    timer_sleep()은 초당 한 번 커서를 깜빡이는 등 실시간으로 작동하는 스레드에 유용합니다. timer_sleep()의 인수는 밀리초나 다른 단위가 아닌 타이머 틱으로 표현됩니다. 초당 타이머 틱은 TIMER_FREQ 타이머 틱이 있으며, 여기서 TIMER_FREQ는 devices/timer.h에 정의된 매크로입니다. 기본값은 100입니다. 이 값을 변경하면 많은 테스트가 실패할 수 있으므로 변경하지 않는 것이 좋습니다.

    각각 특정 밀리초, 마이크로초 또는 나노초 동안 절전 모드로 전환하기 위한 별도의 함수 timer_msleep(), timer_usleep() 및 timer_nsleep()이 존재하지만, 이 함수는 필요할 때 timer_sleep()을 자동으로 호출합니다. 수정할 필요가 없습니다. 알람 시계 구현은 이후 프로젝트에는 필요하지 않지만 프로젝트 4에는 유용할 수 있습니다.

     


     

     

    Priority Scheduling

    Implement priority scheduling and priority donation in Pintos.

     

    pintos에서 우선 예약 및 우선 기부 기능을 구현하세요.

    현재 실행 중인 스레드보다 우선순위가 높은 스레드가 준비 목록에 추가되면 현재 스레드는 즉시 프로세서를 새 스레드에 양보해야 합니다. 마찬가지로 스레드가 잠금, 세마포어 또는 조건 변수를 기다리는 경우 우선순위가 가장 높은 대기 스레드가 먼저 깨어나야 합니다. 스레드는 언제든지 자신의 우선순위를 높이거나 낮출 수 있지만, 우선순위를 낮추어 더 이상 가장 높은 우선순위를 갖지 않게 되면 즉시 CPU를 양보해야 합니다.

    스레드 우선 순위의 범위는 PRI_MIN(0)에서 PRI_MAX(63)까지입니다. 숫자가 낮을수록 우선순위가 낮으므로 우선순위 0이 가장 낮고 우선순위 63이 가장 높습니다. 초기 스레드 우선순위는 thread_create()에 인수로 전달됩니다. 다른 우선순위를 선택해야 할 이유가 없는 경우 PRI_DEFAULT(31)를 사용합니다. PRI_ 매크로는 threads/thread.h에 정의되어 있으므로 값을 변경해서는 안 됩니다.

    우선순위 스케줄링의 한 가지 문제는 "우선순위 반전"입니다. 우선순위가 각각 높은 스레드, 중간 스레드, 낮은 스레드 H, M, L을 생각해 봅시다. H가 L을 기다려야 하는데(예: L이 보유한 잠금을 위해) M이 준비 목록에 있는 경우, 우선순위가 낮은 스레드는 CPU 시간을 전혀 얻지 못하므로 H는 CPU를 절대 얻지 못합니다. 이 문제를 부분적으로 해결할 수 있는 방법은 L이 잠금을 보유하는 동안 H가 자신의 우선순위를 L에게 "기부"한 다음, L이 잠금을 해제하면(따라서 H가 잠금을 획득하면) 기부한 것을 회수하는 것입니다.

    우선순위 기부를 구현합니다. 우선순위 기부가 필요한 다양한 상황을 모두 고려해야 합니다. 단일 스레드에 여러 우선순위가 기부되는 다중 기부를 처리해야 합니다. 또한 중첩된 기부를 처리해야 합니다. H가 M이 보유한 잠금에 대해 대기 중이고 M이 L이 보유한 잠금에 대해 대기 중인 경우, M과 L 모두 H의 우선순위로 부스트되어야 합니다. 필요한 경우 8단계와 같이 중첩된 우선순위 기부의 깊이에 합리적인 제한을 둘 수 있습니다.

    잠금에 대한 우선순위 기부를 구현해야 합니다. 다른 핀토스 동기화 구조에 대해서는 우선순위 기부를 구현할 필요가 없습니다. 모든 경우에 우선순위 스케줄링을 구현해야 합니다.

    마지막으로 스레드가 자신의 우선순위를 검사하고 수정할 수 있는 다음 함수를 구현합니다. 이러한 함수에 대한 스켈레톤은 threads/thread.c에 제공됩니다.

     

    void thread_set_priority (int new_priority);
    

    현재 스레드의 우선순위를 새 우선순위로 설정합니다. 현재 스레드의 우선순위가 더 이상 높지 않으면 양보합니다.

     

    int thread_get_priority (void);
    

    현재 스레드의 우선순위를 반환합니다. 우선순위 기부가 있는 경우, 더 높은(기부된) 우선순위를 반환합니다.

     

    스레드가 다른 스레드의 우선순위를 직접 수정할 수 있도록 인터페이스를 제공할 필요는 없습니다.

    우선순위 스케줄러는 이후 프로젝트에서 사용되지 않습니다.

Designed by Tistory.