-
반응형
1. Soft IRQ 서비스란?
리눅스 커널에서는 10가지 Soft IRQ 서비스를 지원한다. Soft IRQ 서비스의 실행 흐름은 크게 3단계로 나눌 수 있다. 부팅과정에서는 Soft IRQ 서비스를 1번 등록하고 2단계와 3단계를 자주 반복하면서 실행한다.
1단계: 부팅과정
부팅 과정에서 open_softirq() 함수를 호출해 Soft IRQ 서비스를 등록한다.
2단계: 인터럽트 처리
인터럽트 핸들러(인터럽트 컨텍스트)나 인터럽트 핸들러 내에서 호출한 서브 함수에서 raise_softirq() 함수를 호출해 Soft IRQ 서비스를 요청한다. raise_softirq() 함수의 이름 그대로 "Soft IRQ를 올린다"라고 부르는 경우도 있다.
3단계: Soft IRQ 컨텍스트
__do_softirq() 함수에서 이미 요청한 Soft IRQ 서비스를 실행한다.
인터럽트 핸들링이 끝나고 Soft IRQ 서비스를 바로 실행하는 동작을 Soft IRQ 컨텍스트라고 한다.
Soft IRQ 서비스 핸들러는 Soft IRQ 서비스를 실행할 때 호출하는 함수이다. 부팅 과정에서 open_softirq() 함수를 호출해 softirq_vec이라는 전역변수에 등록한다. 각 인텍스별로 Soft IRQ 서비스 핸들러 함수가 저장돼 있다. 이 함수들은 __do_softirq() 함수에서 호출된다. Soft IRQ 서비스를 요청할 때는 raise_softirq() 함수나 raise_softirq_irqoff() 함수를 호출해야 한다. 이때 요청할 Soft IRQ 서비스 아이디를 지정해야 한다.
2. Soft IRQ의 전체 흐름
Soft IRQ 서비스를 소개하였으니 이어서 전체 구조를 보자. Soft IRQ의 전체 동작은 4단계로 분류할 수 있다. 단계별로 세부 동작을 알아보자.
1단계인터럽트가 발생하면 해당 인터럽트 핸들러에서 Soft IRQ 서비스를 요청한다. 이를 위해 raise_softirq_irqoff() 함수를 호출해야 한다. 이는 인터럽트 핸들러에서 IRQ_WAKE_THREAD를 반환하는 동작과 유사하다.
2단계
인터럽트 서비스 루틴 동작이 끝나면 irq_exit() 함수를 호출한다. 여기서 Soft IRQ 서비스 요청 여부를 점검한다. 요청한 Soft IRQ 서비스가 있으면 __do_softirq() 함수를 호출해서 해당 Soft IRQ 서비스 핸들러를 실행한다. 만약 Soft IRQ 서비스 핸들러를 실행한다. 만약 Soft IRQ 서비스 요청이 없으면 irq_exit() 함수는 바로 종료한다.
3단계
__do_softirq() 함수에서 Soft IRQ 서비스 핸들러를 호출을 끝내면 Soft IRQ 서비스 요청이 있었는지 다시 체크한다. 이미 Soft IRQ 서비스 핸들러 처리 시간이 2ms 이상이거나 10번 이상 Soft IRQ 서비스 핸들러를 처리했다면 다음 동작을 수행한다.
- wakeup_softirqd() 함수를 호출해서 ksoftirqd 프로세스를 깨움
- __do_softirq() 함수 종료
__do_softirq() 함수 실행 시간에 제약을 건 이유는 __do_softirq() 함수를 호출하는 irq_exit() 함수가 프로세스가 일을 멈춘 상태에서 실행되기 때문이다.
4단계
ksoftirqd 프로세스가 깨어나 3단계에서 마무리하지 못한 Soft IRQ 서비스 핸들러를 실행한다.Soft IRQ가 인터럽트 후반부를 처리하는 흐름을 알아보니 IRQ 스레드 실행 구조보다 과정이 더 복잡하다. IRQ 스레드는 인터럽트 핸들러에서 못한 일을 프로세스 레벨에서 실행한다. 그런데 Soft IRQ 서비스는 인터럽트 핸들러가 수행된 후 바로 일을 시작한다. 그러니 Soft IRQ 서비스 핸들러는 빨리 실행해야 한다.
커널은 인터럽트 후반부 기법으로 IRQ 스레드, 워크큐, Soft IRQ를 지원한다. 이 중에서 Soft IRQ 기법은 인터럽트 발생 빈도가 높거나 인터럽트 후반부를 빨리 처리해야 할 때 사용한다. 그 이유는 인터럽트 핸들러 호출 이후 바로 Soft IRQ 서비스를 실행하기 때문이다. 인터럽트의 발생 빈도가 매우 높거나 인터럽트가 발생한 후 바로 처리해야 하는 경우 Soft IRQ를 쓰면 된다. 커널에서는 Soft IRQ를 디바이스 드라이버 레벨에서 쓸 수 있는 '태스크릿'이라는 인터페이스 환경을 제공한다.
1. 반응 속도에 민감한 네트워크 패킷 처리나 고속 그래픽 처리 및 스토리지(UFS: Universal Flash Storage) 드라이버들은 Soft IRQ 서비스를 이용해서 구현되었다.
2. 인터럽트가 발생하면 실행 중이던 프로세스를 멈추고 인터럽트 핸들러를 실행한다. 그런데 Soft IRQ는 인터럽트 핸들러가 수행하면 실행 중이던 프로세스로 돌아가지 않고 바로 Soft IRQ 실행을 시작한다. Soft IRQ에서 실행 시간이 오래 걸리면 시스템 반응 속도가 늦어질 수 있으므로 시스템 성능 문제가 생겼을 때 체크해야 할 점검 포인트 중 하나이다.
3. 커널 타이머를 제대로 이해하려면 Soft IRQ의 구조와 동작 원리를 알아야 한다. 드라이버에서 요청한 동적 타이머들은 타이머 인터럽트가 발생한 다음 Soft IRQ 서비스로 실행되기 때문이다
4. 태스크릿은 Soft IRQ 서비스 형태로 사용한다. 태스크릿을 제대로 이해하려면 Soft IRQ를 알아야 한다.
반응형