현재 상황은 ISR과 프로세스 컨텍스트가 하나의 변수를 공유하고 있습니다. 이 변수를 상호배제를 하고 싶은데
ISR에서 사용가능한 도구가 spinlock밖에 없는것 같습니다. 그런데 문제는 가령 프로세스 컨텍스트가 spinlock을 잡고 데이터를 조작하는 순간
ISR이 떠서 다시 spinlock을 시도하게 되고 이때 deadlock이 발생하게 됩니다. 이를 상호배제 할수 있는 좋은 방법이 없을까요?
3) 변수를 atomic_t 타입으로 바꾸어 atomicity를 보장하는 API로 조작한다.
4) spin lock의 사용법에 문제가 없는지 다시 확인해 본다. 실제로는 프로세스 컨텍스트와 ISR 사이에 데드락이 일어난 게 아니라, 먼저 일어난 ISR과 나중에 일어난 ISR사이에 데드락이 일어났을 수도 있음.
* ldd3 chapter 5 p117 아랫부분
If you have a spinlockthat can be taken by code that runs
in (hardware or software) interrupt context, you must use
one of the forms of spin_lock that disables interrupts.
Doing otherwise can deadlockthe system, sooner or later.
그냥 생각나는대로 주절주절 적어봅니다. 1) 꼭
그냥 생각나는대로 주절주절 적어봅니다.
1) 꼭 변수를 공유해야하는지 다시 생각해본다.
2) 프로세스 컨텍스트에서 변수를 조작하는 동안 인터럽트를 마스크해 둔다.
3) 변수를 atomic_t 타입으로 바꾸어 atomicity를 보장하는 API로 조작한다.
4) spin lock의 사용법에 문제가 없는지 다시 확인해 본다. 실제로는 프로세스 컨텍스트와 ISR 사이에 데드락이 일어난 게 아니라, 먼저 일어난 ISR과 나중에 일어난 ISR사이에 데드락이 일어났을 수도 있음.
* ldd3 chapter 5 p117 아랫부분
http://lwn.net/images/pdf/LDD3/ch05.pdf
생산적인 댓글을 달자
조금 오프토픽입니다만
문득 프로세서가 atomic한 명령을 지원하지 않는 경우에는 atomic_xxx_xxx()함수가 어떻게 되어있는지 궁금해서 봤더니
그냥 인터럽트 마스크해버리네요.
생산적인 댓글을 달자
우선은
ISR과 다른 함수와 공용으로 사용하는 변수를 없애는게 좋습니다.
ISR에서는 다른 alias 변수를 업데이트하고 엡데이트했다는 것을 알려주는 flag를 하나 주시면 가능하고요.
다른 함수에서는 flag를 확인한 후에 변수를 업데이트할 지를 판단하면 됩니다.
공용이 불가결 필요하다면 함수 실행할 때 interrupt를 disable 해도 되고,
세마포를 걸어주어도 됩니다.
spinlock이 뭔지는 모르지만 priority ceiling이 지원되면 deadlock은 안생길 것 같은데요.
배타적 semphore는 dead lock이 안생기는데 이상하네요.
flag역시 ISR과 프로세스 컨텍스트에서
flag역시 ISR과 프로세스 컨텍스트에서 참조해야하는 공용변수이므로 여전히 배타처리가 필요하며, 문제의 근본적인 해결이 되지않습니다.
세마포는 sleep을 유발할 수 있으므로 ISR과 프로세스 컨텍스트 사이의 배타처리에 사용하면 데드락을 일으키는 원인이 될 수 있습니다.
priority ceiling이란 스레드간의 우선순위 역전현상을 억제해 데드락이나 우선순위가 높은 스레드의 응답성을 높이는 것으로, ISR과 프로세스 컨텍스트 사이의 배타처리와는 무관합니다.
생산적인 댓글을 달자
flag를 atomic_t로 쓰면 될 것
flag를 atomic_t로 쓰면 될 것 같습니다만..
그렇죠
기본적으로 flag는 atomic 해야 겠죠..
프로세스 문맥에서 spinlock_irq()나
프로세스 문맥에서 spinlock_irq()나 spinlock_irqsave()를 사용해서 현재 프로세서의 인터럽트를 비활성화 시키면 되긴 합니다. (sohn9086님의 2번 방안인 셈입니다.)
인터럽트를 오래 비활성화 시키면 대략 좋지 않은 일이 일어나므로 프로세스 문맥에서 락을 잡고 있는 시간은 최대한으로 짧게 해주시면 됩니다.
http://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/c214.html
$PWD `date`
댓글 달기