작성
·
1.2K
1
강의 하실때 lock방식과 lock-free방식에 성능 차이가 없다는 것처럼 이야기 하셔서,
왜 성능 차이가 없을까 라는 것을 생각 해 보면, 주로 성능 차이가 어디에서 오냐를 먼저 고민해 봐야 할 것입니다.
저의 생각으로는, 정상적인 상황에서 Context switching으로 인해 커널 - 유저 모드 전환에서 큰 비용이 발생한다고 생각이 됩니다. 전통적인 Event 방식이 대표적인 예라고 생각합니다.
작업하신 lock-free 방식을 볼때마다 spinlock이 계속 떠올랐습니다. 결국 User mode에서 polling하고 있는 것이 겠지요.
어디서 주워 듣기로는 요즘 lock들도 커널 모드로 바로 들어가 일정시간 잠들지 않고, user mode에서 3000번, 5000번 정도 while을 돌면서 소유권을 얻을 수 있는지 확인한다고 합니다. 그 횟수동안 얻지 못하면 sleep 되는 식으로 알고 있습니다.
결국 빠르게 소유권이 전환되는 상황이라면 user mode에서만 작업이 발생하기 때문에 큰 overhead가 없다고 볼 수 있을 것 같습니다.
이러한 이유로 두 방식의 성능 차이가 거의 없다고 보는데 다른 분들의 의견이 궁금합니다.
답변 1
1
어디서 주워 듣기로는 요즘 lock들도 커널 모드로 바로 들어가 일정시간 잠들지 않고, user mode에서 3000번, 5000번 정도 while을 돌면서 소유권을 얻을 수 있는지 확인한다고 합니다. 그 횟수동안 얻지 못하면 sleep 되는 식으로 알고 있습니다
-> 네 Windows의 CriticalSection이 실제로 그렇게 변화했습니다. (일부 스핀락)
작업하신 lock-free 방식을 볼때마다 spinlock이 계속 떠올랐습니다. 결국 User mode에서 polling하고 있는 것이 겠지요.
-> 스핀락이라 하더라도 내부적으로는 CAS 연산이 들어가고, LockFree 코드를 만들 때도 CAS가 들어갑니다. 다만 정말 [LockFree]라 표현하는 알고리즘은 서로 방해를 안 하고 진행되어야 하며, Queue에서 Pop/Push 를 할 때 데이터가 충분히 있다면 서로 영향을 주지 않고 LockFree로 Push/Pop을 병렬로 처리가 가능하겠죠.
다만 이론이 어떻든 LockFree라 해서 완벽하게 서로 영향을 주지 않는 상황은 많지 않기에
실제 테스트를 해보면 Lock을 걸고 하는 것이 차라리 빠른 경우가 많습니다.