-
반응형
대부분의 운영체제에서는 이벤트나 실행 시간의 흐름을 기준으로 함수나 드라이버를 제어한다. 리눅스 커널도 예외는 아니다. 리눅스 커널에서 지원하는 타이머는 1/HZ 단위로 동작하는 저해상도(Low Resolution) 타이머와 나노초 단위인 고해상도(High Resolution) 타이머로 분류할 수 있다. 일반적으로 디바이스 드라이버에서 사용하는 타이머는 저해상도 타이머이며, 이를 커널 타이머라고 부르기도 한다. 커널 타이머는 코드를 직접 입력하고 라즈베리 파이에서 빌드한 코드를 실행하면서 실습하는 과정이 필요하다.
1. 커널 타이머(저해상도 타이머)의 주요 개념
커널 타이머는 리눅스 커널의 핵심 기능 중 하나이다. 커널을 구성하는 많은 서브시스템에서는 커널이 제공하는 타이머 함수를 이용해 백그라운드 작업으로 다음과 같은 동작을 수행한다.
- 스케줄링 함수들은 커널이 제공하는 타이머 관련 함수를 사용해 프로세스를 제어한다
- 시스템 시간은 타이머 인터럽트를 받아 주기적으로 갱신된다.
- Soft IRQ 타이머 서비스를 주기적으로 실행해 동적 타이머를 관리한다.
또한 리눅스 커널의 세부 알고리즘과 디바이스 드라이버는 실행 시간을 기준으로 세부 제어를 한다. 예를 들면 다음과 같다.
- 어떤 함수를 현재 시각을 기준으로 200ms 후에 실행
- 어떤 함수가 500ms 내에 실행되지 않으면 예외 처리
- 특정 함수를 1초 주기로 실행해서 시스템의 상태를 점검
리눅스 커널이나 드라이버 코드를 분석하면 커널이 지원하는 타이머 함수를 사용해 실행 시간의 흐름을 제어하는 코드를 만날 확률이 높다.
HZ란?
HZ는 진동수라고 부르며 1초에 지피스(jiffies)가 업데이트되는 횟수라고 정의할 수 있다.
Soft IRQ의 타이머 서비스란?
커널 타이머는 Soft IRQ의 TIMER_SOFTIRQ 서비스 구조 내에서 실행된다. 따라서 커널 타이머의 전체 실행 흐름을 파악하려면 Soft IRQ의 구조를 알아야 한다. Soft IRQ에서 TIMER_SOFTIRQ 서비스의 실행 단계는 다음과 같다.
1. 타이머 인터럽트가 발생하면 TIMER_SOFTIRQ라는 Soft IRQ 서비스를 요청한다.
2. Soft IRQ 서비스 루틴에서 TIMER_SOFTIRQ 서비스의 아이디 핸들러인 run_timer_softirq() 함수를 호출한다.
3. run_timer_softirq() 함수에서는 timer_bases라는 전역변수에 등록된 동적 타이머를 처리한다.
Soft IRQ 타이머(TIMER_SOFTIRQ) 서비스와 동적 타이머란?
일상생활에서 쓰는 알람과 동적 타이머는 개념상 유사한 점이 많다. 동적 타이머가 실행된다는 건 동적 타이머 핸들러가 호출된다는 의미이다. 이처럼 동적 타이머는 디바이스 드라이버 레벨에서 등록한 타이머를 의미한다. 알람을 2시간 후에 맞춰 놓으면 알람이 울리듯 동적 타이머를 2시간 후로 지정해 등록하면 2시간 후에 동적 타이머 핸들러가 실행된다. Soft IRQ타이머 서비스는 다음과 같은 일을 한다.
- jiffies 간격(HZ 기준 : 1초에 100번)으로 시간 흐름을 체크
- jiffies(1/HZ) 간격으로 만료되는 동적 타이머가 있는지 확인한 후 동적 타이머 핸들러를 실행
우리가 알람을 맞춰 놓으면 지정한 시간에 알람이 울린다. 그 원리에 대해 조금 더 생각해 보면 누군가 알람을 설정했는지 주기적으로 체크하기 때문에 알람이 정해진 시간에 울리는 것인데, 이처럼 주기적으로 알람이 설정됐는지를 Soft IRQ타이머 서비스가 체크한다. Soft IRQ 타이머 서비스는 백그라운드로 실행되면서 동적 타이머를 관리하고 실행하면서 다음과 같은 동작을 수행한다. Soft IRQ 타이머 서비스는 전체 시스템 관점에서 타이머를 처리하는 함수 흐름과 자료구조이다. Soft IRQ 타이머 서비스는 Soft IRQ 구조 내에서 실행되며 전체 동적 타이머를 관리하는 자료구조를 관리하고 동적 타이머 핸들러를 호출한다.
반응형