멀티스레딩 환경에서 동시성 문제를 고려해야 합니다.
자원에 여러 스레드가 동시에 접근할 때 발생할 수 있는 race condition(경쟁 상태), 교착 상태(Deadlock), 우선순위 역전(Priority Inversion) 등 다양한 문제가 존재하기 때문입니다.
이런 문제를 해결하기 위해 뮤텍스(Mutex)와 세마포어(Semaphore) 같은 락 기반(Lock-based) 동기화 기법이 흔히 사용됩니다.
하지만 이런 기법은 또 다른 문제를 야기할 수 있기 때문에, lock-free와 wait-free 같은 기법이 주목받고 있습니다.
이번 글에서는 이 기법들이 어떻게 멀티스레딩 환경에서 안전성을 보장하고, race condition을 해결할 수 있는지 알아보겠습니다.
락 기반 기법인 뮤텍스와 세마포어는 자원을 보호하기 위해 자원에 대한 접근을 제어합니다. 자원을 사용하기 전에 락을 걸고, 사용이 끝나면 락을 해제하는 방식이죠.
이 방법은 매우 직관적이고 효과적이지만, 몇 가지 심각한 문제가 있습니다.
이런 한계를 극복하고자 등장한 것이 바로 lock-free와 wait-free 기법입니다.
Lock-free 알고리즘은 "락 없이도 최소한 하나의 스레드는 작업을 완료할 수 있다"는 보장을 제공합니다.
이 방식에서는 원자적 연산(Atomic Operation)을 활용하여 자원에 대한 동시 접근을 제어합니다.
하지만 lock-free 알고리즘에서도 모든 스레드가 작업을 완료하는 데 걸리는 시간은 보장되지 않습니다. 일부 스레드가 일시적으로 더 많은 자원을 사용해 다른 스레드의 진행을 방해할 수 있습니다.
Wait-free 알고리즘은 모든 스레드가 유한한 시간 내에 작업을 완료할 수 있다는 것을 보장합니다.
이는 lock-free보다 더 강력한 동시성 보장입니다.
모든 스레드가 일정한 시간 내에 작업을 완료할 수 있도록 설계되어 있으며, 주로 원자적 연산을 활용해 race condition 없이 자원을 안전하게 접근할 수 있게 합니다.
Wait-free 알고리즘은 특히 실시간 시스템이나 성능이 중요하게 요구되는 환경에서 매우 유용합니다.
다만, 이러한 강력한 보장 때문에 구현이 복잡하고, 성능 상의 오버헤드가 발생할 수 있습니다.