1 분 소요

Alarm Clock

Part 1 : Threads

1주차의 과제는 총 3개인데

  • Alarm Clock
  • Priority Scheduling
  • Advanced Scheduler

이며,
현재 진행하는 과제는 Alarm Clock이다

Alarm은 ‘호출한 프로세스를 정해진 시간 후에 다시 시작하는 커널 내부 함수’ 이다

처음에는 ‘Busy waiting’ 방식으로 구현되어 있고
첫번째 과제는 이를 ‘Sleep/Wake Up’ 방식으로 다시 구현하는 것이다

  • Busy Waiting
    Thread 가 CPU를 점유하면서 대기하고 있는 상태
    CPU 자원이 낭비되며, 소모 전력이 불필요하게 낭비된다
  • Sleep / Wake Up
    Sleep : 일시적으로 활동을 중단하고 CPU를 쉬게 한다
    Wake Up : Sleep() 상태에서 깨어나 작동하는 상태

기존 구현 방식은
timer Sleep() 함수에서
while()을 통해, 지속적으로 스레드를
문맥교환 해주고 있다

첫 시도
현재 실행 중인 Thread를 그냥 Wait 상태로 만들고
일정 시간이 지난 이후 다시 RUNNING으로 바꾸어 주기

당연하겠지만,
존재하는 스레드 중 하나는 Running이며,
그에 따른 수 많은 Assert 에 걸려 장렬히 산화하였다

그에 따라
각종 pdf 및 같은 정글러들끼리의 아이디어 교환 등을 통해
‘새로운 리스트’ 인 Sleep List 를 선언하고 그에 따른 제어를 하는 방향으로
시도하였다

해당 시도 방식 중 깜빡한 실수 및 인식한 점

  • 인터럽트를 제한해야 하는 경우에 대한 예외처리를 하지 않았던 점
  • list remove 혹은 list push_back 을 호출한후 ‘다음’ 노드로 넘어갔던 점
    (이중 연결 리스트 기준이며, 디버깅으로 보니 이상한 곳을 가리킨다는 것을 뒤늦게 알았다)
  • timer 의 tick 전역변수는 하드웨어 인터럽트로 인해 증가한다(Timer Interrupt)

Alarm_Pass

[GitHub] : https://github.com/hnjog/pintos-kaist/tree/hnjog

댓글남기기