다음과 같은 ordering violation을 해결할 수 있는 방법이 있을까요?
글쓴이: athxue / 작성시간: 금, 2011/03/18 - 1:38오후
main_func() { var ret; ret = do_A(); wait(wait_queue); } inthndl() { wakeup(wait_queue); }
위와 같은 코드가 있습니다. 이때 do_A()를 통해 하드웨어 동작을 트리거하고 wait으로 잠들게 됩니다(하드웨어 동작이 끝날때 까지 Busy waiting을 하지 않기 위해 sleep함).
하드웨어 동작이 완료되면 inthndl()을 통해 잠든 프로세스를 깨우게 되는데 이때 main_func()의 do_A()와 wait함수가 반드시 불리고 wakeup이 불린다는 가정을 하게되면 위의
코드가 문제 없지만 do_A()가 불리고 inthndl()이 먼저 불리게 되면 wakeup -> wait 순서로 불리게 되어 문제가 있습니다.
이런 호출 순서 문제를 해결하기 위한 좋은 방법이 있을까요?
Forums:
http://kldp.org/node/101059#c
http://kldp.org/node/101059#comment-469458
리눅스의 completion 을 따라한거죠.
갈비만 추리면...
변수를 하나 둬서 wait 를 하기 전에 검사할 것.
wait 끝나고나면 그 변수 reset 할 것.
그 변수에 대해 접근할 때 atomic 을 보장할 것.
댓글 달기