[임베디드 시스템] Timers


  • Timer interrupt
    • HZ : 1초당 timer interrupt되는 횟수 (interval = 1/HZ)
      • kernel 2.4ver : 100, 2.6 ver : 1000
        • CPU성능이 증가해서 가능해진 일이다.
      • HZ는 직접 바꿀 수 있다.
    • jiffies_64 : interrupt일어날 때마다 증가한다.

그림1 timer interrupt
  • Delay Execution(그림2를 보자)
    • kernel 2.4버전은 non preemptive 하기 때문에 schedule()을 하지 않으면 while이 도는 동안 cpu는 아무것도 못한다. 따라서 schedule()을 통해 다른 process에게 권한을 주는 것이다.
    • kernel 2.6이후로는 preemptive하기 때문에 schedule()을 호출하지 않아도 알아서 권한을 주게 되었다. 
      • preemptive하다는 것은, 프로세스가 다른 프로세스 수행 중에도 시간되면 CPU를 빼앗을 수 있는 걸 의미한다. 이 때 이전의 상태를 보관하는 context swithching과정의 overhead가 생긴다.
    • (3*HZ/10) = 0.3초임
그림2 delay execution
  • kernel timer
    • timer는 expires, expires시 실행할 handler function, function에 보낼 argument로 이루어져있다.
    • init_timer시 timer가 timer가 초기화된다.
    • add_timer시 timer가 timer_list에 등록된다. 
    • del_timer 시 timer가 timer_list로부터 제거된다.
    • timer device에서 interrupt가 일어나면, jiffies_64가 증가하고, 이를 timer_list에 있는 timer들의 expires와 비교하여 handler함수를 호출하게 된다. 
    • handler 함수가 호출되고 나면 해당 timer은 timer_list로부터 제거된다.
    • timer_list에는 여러 timer가 등록될 수 있으나, 같은 timer가 두번 등록되면 문제가 발생한다.
      • 내가 timer호출하면서 생겼던 문제들은 여기서 비롯된 것이다. 

그림3 kernel timer structure
그림4 kernel timer flow






댓글

가장 많이 본 글