728x90
Interlocked
- 다중(멀티) 스레드에서 공유하는 변수에 대한 원자 단위 연산을 제공하는 클래스이다.
Interlocked.Increment(ref number);
- Increment는 원자성이 보장된 number에 +1을 하는 함수이다.
- number의 값을 인자로 넣는게 아니라 참조 값을 넘긴다.
문제점
- 원자성을 보장하기 위해 하드웨어 레벨에서 작동하므로 다른 일반 연산보다 더 많은 오버헤드가 발생한다.
- 여러 스레드가 동일한 자원에 동시에 액세스 하려고 할 때 경합이 발생할 수 있다. 이런 경합 문제는 스레드들이 자원을 기다리며 시간을 낭비하게 만들고 전체 프로그램의 성능을 저하시킨다.
- 경합과 경쟁에 대해서 착각을 했다.
- 경합(Contention)의 경우 여러 스레드가 동일한 자원에 동시에 접근하려고 할 때 발생하는 문제로 다음과 같은 이유로 성능 저하를 일으킬 수 있다.
- 경합의 본질
- 여러 스레드가 동시에 동일한 변수에 접근하고자 할 때, 그 변수에 대한 접근 권한을 얻기 위해 기다려야 할 수 있다.
- CPU 캐시 라인
- Interlocked 연산은 메모리에서 값을 읽고 수정한 다음 다시 쓰는 작업을 수행한다. 이 과정에서 CPU 캐시 라인이 여러 스레드 간에 공유되며, 이로 인해 캐시 동기화 비용이 발생할 수 있다. 여러 스레드가 동일한 메모리 주소에 접근하면 캐시 일관성을 유지하기 위한 프로토콜에 따라 캐시 라인이 무효화되고, 성능이 저하된다.
- 스핀락
- 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 |