[OS] lock-based, lock free, wait free

하비·2024년 9월 1일

CS

목록 보기
3/5

멀티스레딩 환경에서 동시성 문제를 고려해야 합니다.
자원에 여러 스레드가 동시에 접근할 때 발생할 수 있는 race condition(경쟁 상태), 교착 상태(Deadlock), 우선순위 역전(Priority Inversion) 등 다양한 문제가 존재하기 때문입니다.
이런 문제를 해결하기 위해 뮤텍스(Mutex)세마포어(Semaphore) 같은 락 기반(Lock-based) 동기화 기법이 흔히 사용됩니다.
하지만 이런 기법은 또 다른 문제를 야기할 수 있기 때문에, lock-freewait-free 같은 기법이 주목받고 있습니다.
이번 글에서는 이 기법들이 어떻게 멀티스레딩 환경에서 안전성을 보장하고, race condition을 해결할 수 있는지 알아보겠습니다.

락 기반 기법의 한계

락 기반 기법인 뮤텍스와 세마포어는 자원을 보호하기 위해 자원에 대한 접근을 제어합니다. 자원을 사용하기 전에 락을 걸고, 사용이 끝나면 락을 해제하는 방식이죠.
이 방법은 매우 직관적이고 효과적이지만, 몇 가지 심각한 문제가 있습니다.

  1. 교착 상태(Deadlock): 두 개 이상의 스레드가 서로가 필요로 하는 자원의 락을 잡고 있으면, 스레드들이 모두 멈추는 교착 상태가 발생할 수 있습니다.
  2. 우선순위 역전(Priority Inversion): 낮은 우선순위의 스레드가 자원을 점유하고 있을 때, 높은 우선순위의 스레드가 자원을 사용하지 못해 기다리는 상황이 발생할 수 있습니다.
  3. 락 대기 시간: 스레드가 자원의 락을 획득할 때까지 대기해야 하므로, 시스템의 전체적인 성능이 저하될 수 있습니다.

이런 한계를 극복하고자 등장한 것이 바로 lock-freewait-free 기법입니다.

Lock-Free: 교착 상태 없는 안전성

Lock-free 알고리즘은 "락 없이도 최소한 하나의 스레드는 작업을 완료할 수 있다"는 보장을 제공합니다.
이 방식에서는 원자적 연산(Atomic Operation)을 활용하여 자원에 대한 동시 접근을 제어합니다.

  • 원자적 연산: 중간에 다른 스레드가 개입할 수 없는 연산으로, 여러 스레드가 동시에 자원에 접근하더라도 일관된 상태를 유지할 수 있게 합니다.

Lock-free의 주요 장점:

  1. 교착 상태 없음: 락을 사용하지 않기 때문에 스레드 간에 서로를 기다리다가 멈추는 교착 상태가 발생하지 않습니다.
  2. 우선순위 역전 없음: 락 기반 방식과 달리, 특정 스레드가 자원을 점유하고 있어서 다른 스레드가 기다릴 필요가 없습니다.

하지만 lock-free 알고리즘에서도 모든 스레드가 작업을 완료하는 데 걸리는 시간은 보장되지 않습니다. 일부 스레드가 일시적으로 더 많은 자원을 사용해 다른 스레드의 진행을 방해할 수 있습니다.

Wait-Free: 가장 강력한 동시성 제어

Wait-free 알고리즘은 모든 스레드가 유한한 시간 내에 작업을 완료할 수 있다는 것을 보장합니다.
이는 lock-free보다 더 강력한 동시성 보장입니다.
모든 스레드가 일정한 시간 내에 작업을 완료할 수 있도록 설계되어 있으며, 주로 원자적 연산을 활용해 race condition 없이 자원을 안전하게 접근할 수 있게 합니다.

Wait-free의 주요 장점:

  1. 무한 대기 없음: 어떤 스레드도 다른 스레드 때문에 무한히 기다리지 않습니다. 모든 스레드가 공정하게 작업을 완료할 수 있습니다.
  2. 높은 예측 가능성: 모든 스레드가 일정한 시간 내에 작업을 완료할 수 있기 때문에, 실시간 시스템에서 매우 유리합니다.

Wait-free 알고리즘은 특히 실시간 시스템이나 성능이 중요하게 요구되는 환경에서 매우 유용합니다.
다만, 이러한 강력한 보장 때문에 구현이 복잡하고, 성능 상의 오버헤드가 발생할 수 있습니다.

profile
멋진 개발자가 될테야

0개의 댓글