Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

0112
737
82110


[라즈베리파이] 워크큐(Workqueue) 소개 8장. 워크큐

워크큐는 인터럽트 후반부 처리 기법으로 많이 알려져 있는데 커널 전반에서 후반부를 처리하는 기법입니다. 인터럽트 후반부는 물론이고 프로세스 컨택스트 후반부 처리 용도로도 많이 씁니다. 즉, 어떤 코드에서도 워크큐를 써서 후반부 처리를 할 수 있다는 의미입니다.

그동안 배웠던 IRQ Thread와 Soft IRQ 와 같은 인터럽트 후반부 처리 기법과 워크큐를 비교하면서 워크큐의 특징을 알아보겠습니다.

IRQ Thread는 인터럽트 후반부 처리 전용 쓰레드이며 threaded IRQ 방식으로 인터럽트 후반부 처리를 할 수 있습니다. 마찬가지로 워크큐도 인터럽트 후반부 용도로 쓸 수 있습니다. 그런데 인터럽트 발생 빈도가 높거나 더 안정적인 코드 유지 보수를 위해서 IRQ Thread 기법 적용을 선호합니다. 그 이유는 IRQ Thread는 인터럽트 처리를 위한 전용 쓰레드이므로 이 기법은 소프트웨어적으로 복잡도가 워크큐에 비해 낮기 때문입니다. 

워크큐는 인터럽트 후반부만 아니라 커널 전체 후반부 처리를 하므로 예외 처리 코드가 많습니다. 예를 들어 워크큐에서는 하나의 워크가 2개 이상의 워커 쓰레드에서 실행하지 못하는 코드부터 워커를 관리하는 워크 풀은 percpu 타입 변수로 Migration과 같은 추가 동작을 합니다. 또한 시스템 부하에 따라 워커 쓰레드 개수가 많이 늘어나면 워크큐는 예외 처리를 수행합니다. IRQ Thread에 비해 처리 속도가 느려질 수도 있습니다.

IRQ Thread 기법은 워크큐에 비해 좋은 인터럽트 후반부 처리 방법일까요? 
IRQ Thread 기법이 항상 좋은 것은 아닙니다. 어떤 시스템에서 인터럽트 개수가 아주 많다고 가정합시다. 모든 인터럽트 후반부를 IRQ Thread 기법을 적용하면 각각 인터럽트를 처리하기 위한 전용 IRQ Thread를 생성합니다. 이때 인터럽트마다 IRQ Thread를 생성하면 메모리와 같은 시스템 리소스를 많이 차지하게 됩니다. 그래서 인터럽트 개수와 발생 빈도 그리고 인터럽트 후반부 처리 시나리오에 따라 IRQ Thread와 워크큐 기법을 선택하면 됩니다. 개발자분들이 시스템 설계에 따라 유연하게 인터럽트 후반부 기법을 결정해야 하는 겁니다.

이번에는 Soft IRQ 기법과 비교해 보겠습니다. Soft IRQ는 인터럽트 발생 빈도가 아주 높은 인터럽트 후반부를 처리할 때 씁니다. 하지만 워크큐는 커널 쓰레드 레벨에서 워크를 처리하기 때문에 Soft IRQ에 비해 처리 속도가 느립니다. 그 이유는 Soft IRQ는 인터럽트가 발생할때 마다 Soft IRQ 서비스 실행 여부를 점검하기 때문입니다. Soft IRQ 서비스 실행 빈도는 인터럽트 발생 횟수라 할 수 있습니다. 이에 비해 워크큐는 스케쥴링 정책에 따라 워커 쓰레드가 실행한 순서가 되야 실행됩니다. 

인터럽트 후반부 처리를 정해진 시간 내 빨리 처리해야 하는 경우 워크큐 방식은 바람직하지 않습니다. 다시 반복하지만, 어떤 후반부 기법을 쓸지는 시스템 설계와 인터럽트 후반부 처리 시나리오에 따라 결정해야 합니다. 

#Reference 워크큐
워크큐 소개
워크큐 종류 알아보기
워크란  
워크를 워크큐에 어떻게 큐잉할까?
   워크를 큐잉할 때 호출하는 워크큐 커널 함수 분석   
워커 쓰레드란
워크큐 실습 및 디버깅
   ftrace로 워크큐 동작 확인   
   인터럽트 후반부로 워크큐 추가 실습 및 로그 분석 
   Trace32로 워크큐 자료 구조 디버깅하기 
딜레이 워크 소개  
   딜레이 워크는 누가 언제 호출할까?
라즈베리파이 딜레이 워크 실습 및 로그 확인  


핑백

덧글

댓글 입력 영역