Embedded : : Linux/: : Linux Kernel

[인터럽트 후반부 처리] 6.12 태스크릿

Jay.P Morgan 2025. 3. 2. 00:00

 

 

리눅스 커널의 인터럽트 처리 방식에서 **Tasklet(태스크릿)**은 Bottom Half(하단부) 처리를 위한 메커니즘 중 하나입니다.

인터럽트 처리는 크게 두 단계로 나뉩니다.

  1. Top Half (Hard IRQ): 하드웨어 인터럽트가 발생했을 때 즉시 실행되어야 하는 최소한의 작업(레지스터 읽기 등)을 수행합니다. 이때는 다른 인터럽트가 차단되므로 매우 빨라야 합니다.
  2. Bottom Half (Soft IRQ/Tasklet/Workqueue): 급하지 않은 나머지 작업(데이터 복사, 프로토콜 처리 등)을 나중에 실행하도록 미루는 단계입니다.

이 중 Tasklet은 다음과 같은 특징을 가집니다.

 

 

1. Tasklet의 주요 특징

  • SoftIRQ 기반: Tasklet은 내부적으로 HI_SOFTIRQ나 TASKLET_SOFTIRQ라는 소프트웨어 인터럽트 위에서 동작합니다.
  • 원자적 실행(Atomic): Tasklet은 실행 중에 잠들 수(sleep) 없습니다. 따라서 뮤텍스(Mutex)나 세마포어(Semaphore)처럼 프로세스를 대기 상태로 만드는 동기화 도구를 사용할 수 없습니다.
  • 동일 CPU 실행: Tasklet은 자신을 스케줄링한(요청한) 바로 그 CPU에서 실행됩니다.
  • 비재진입성(Non-reentrant): 가장 중요한 특징입니다. 같은 종류의 Tasklet은 여러 CPU에서 동시에 실행되지 않습니다. 즉, 한 Tasklet이 실행 중이면 다른 CPU에서 동일한 Tasklet을 실행하려고 해도 대기하게 됩니다. 이 덕분에 개발자가 복잡한 잠금(Locking) 처리를 고민할 필요가 줄어듭니다.

 

 

 

2. Tasklet의 동작 구조

Tasklet은 struct tasklet_struct 구조체로 정의되며, 주요 필드는 다음과 같습니다.

  • next: 다음 Tasklet을 가리키는 포인터 (리스트 구조)
  • state: 현재 Tasklet의 상태 (등록됨, 실행 중 등)
  • count: 활성화/비활성화 카운터
  • func: 실제로 실행될 핸들러 함수
  • data: 함수에 넘겨줄 인수

 

 

 

3. 왜 Tasklet을 쓰나요?

  • 간편함: SoftIRQ를 직접 구현하려면 커널 컴파일 시점에 정적으로 등록해야 하고 모든 CPU에서의 동시 실행을 고려해야 해서 매우 까다롭습니다. Tasklet은 런타임에 동적으로 등록할 수 있고 동시 실행 문제를 커널이 알아서 막아주기 때문에 훨씬 쓰기 편합니다.
  • 성능: Workqueue보다는 빠릅니다. Workqueue는 커널 스레드를 통해 실행되므로 컨텍스트 스위칭 오버헤드가 있지만, Tasklet은 인터럽트 컨텍스트(또는 ksoftirqd)에서 바로 실행되기 때문입니다.

 

 

 

4. 최근의 추세 (중요)

현대 리눅스 커널(특히 6.x 버전대)에서는 **Tasklet 사용을 지양(Deprecated)**하는 분위기입니다.

  • 이유: Tasklet은 구조상 직렬화(Serialization) 문제가 있고, 특정 CPU에 부하를 집중시킬 수 있습니다.
  • 대안: * 간단하고 빠른 처리가 필요하면 SoftIRQ를 직접 사용하거나,
    • 복잡하고 시간이 걸리는 작업은 Threaded IRQ Workqueue로 옮기는 추세입니다.

현재 진행 중인 i.MX8M Plus AAOS 16 프로젝트에서는 NXP의 최신 드라이버들이 Tasklet 대신 Threaded IRQ를 사용하는 것을 자주 보실 수 있을 것입니다. 실시간성이 중요한 소음 제어 처리에서도 Tasklet보다는 스케줄링 우선순위 조절이 가능한 Threaded IRQ가 더 유리하기 때문입니다.