Linux kernel Bottom half 정리 (softirq, tasklet, workqueue) - part 1

2021. 12. 14. 18:25Linux

    목차
반응형

* bottom half 사용 이유

 

1. 다른 코드를 너무 오래 동안 중단시켜서는  
2. 처리 중인 interrupt 비활성화 시킨 상태에서, 최악의 경우 
        IRQF_DISABLED 설정되지 않은 경우
        현재 procesor 모든 interrut 비활성화 시킨 상태에서 실행 
        , 오래 걸리면 interrupt 무시될  있음
3. 휴면 상태가   없음

        

    cf.

        일반적인 bottom half tasklet을이용해 구현하는 것이 좋다.

            1) 동적생성 가능

            2) 빠른편

            3) 사용이간단 (multi-processor에대한 신경을  써도 )

              state 둬서 이미 실행 중인 것은 실행  하게 

 

ISR

    interrupt 수신상태를 확인

    등의 간단한 작업만 수행해야 

 

    그래야 interrupt를제때 놓치지 않고 실행할  있기에,

        반응성이향상됨

 

 

* bottom half 3가지 종류

 

1) softirq
        정적 등록
        성능 높음, 동일 실행 가능 (다른 processor에서 동일 softirq 실행 가능)
2) tasklet
        softirq기반의 동적 등록 가능
        성능 낮음, 동일 실행 불가 (다른 processor에서 동일 tasklet 실행 불가)
3) workqueue

 

    softirq network 처럼 성능이 아주 중요한 경우에 사용함

    하지만, 같은 softirq가동시에 실행   있기에 주의가 필요

        정적으로등록

    

    

    지연되는 작업이 휴면 상태 전환이 필요한 경우라면 workqueue를사용

 

 

cf.

    kernel timer

     : 타이머를이용하면 일정 시간이 경과한 이후에 작업을 지연 시킬  있음

 

 

* softirq

 

1. 특징
        가장 실행 시간에 민감하고 중요한 후반부 처리의 수행  사용
            ex.
            Network,
            block device
 
        절대 다른 softirq 선점하지 않음
        다른 processor에서 같은 softirq까지 실행   있음
        
        interrupt 활성화  동작 -> handler 실행  현재것 비활성
             , 다른 processor에서 동작 가능
             그래서 일반적인 경우 tasklet 사용하길 권장
             
        softirq handler processor  data만을 사용하고 명시적 lock 사용하지 않아야 하며
            이로서 여러 processor (개수에 관계 없이) 사용 가능함

 

        cf.

           tasklet

            : 동적 생성 가능

            lock 사용이  엄격함

            사용하기 편하면서 괜찮은 성능

            

            자체적으로 효율적 lock 관리가가능하다면 softirq 좋음

            (CPU  lock 걸어줘야 )

 

 

2. 실행 시점
        1) hardware interrupt 코드의 return 시점
        2) ksoftirqd kernel thread 내에서
        3) 명시적으로 코드에서 지연 상태인(defered) softirq 실행 경우

 

 

struct softirq_action {
        void (*action)(struct softirq_action *);
    }
    
    @ kernel/softirq.c    
    static struct softirq_Action softirq_vec[NR_SOFTIRQS]; // max 32

 

            32개중 9개만 등록되어        

    

    softirq handler

        voidsoftirq_handler(struct aoftirq_action *)

    

    my_softirq pointer softirq_vec   item을가리키고 있는 경우

        다음과같이 softirq handler를호출   있음

 

my_softirq->action(my_softirq);

 

 

softirq raise

    실행 표시임    

    interrupt handler가실행 종료 전에 해당 softirq에실행 표시를 (raise)

    

 

 

 

반응형