언어/C#

Interlocked

에린_1 2024. 7. 31. 09:53
728x90

Interlocked

  • 다중(멀티) 스레드에서 공유하는 변수에 대한 원자 단위 연산을 제공하는 클래스이다.
Interlocked.Increment(ref number);
  • Increment는 원자성이 보장된 number에 +1을 하는 함수이다.
  • number의 값을 인자로 넣는게 아니라 참조 값을 넘긴다.

문제점

  • 원자성을 보장하기 위해 하드웨어 레벨에서 작동하므로 다른 일반 연산보다 더 많은 오버헤드가 발생한다.
  • 여러 스레드가 동일한 자원에 동시에 액세스 하려고 할 때 경합이 발생할 수 있다. 이런 경합 문제는 스레드들이 자원을 기다리며 시간을 낭비하게 만들고 전체 프로그램의 성능을 저하시킨다.
    • 경합과 경쟁에 대해서 착각을 했다.
    • 경합(Contention)의 경우 여러 스레드가 동일한 자원에 동시에 접근하려고 할 때 발생하는 문제로 다음과 같은 이유로 성능 저하를 일으킬 수 있다.
      1. 경합의 본질
        • 여러 스레드가 동시에 동일한 변수에 접근하고자 할 때, 그 변수에 대한 접근 권한을 얻기 위해 기다려야 할 수 있다.
      2. CPU 캐시 라인
        • Interlocked 연산은 메모리에서 값을 읽고 수정한 다음 다시 쓰는 작업을 수행한다. 이 과정에서 CPU 캐시 라인이 여러 스레드 간에 공유되며, 이로 인해 캐시 동기화 비용이 발생할 수 있다. 여러 스레드가 동일한 메모리 주소에 접근하면 캐시 일관성을 유지하기 위한 프로토콜에 따라 캐시 라인이 무효화되고, 성능이 저하된다.
      3. 스핀락
        • Interlocked 연산이 경합을 피하기 위해 스핀락(짧은 시간 동안 반복적으로 재시도)을 사용 하는 경우, CPU 리소스를 낭비할 수 있다. 특히, 경합이 매우 빈번하게 발생하면 많은 CPU 사이클이 낭비된다.
728x90

'언어 > C#' 카테고리의 다른 글

SocketAsyncEventArgs  (0) 2024.07.31
as/ is/ this/ base  (0) 2024.07.31
ArraySegment  (0) 2024.07.31
Invoke & BeginInvoke  (0) 2024.07.31
ConcurrentQueue<T>  (0) 2024.07.31