반응형

어떤 스레드가 동기화 요소를 소유한 채로 해제하지 않으면 동일한 동기화 요소를 대기하던 스레드는 영원히 블로킹될 수 있다.

유저 모드 동기화 요소인 경우 라이브락(LiveLock)

커널 모드 동기화 요소인 경우 데드락(DeadLock)

둘 다 좋지 않지만 그래도 라이브락이 더 안 좋다. 데드락은 메모리만을 허비하지만 라이브락은 CPU, 메모리 둘 다 허비하기 때문

유저 모드 동기화

일반적으로 데이터를 읽고 쓰는 과정은 원자적(atomic)으로써, 한 번에 읽고 쓰는 것이 보장된다.하지만 데이터에 따라 앞부분, 뒷부분으로 나뉠 경우 쪼개어진 읽기(torn read)가 발생할 수 있다. Int64 예로 앞부분, 뒷부분 Int값이 쓰여지는 경우

l  Volatile 동기화 요소
단순 데이터 타입의 변수에 대하여 지정된 시간에 원자적으로 변수의 값을 읽고 쓸 수 있도록 해준다.

System.Threading.Volatile
C#, JIT, CPU
가 일부 최적화 기법을 적용하지 못하게 한다.
예를 들어 int value = 3 – 3; 이런 식의 코드를 바로 계산을 해버려 for 구문에 적용하는 경우가 최적화 기법이라 하는데 이런 식이면, 다중 스레드 환경에서 다른 곳에서 미리 계산이 최적화 되는 경우가 발생해 원치 않은 값이 나올 수 있다.

Volatile.Write
호출한 위치에서 그 값이 반드시 쓰여질 것임을 보장.
순서상 코드를 호출한 위치보다 앞쪽에서 수행된 로드(load)/스토어(store) 과정은 반드시 이 코드보다 앞서 수행 보장.

Volatile.Read
호출한 위치에서 그 값이 읽혀질 것임을 보장
순서상 코드 이후에 위치한 로드(load)/스토어(store) 과정은 반드시 이 메서드 수행된 이후에 수행될 것을 보장

l  Interlocked 동기화 요소
단순 데이터 타입의 변수에 대하여 지정된 시간에 원자적으로 변수의 값을 읽고 쓸 수 있도록 해준다.
메모리 펜스(memory fence)기능 제공
항상 쓰기 작업은 Interlock 이전에 하고, 읽기 작업은 Interlock 이후에 한다.

반응형

'C# > CLR via' 카테고리의 다른 글

단순 스레드 동기화  (1) 2020.03.25
I/O 중심의 비동기작업  (1) 2020.03.25
LINQ  (0) 2020.03.25
스레드(Thread)  (0) 2020.03.25
직렬화 serialization  (0) 2020.03.25
Posted by Lotus1031
,