completion 과 semaphore
글쓴이: 훌륭한녀석 / 작성시간: 금, 2004/03/12 - 2:08오후
커널 syncronization문제입니다.
completion과 semaphore에 대해서 무엇때문에 completion을 사용하는지 모르겠습니다. understanding linux kernel에서는 smp일 경우 한쪽(CPU1에서 작동하는 process A)에서 temporary(?!) semaphore 변수를 만들고, 그 주소를 다른 cpu에 동작하는 프로세스 B에 전달하고 down()시킵니다. 그리고선 CPU2의 process B는 같은 semaphore에 대해서 up()시킵니다. 이 때 CPU1에서 실행중인 proceess A가 세마포어를 없애버리면 process B가 잘못된 값을 참조 할 수 있다고 합니다.
왜 이렇게 되는걸까요?
생각해 본 바로는
process A가 down시킨 세마포어 변수가 automatic변수이다. 그래서 process a가 완료되어서(그래서 로컬변수인 semaphore는 소멸된다) process B가 up하려하면 잘못된 부분을 엑세스 하려 할 것이다.
이렇게 생각하고 있는데, completion의 소스를 보면
void complete(struct completion *x) { unsigned long flags; spin_lock_irqsave(&x->wait.lock, flags); x->done++; __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, 0); spin_unlock_irqrestore(&x->wait.lock, flags); }
이렇게 스핀락만 걸려있는것을 볼 수 있거든요? 사실 저 위의 문제인 경우는 completion에도 마찬가지 아닌가요?
Forums:
댓글 달기