ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 커널 타이머 관리
    Linux/Linux Kernel 2020. 8. 16. 17:02

    동적 타이머

    동적 타이머 실행 흐름

     

    1. 동적 타이머 초기화 timer_setup()

     

    2. 동적 타이머 등록 add_timer() mod_timer()

    동적 타이머를 per_cpu 타입인 timer_bases 전역변수에 등록한다.

     

    3. 동적 타이머 실행 run_timer_softirq() __run_timers() __collect_expired_timers() call_timer_fn()

    Soft IRQ 타이머 서비스에서 동적 타이머를 실행한다.

     

    1) arch_timer_handler_phy()

    타이머 인터럽트가 발생하면 타이머 인터럽트 핸들러인 arch_timer_handler_phy() 함수가 실행된다.

    타이머 인터럽트는 1초에 HZ만큼 발생한다.

     

    2) run_local_timers()

    현재 CPU의 timer_bases 전역변수에 등록된 동적 타이머 중에 가장 먼저 만료될 동적 타이머의 만료시각과 현재 시간을 비교하여 만료된 타이머가 있는지 점검한다.

     

    arch_timer_handler_phy() 함수에서 jiffies를 1증가시키고 

    타이머 인터럽트가 발생하면 인터럽트 핸들러에서

     

     

    arch_timer라는 인터럽트가 발생하면 최종적으로 do_timer()함수가 호출되어 jiffies의 값이 증가한다.

     

     

    콜스택

     

    do_timer

    tick_do_update_jiffies64

    tick_sched_timer

    __hrtimer_run_queues

    hrtimer_interrupt

    arch_timer_handler_phys 타이머 인터럽트 핸들러 함수

    handle_percpu_devid_irq

    generic_handle_irq

    __handle_domain_irq

    bcm2836_arm_irqchip_handle_irq

    __irq_svc

     

     

    오차

    HZ가 100이면 1초에 100번 jiffies가 증가한다.

    jiffies가 1증가할때는 0.01초가 걸린다.

    0.01초는 10ms이다.

    jiffies가 1증가할 때는 10ms가 걸린다.

    jiffies는 최소 단위고 커널은 jiffies 단위로 동작하기 때문에 오차는 10ms 정도 오차가 생긴다.

     

    ex)

    1jiffies = 10ms

    2jiffies = 20ms

     

     

     

     

    'Linux > Linux Kernel' 카테고리의 다른 글

    시그널  (0) 2020.08.16
    시스템 콜  (0) 2020.08.16
    프로세스 스케줄링  (0) 2020.08.16
    커널 동기화  (0) 2020.08.16
    가상 파일 시스템  (0) 2020.08.16

    댓글

Designed by Tistory.