Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

74261
1501
219116


[리눅스커널] 타이머 관리: 커널 타이머 주요 개념 소개 8. 커널 타이머 관리

커널 타이머는 리눅스 커널 핵심 기능 중 하나입니다. 커널 내부에서 배경 작업으로 다음 동작을 수행합니다. 
커널 스케줄링 함수들은 커널 타이머를 써서 프로세스를 제어합니다.
시스템 시간은 타이머 인터럽트를 받아 주기적으로 갱신됩니다.
Soft IRQ 타이머 서비스를 주기적으로 실행해 동적 타이머를 관리합니다.

또한 리눅스 커널 세부 알고리즘과 디바이스 드라이버는 실행 시간을 기준으로 세부 제어를 합니다. 예시를 들면 다음과 같습니다.
어떤 함수를 현재 시각 기준으로 200ms 초 후에 실행
어떤 함수가 500ms 내에 실행 안 하면 예외 처리
특정 함수를 1초 주기로 실행해서 시스템 상태를 점검

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

이번 절에는 ‘커널 시간 관리’를 이루는 주요 개념을 소개합니다.
HZ와 jiffies
Soft IRQ 서비스
커널 타이머와 동적 타이머

먼저 HZ 에 대해 배워볼까요?

HZ란 무엇인가

HZ는 진동수라고 부르며 다음과 같이 정의 내릴 수 있습니다.  

    1초에 지피스(jiffies)가 업데이트되는 횟수이다.

만약 HZ가 100이면 지피스는 1초에 100번 증감하고, HZ가 300이면 지피스는 1초에 300번 증감합니다.

HZ에 대한 이해를 돕기 위해 시계 초침을 예로 들겠습니다. 벽걸이 시계를 보면 1분에 60번 초침이 움직입니다. 그러면 1초 동안 100번 움직이는 초침이 있다고 상상해볼까요? 1초에 100번 움직이니 우리 눈으로 100번 초침이 바뀌는 것을 인지하지는 못할 것입니다. 리눅스 커널 관점으로는 HZ가 100이면 위에서 든 1초 동안 움직이는 100번 초침 횟수와 같다고 보면 됩니다. 

리눅스 커널 관점으로는 HZ는 1초 동안 움직이는 초침과 비슷한 개념입니다.  

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 장을 먼저 읽고 오시기 바랍니다.

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

우리가 생활에서 쓰는 알람과 커널 타이머는 개념 상 유사한 점이 많습니다. 다음과 같이 우문현답으로 커널 타이머와 동적 타이머가 무엇인지 풀어서 설명을 드리겠습니다.

누군가 여러분에게 다음과 같이 질문을 합니다.

    휴대폰으로 2시간 후 알람을 맞춰 놓으면 2시간 후에 어떤 동작을 할까요?

이 질문에 어떻게 대답하시겠습니까? 아마 다음과 같이 대답을 할 것입니다.

    2시간 후에 알람이 울릴 것이다.

이제 필자가 여러분에게 질문을 드리겠습니다.

    2시간 후 실행하도록 동적 타이머를 등록하면 2시간 후에 어떤 동작을 할까요?

조금 어렵게 들리는 질문이지만 필자라면 다음과 같이 대답을 할 것입니다.

    2시간 후에 동적 타이머가 실행될 것이다.

여기서 의문이 생깁니다. 과연 동적 타이머가 실행된다는 것은 어떤 의미일까?

      동적 타이머 핸들러가 호출된다.

이렇게 동적 타이머는 디바이스 드라이버 레벨에서 등록한 타이머를 의미합니다. 알람을 2시간 후에 맞춰 놓으면 알람이 울리듯 동적 타이머를 2시간 후로 지정해 등록하면 2시간 후에 동적 타이머가 실행하는 것입니다.

여러분이 알람을 맞춰 놓으면 내부에서 다음과 같은 동작을 할 것입니다.
1초 간격으로 시간 흐름을 체크
1초 간격으로 알람이 등록됐는지 확인 후 알람이 확인되면 알람을 울림 

마찬가지로 커널 타이머도 다음과 같은 일을 합니다.
jiffies 간격(1초에 100번)으로 시간 흐름을 체크
jiffies 간격으로 동적 타이머가 만료됐는지 확인 후 동적 타이머를 실행

커널 타이머는 배경으로 실행하면서 동적 타이머를 관리하고 실행하며 다음 동작을 수행합니다.
커널 타이머는 전체 시스템 관점에서 타이머를 처리하는 함수 흐름과 자료 구조입니다. 
커널 타이머는 Soft IRQ 서비스를 이용해서 커널 타이머 자료 구조를 관리하고 타이머를 호출한다. 

이번 챕터에서는 먼저 커널이 시간을 어떤 방식으로 관리하는지 먼저 살펴본 후 커널 타이머와 동적 타이머를 다룹니다. 

커널이 실행 시각을 관리하는 방식을 왜 잘 알아야 할까?

커널이 실행 시각을 관리하는 방식을 왜 잘 알아야 하는지 생각해봅시다.  

첫 번째, 코드를 읽는 능력을 더 키울 수 있습니다. 
리눅스 커널 세부 함수나 드라이버 코드에서 코드 처리 시간을 기준으로 실행 흐름을 제어하는 경우가 많습니다. 커널 코드를 읽으면 타이머 관련 함수를 써서 실행 시간을 제어하는 루틴을 만날 가능성이 높습니다. 드라이버 코드를 읽다가 타이머 관련 함수를 만나면 바로 이해해야 드라이버 구조를 이해할 수 있습니다. 
두 번째, 커널 타이머 구조를 알면 안정적인 타이머 코드를 입력해 시간 흐름을 제어할 수 있습니다. 다른 드라이버 코드를 참고해 동적 타이머를 작성하는 코드는 누구나 입력할 수 있습니다. 하지만 커널 타이머 전체 실행 흐름을 아는 분은 커널 타이머가 Soft IRQ 서비스로 실행한다는 사실을 알기에 동적 타이머 핸들러를 간결하게 작성할 것입니다. 

세 번째, 문제 해결 능력을 키울 수 있습니다.  
타이머를 써서 실행 시간을 제어하는 코드를 작성한 후 문제가 생기면 ftrace로 커널 타이머 이벤트를 써서 타이머 세부 동작을 추적할 수 있습니다. ftrace로 타이머가 제대로 등록됐는지 동적 타이머 핸들러가 호출될 시점인지까지 알 수 있습니다. 커널 타이머에 대한 디버깅 스킬 향상으로 문제 해결 능력을 키울 수 있습니다.

리눅스 커널의 시간을 처리하는 기법은 매우 다양하고 난이도가 높습니다. SoC(System On Chip)에서 제공하는 틱 디바이스와 timekeeping 그리고 HRTimer(High Resolution Timer)에 대한 기법도 있습니다. 이 주제는 리눅스 커널 입문자가 익히기는 어렵기 때문에 커널 타이머 관리 방법만 다룹니다. 커널 타이머 관리하는 기법을 제대로 익히면 다른 타이머 기법도 쉽게 분석할 수 있습니다.

* 강의 동영상도 있으니 같이 들으시면 좋습니다.




혹시 글을 읽고 궁금점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


# Reference: 커널 시간관리
커널 타이머 관리 주요 개념 소개
jiffies란
커널 타이머 제어
동적 타이머 초기화
동적 타이머 등록하기
동적 타이머는 누가 언제 실행하나?
라즈베리파이 커널 타이머 실습 및 로그 분석


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2



 







핑백

덧글

댓글 입력 영역