본문 바로가기

리눅스 커널의 구조와 원리/8. 커널 타이머 관리

[리눅스커널] 커널 타이머 관리: 주요 개념 소개 (HZ, jiffies)

커널 타이머는 리눅스 커널 핵심 기능 중 하나입니다. 커널 내부에서 배경 작업으로 다음 동작을 수행합니다.

- 커널 스케줄링 함수들은 커널 타이머를 써서 프로세스를 제어합니다.
- 시스템 시간은 타이머 인터럽트를 받아 주기적으로 갱신됩니다.
- Soft IRQ 타이머 서비스를 주기적으로 실행해 동적 타이머를 관리합니다.

또한 리눅스 커널 세부 알고리즘과 디바이스 드라이버는 실행 시간을 기준으로 세부 제어를 합니다. 예시를 들면 다음과 같습니다.

- 어떤 함수를 현재 시각 기준으로 200ms 초 후에 실행
- 어떤 함수가 500ms 내에 실행 안 하면 예외 처리
- 특정 함수를 1초 주기로 실행해서 시스템 상태를 점검

리눅스 커널이나 드라이버 코드를 분석하면 커널 타이머와 시간 흐름을 제어하는 코드를 만날 확률이 높습니다.

커널 타이머를 이해하려면 먼저 HZ가 무엇인지 알아야 합니다. 이어서 HZ에 대해 배워볼까요?

HZ란 무엇인가

HZ는 진동수라고 부르며 1초에 지피스(jiffies)가 업데이트되는 횟수를 의미합니다. 만약 HZ가 100이면 지피스는 1초에 100번 증감하고, HZ가 300이면 지피스는 300번 증감합니다.

HZ에 대한 이해를 돕기 위해 시계 초침을 예로 들겠습니다. 벽걸이 시계를 보면 1분에 60번 초침이 움직입니다. 이와 비슷하게 HZ가 100이면 어떻게 동작한다고 상상할 수 있을까요?

"1초 동안 100번 움직이는 초침과 같은 개념"

리눅스 커널 관점으로는 HZ가 100이면 위에서 든 1초 동안 움직이는 100번 초침 횟수와 같다고 보면 됩니다. 물론 1초에 100번 움직이니 우리 눈으로 100번 초침이 바뀌는 것을 인지하지는 못할 것입니다.


Soft IRQ TIMER_SOFTIRQ 서비스

커널 타이머는 Soft IRQ 서비스로 등록되어 실행합니다. 따라서 커널 타이머 전체 실행 흐름을 파악하려면 Soft IRQ 구조를 알아야 합니다. Soft IRQ 타이머 서비스 실행 흐름을 알아볼까요?

1. 타이머 인터럽트가 발생하면 TIMER_SOFTIRQ이란 Soft IRQ 서비스를 요청합니다.
2. Soft IRQ 서비스 루틴에서 TIMER_SOFTIRQ 서비스 아이디 핸들러인 run_timer_softirq() 함수를 호출합니다.
3. run_timer_softirq() 함수에서 time_bases이란 전역 변수에 등록된 타이머를 처리합니다.

Soft IRQ 전체 흐름을 알아야 커널 타이머 동작원리를 이해할 수 있습니다. Soft IRQ란 용어가 익숙하지 않은 분은 Soft IRQ를 먼저 파악해주세요. 

 

커널 타이머와 동적 타이머란 무엇인가

리눅스 커널에서 시간의 흐름을 제어하는 것이 중요하다고 언급했습니다. 리눅스 커널에서는 어떤 방식으로 시간의 흐름을 관리할까요?

- 예상된 시간 동안 코드가 실행된 다음 이후 약속된 함수를 실행한다.
- 주기적으로 약속된 함수를 실행한다.

이와 같은 동작을 위해 타이머를 실행해야 합니다. 이번에는 커널 타이머와 동적 타이머란 용어를 소개합니다.

“커널 타이머는 전체 시스템 관점에서 타이머를 처리하는 함수 흐름과 자료 구조이다.”

커널 타이머는 Soft IRQ 서비스를 이용해서 커널 타이머 자료 구조를 관리하고 타이머를 호출합니다. 커널 타이머는 배경으로 실행하면서 동적 타이머를 관리하고 실행하는 기능입니다.

“동적 타이머는 디바이스 드라이버 레벨에서 등록한 타이머이다.”

동적 타이머를 초기화하고 등록하면 커널 타이머가 이를 처리합니다. 먼저 커널이 시간을 어떤 방식으로 관리하는지 먼저 살펴본 후 커널 타이머와 동적 타이머를 분석합니다.