리눅스 커널의 인터럽트 처리 방식에서 **Tasklet(태스크릿)**은 Bottom Half(하단부) 처리를 위한 메커니즘 중 하나입니다.
인터럽트 처리는 크게 두 단계로 나뉩니다.
- Top Half (Hard IRQ): 하드웨어 인터럽트가 발생했을 때 즉시 실행되어야 하는 최소한의 작업(레지스터 읽기 등)을 수행합니다. 이때는 다른 인터럽트가 차단되므로 매우 빨라야 합니다.
- 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가 더 유리하기 때문입니다.
'Embedded : : Linux > : : Linux Kernel' 카테고리의 다른 글
| ALSA Audio Server (0) | 2026.02.08 |
|---|---|
| [인터럽트 후반부 처리] 인터럽트 후반부 기법이란 (0) | 2025.03.01 |
| [인터럽트] 인터럽트는 언제 비활성화해야 할까? (0) | 2025.03.01 |
| 인터럽트 디스크립터 (0) | 2025.03.01 |
| 커널 아키텍처 (0) | 2025.03.01 |