Linux Kernel(4.14) Hacks

rousalome.egloos.com

포토로그 Kernel Crash




[라즈베리파이] 워크큐(Workqueue)의 특징 [라즈베리파이] 워크큐

다른 인터럽트 후반부 처리 기법과 비교하면서 알아봤으니 이제 워크큐의 특징에 대해서 알아봅니다.

첫째, 드라이버 레벨에서 워크큐는 쓰기 쉽습니다. 워크큐는 struct work_struct 구조체 변수만 설정하고 워크를 실행할 코드에 queue_work() 나 schedule_work() 함수만 추가하면 됩니다. 간단한 코드로 워크큐를 쓸 수 있다는 것은 워크큐 관련 커널 함수들이 예외 처리나 로컬리티 등등 많은 처리를 한다는 의미입니다.

둘째, 워크큐 실행 단위는 워크이며 워크는 워커 쓰레드에서 실행합니다. 워커 쓰레드는 프로세스 레벨로 실행되는데 워커 쓰레드 실행 여부는 스케쥴러가 결정합니다. 따라서 밀리 초 이내로 워커 쓰레드 실행을 제어하기는 어렵습니다. 실행 시각에 민감한 후반부 처리 용도로 워크큐는 적합하지 않습니다. 

셋째, 워크큐를 쓰면 드라이버를 조금 더 유연하게 설계할 수 있습니다. 후반부 처리 코드를 워크 핸들러에 위치시킨 다음 schedule_work()나 queue_work() 함수로 워크를 실행하면  됩니다. 워크큐에서는 딜레이 워크(struct delayed_work)를 제공합니다. jiffies(HZ) 단위로 워크를 특정 시각 이후 지연 후 실행할 수 있습니다. 

동적 타이머가 1초에 실행하는 횟수를 HZ라고 하며 이 값은 jiffies란 변수가 저장하고 있습니다. 라즈베리파이는 1초에 jiffies 변수가 100만큼 증감하므로 HZ는 100입니다.

여러 디바이스 드라이버 코드를 눈여겨보면 워크와 딜레이 워크를 후반부 처리 용도로 같이 쓰는 경우를 볼 수 있습니다. 딜레이 워크를 활용하면 워크큐로 후반부 처리를 더 유연하게 수행할 수 있습니다. 

동적 타이머가 1초에 실행하는 횟수를 HZ라고 하며 이 값은 jiffies란 변수가 저장하고 있습니다. 라즈베리파이는 1초에 jiffies 변수가 100만큼 증감하므로 HZ는 100입니다.

워크와 딜레이 워크로 후반부 처리를 어떻게 하는지 예를 들어볼까요? 인터럽트 후반부를 2단계로 나눠서 드라이버를 설계할 수 있습니다. 워크를 인터럽트 후반부 처리 용도로 쓰고 딜레이 워크는 워크가 제대로 실행됐는지 모니터링하는 용도로 쓸 수 있습니다. 워크와 딜레이 워크를 활용해서 2단계로 인터럽트 후반부 처리를 할 수 있는 실습할 수 있는 코드는 다음에 확인할 수 있습니다.

정리하면 시간에 민감하지 않은 커널 후반부 처리 기법으로 워크큐를 쓸 수 있습니다.




핑백

덧글

댓글 입력 영역