리눅스 커널의 내용중에 spin lock에 대해 질문드립니다.
글쓴이: interoasis / 작성시간: 수, 2011/07/20 - 4:03오후
이쪽부분은 난생 처음 공부해보는거라 종종 이해안되는 내용들이 많습니다.
그중에서 이건 spin lock에 대한 내용인데
when a process finds the lock closed by another process, it "spins" around repeatedly, executing a tight instruction loop until the lock becomes open.
여기서 "spins" 돈다는게 정확히 어떤 동작인지 잘 이해가 가지 않습니다. tight instruction loop라는건 뭔가 쉴새없이 도는 루프라는 뜻같은데요. 이 부분에 대해서 답변좀 부탁드리겠습니다.
p.s : 한가지만 더 질문드리자면 uniprocessor environment에서 kernel control path가 lock돼있는 data structure에 액세스하려고하면 무한루프를 돈다고 하는데 이건 왜이런건가요? data structure는 스스로 lock을 오픈할 수 없는건가요?
Forums:
unlock될 때까지 계속해서 반복(spins
unlock될 때까지 계속해서 반복(spins around repeatly)하게 만드는 lock이라는 뜻에서 spinlock이라고 불리는 것 같습니다.
세마포와 비교하면 그 의미를 더 쉽게 알 수
세마포와 비교하면 그 의미를 더 쉽게 알 수 있습니다.
- 세마포: 록 획득을 시도하다 실패하면 (명시적인) 스케쥴링이 일어나고 현재 프로세스는 잠이 들게 됩니다.
- spin lock: 록을 시도하기 전에 preemption disable을 하므로 스케쥴링이 발생하지 않습니다.
그래서 록의 획득성공 및 반환하기 전까지 CPU을 점유하게 됩니다.
busy waiting을 wikepedia에서 찾아보니 spinning과 동일한 의미로 쓰이는 군요.
윗분(들?) 말씀 대로, spinning은 busy
윗분(들?) 말씀 대로, spinning은 busy waiting입니다.
p.s의 질문에 대한 답은 질문 원문과 문맥이 있으면 좀 더 확실할 것 같기는 한데...
어떤 자료 구조에 락이 걸려 있는 상태에서 또 다른 CPU(에서 실행되는 커널 코드)가 다시 spinlock을 잡으려고 하는 상황을 얘기하는 것 같습니다.
다중 프로세서 환경에서라면 락을 잡으려는 CPU가 spinning을 하고 있는 동안에도 다른 CPU에서 실행이 계속 이뤄집니다. 실행되는 코드 가운데에는 그 락을 풀어주는 루틴도 있을 것이고, 그러면 뺑뺑이 돌던 CPU가 락을 잡을 수 있게 됩니다.
하지만 단일 프로세서 환경이라면 CPU가 spinning을 하기 시작하면 그 락을 풀어줄 다른 CPU가 없습니다! 바로 무한루프입니다.
$PWD `date`
spin_lock은 윗분의 어떤 분이 답변 하신
spin_lock은 윗분의 어떤 분이 답변 하신 것처럼 또 다른 말로 busy waiting이라고도 합니다. spin lock은 기본적으로 SMP(Symmetric Multi Processor)환경에서 동작하는 경우에 사용하는 locking 매커니즘입니다. 즉 하나의 cpu에서 spin lock을 점유한 상황에서 다른 cpu에서 같은 lock을 점유하려고 할 때 lock이 풀렸는지 루프를 돌면서 계속적으로 확인합니다.
그리고 PS에 남겨주신 질문 역시 spin lock에 대한 것이 맞나요? 그렇다는 가정하에 답변 드리면, 일단 linux kernel의 경우 non preemptive kernel로 알고 있습니다. 즉 현재 process가 cpu에게 제어권을 주지 않는이상 선점하지 못한다는 의미입니다.(물론 kernel configuration을 변경하면 preemptive 환경으로 구동 가능하지요~! 기본적으론 non preemptive로 알고 있습니다.) 즉 lock이 이미 소유된 상황에서 다른 kernel thread가 해당 lock을 소유하려고 한다면, 앞서 말씀 드렸듯이 lock을 획득하기 전까지 cpu에서 제어를 넘기지 않겠지요. 즉 lock을 제거해야 할 kernel thread가 동작하지 않게 되기 때문에, 루프는 무한으로 돌게 되는 것이지요. 따라서 무한루프라고 한 것입니다. 다만, SMP 환경이 아닌 경우 spin lock은 do {} while( 0 )으로 처리되어서 아무짓도 안하도록 구현된 것으로 알고 있습니다. 물론 코드 구현하실 경우 SMP냐 아니냐에 따라서 구현하시는게 가장 좋겠지만, spin lock을 사용한다고 해서 dead lock이 발생하진 않을 것입니다.
댓글 달기