Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

79258
1323
114581


[라즈베리파이] 워크큐(Workqueue)의 특징 8. 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입니다.


리눅스 커널 드라이버 코드를 보면 워크와 딜레이 워크를 후반부 처리 용도로 같이 쓰는 경우를 볼 수 있습니다. 그 이유는 다음과 같습니다.

    딜레이 워크를 활용하면 워크큐로 후반부를 더 유연하게 처리할 수 있다. 

워크와 딜레이 워크를 함께 사용해 후반부를 처리하는 한 가지 예를 들어볼까요? 
워크를 인터럽트 후반부 처리 용도로 쓰고 딜레이 워크는 워크가 정해진 시나리오대로 실행됐는지 모니터링하는 용도로 활용할 수 있습니다. 인터럽트 후반부를 2단계로 나눠서 드라이버를 설계할 수 있는 것입니다. 워크와 딜레이 워크를 활용해서 2단계로 인터럽트 후반부 처리를 할 수 있는 실습할 수 있는 코드는 7.10절에서 확인할 수 있습니다.





핑백

덧글

댓글 입력 영역