-
커널 타이머 관리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