본문바로가기

 커널 spin lock의 차이점

 개발관련  2015. 3. 17. 10:36  창조컨서턴트

* spin_lock_irqsave()와 spin_lock_irq()

둘다 interrupt를 disable 시킨 이후에 spin lock을 획득하는 것은 동일하지만,

spin_lock_irqsave()는 CPU의 flag레지스터를 보관하다가

spin_unlock_irqrestore()로 복구할 수 있다. 


* spin_lock()과 spin_lock_irq()의 차이는

spin_lock은 interrupt를 disable하지 않기 때문에

interrupt handler(top half)에서는 사용할 수 없다.

대신 이때는 spin_lock_irq()나 spin_lock_irqsave()를 사용해야 한다. 


* spin_lock_bh()

같은 종류의 softirq는 여러 CPU에서 동시에 실행 될 있기 때문에

[ksoftirqd/CPUn] 커널쓰레드가 softirq의 실행을 담당한다.)

softirq를 disable한 이후에 spin lock을 획득한다. 

원래 이 함수의 이름은 spin_lock_softirq() 정도가 되어야 맞겠지만

예전 커널의 흔적이 아직 남아 있다. 


* 그리고 spin_lock은

spin lock으로 보호해야 할 데이터가 interrupt handler(top half)에서도,

softirq handler에서도 접근하지 않고 단지 그외의 일반적인 커널 코드에서만 접근한다면

interrupt disable, softirq disable 같은 overhead 없이 spin lock을 얻을때 사용한다.