Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

83258
1323
114585


[라즈베리파이] 워크큐(Workqueue) - 딜레이워크(delayed_work) 소개 8. Workqueue

워크큐는 대표적인 커널 후반부 처리 기법으로 후반부 처리 코드를 워크 핸들러에서 실행합니다. 동기적으로 처리 할 필요가 없는 코드를 워크 핸들러에 위치시켜 비동기적으로 커널 쓰레드 레벨에서 처리하는 겁니다. 이런 구조로 드라이버를 설계하면 다양한 디바이스 드라이버 시나리오에 맞게 코드를 구성할 수 있습니다. 워크에서 유연성을 추가한 기법이 딜레이 워크입니다.

구체적으로 딜레이 워크란 무엇일까요? 딜레이 워크는 워크를 일정 시각(HZ 단위) 후에 지연시켜 실행합니다. 여기서 말하는 지연 시각은 디바이스 드라이버 시나리오에 맞게 변경할 수 있습니다.

예를 들어 다음 온도를 콘트롤하는 드라이버 시나리오를 생각해 봅시다.
1. 온도가 높아지면 인터럽트가 발생
2. 인터럽트 핸들러에서 워크를 워크큐에 큐잉
3. 워크 핸들러에서 온도 콘트롤 디바이스에 CPU 클락을 낮췄다는 응답을 온도 콘트롤 디바이스에 전달
  - 딜레이 워크를 워크큐에 큐잉함(지연 시각은 60밀리 초 설정)
  - 시나리오: 온도 콘트롤 디바이스는 50밀리 초 후에 응답을 전달함
4. 딜레이 워크가 실행하면서 온도 콘트롤 디바이스에서 전달한 응답을 확인

위 온도 콘트롤 디바이스가 새롭게 바뀌어 온도 디바이스 응답 시간이 50초에서 80밀리 초로 변경됐다고 가정하겠습니다. 이럴 때 디바이스 드라이버 코드를 많이 수정해야 할 수도 있습니다. 그런데 딜레이 워크로 후반부 처리 코드를 설계하면 딜레이 워크의 지연 시각을 90 밀리 초로 변경하면 됩니다. 

여기서 딜레이 워크 지연 시각을 80밀리 초가 아닌 90밀리 초로 주는 이유는 충분히 응답을 기다리는 시각을 고려해야 하기 때문입니다.

딜레이 워크는 어떤 코드로 표현할 수 있을까요? 정답은 struct delayed_work 이란 구조체입니다. 해당 코드를 같이 보겠습니다. 
[https://elixir.bootlin.com/linux/v4.14.43/source/include/linux/workqueue.h]
1 struct delayed_work {
2 struct work_struct work;
3 struct timer_list timer;
4
5 struct workqueue_struct *wq;
6 int cpu;
};

각 멤버의 의미를 하나씩 살펴봅시다.

work
가장 첫 번째 멤버는 struct work_struct 타입의 work입니다. 이번 장에서 살펴봤던 워크를 표현하는 자료구조입니다.

timer
3번째 줄 코드를 보면 struct timer_list 이란 구조체인 timer를 볼 수 있습니다. 워크를 동적 타이머로 처리하기 위한 타이머 자료 구조입니다. 이 동적 타이머로 지정한 시간 후 워크를 실행합니다.

wq
struct workqueue_struct 구조체로 해당 딜레이 워크가 속한 워크큐 주소를 담고 있습니다.

cpu
딜레이 워크를 실행한 cpu 번호입니다.

딜레이 워크 자료구조를 보니 기존 struct work_struct 타입인 work 멤버와 struct timer_list이란 멤버를 볼 수 있습니다. 워크를 일정 시간 지연하기 위해 동적 타이머를 쓴다는 사실을 알 수 있습니다. 구조체 멤버를 보면 워크와 비슷한 동작을 한다고 유추할 수 있습니다.

이번에 딜레이 워크 구조체를 소개했으니 다음 소절에서 자료 구조로 딜레이 워크를 어떻게 초기화하는지 살펴보겠습니다. 이미 워크에 대해 상세히 코드 분석을 했으니 워크와 차이점 위주로 분석하겠습니다.


Reference(워크큐)
워크큐(Workqueue) Overview


덧글

댓글 입력 영역