Linux

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

Roien 2015. 7. 4.
반응형

* 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)

    

 




반응형

댓글