interrupt disable 구간에서 하지 말아야 할것.
interrupt disable 구간(local_irq_disable())이 도대체 무엇이길래 왜 만들어 놨으며 그 구간에서 해야 될 것과 하지 말아야 될 것이 있을까? (앞으로 글을 더욱 다듬어 가겠지만... 내 상식선에서 자답해보자.)
보통 interrupt disable이라면 scheduling이 일어나지 않는다가 먼저 떠오른다.(preemption disable과 같은가? 나중에 알아보자 -_-) 왜냐하면, scheduling이 일어나려면, tick이 발생해야 하는데 tick은 인터럽트에 의해서 발생이 되기 때문에 처리 불가능 구간이라면 schduling이 일어 날 수 없다. 달리 이야기 하면 남에게 방해 받고 싶지 않다면, interrupt disable구간을 만들고 뭔가를 하면되겠다. 근데 그 뭔가가(some code 겠지...) 잘못된 것이라면 system을 망칠 수 도 있다.
상식적으로 생각해 볼때, 꼭 interrupt disable구간에서 뭔가를 해야 한다면, 그 뭔가를 하는 코드는 짧아야 하며, 어떠한 문제도 일으켜서는 안된다. (그렇다면, 그 짧다는 기준은 뭔가? -_- 모르겟다.)
그리고 그 구간에서 주의해야 할 점을 몇가지 이야기 해본다.(더 있을지도 모른다. 찾아내고 발굴해야 한다.)
1. interrupt disable 하고 lock을 잡지 말자.
-spinlock의 경우 deadlock 을 발생시킬 수 있다.
-mutex, semaphore의 경우 lock을 획득하지 못한 core(SMP 환경)가 scheduling 받지 못하거나, lock 획득하지 못한 thread가 sleep 상태로 들어가 깨어나지 못할 수 있다.
2. interrupt disable 하고 schedule()을 호출 하지 말아라. 그 다음 schedule이 일어 나지 않을 가능성이 있다.
3. 생소한 Kernel API를 사용할 경우 그 안에서 lock을 잡는 것이 있는지 확인한다.
Keep going on... may be updated by Seungkon Hwang.!! (2013-02-12)