-
원자적 조작과 락-프리 코드(Atomic operation & Lock-Free code)프로그래밍/기록, 개념, 용어 2015. 2. 5. 01:51반응형
원자적 조작과 락-프리 코드(Atomic operation & Lock-Free code)
동기화 장치를 사용하면 높은 오버헤드가 따른다.
어떤 경우에는 원자적 조작을 이용하거나, 락 프리 형태로 동등한 작업을 구현하는 것이 오버헤드를 피하는 한 방법이 될 수 있다.
원자적 조작이 수행되는 중간에는 다른 스레드가 끼어들 여지가 없고, 중간 결과를 시스템에서 엿보는 것도 불가능하다.
왜냐? 원자적(Atomic)이므로 쪼개질 수 없기 때문이다.
일반적인 변수인 A를 A+1로 바꾸는 작업은 아주 단순해보이지만 다음과 같은 단계를 거친다.
A를 로딩해 %o1에 저장
%o1의 값을 증가시킴
%o1를 A에 저장
이 3단계의 명령 수행을 진행하는데에는 각 단계마다 다른 스레드에서 간섭할 수도 있고,
변수가 위치한 메모리에 값을 바꿔 데이터 레이스를 발생시킬 수 있다.
반면, 아토믹 증가 작업이 수행되는 중간에 다른 스레드에서 수정하거나 잘못된 값을 메모리에 써넣을 수 없다.
사실, 증가 작업이 아토믹하게 진행된다는 것은 해당 작업의 앞뒤로 뮤텍스 락을 걸어놓는 것과 논리적으론 같게 보이나
뮤텍스 락이 다른 스레드에서도 같은 뮤텍스 변수를 이용해야한다는 제약이 있는 반면
아토믹 조작은 그러한 제약 없이 일반적으로 모든 스레드에 자동으로 적용된다.
아토믹 조작은 락-프리 코드를 만드는데 자주 이용되는데,
CAS(Compare And Swap: 비교후 데이터 교환)는 원자적 조작의 한 예이다.
주어진 비교 값과 메모리에 저장된 값이 같으면 주어진 값을 메모리에 저장된 값과 바꾸는 건데,
특이한 점은 명령이 성공할 수도 있지만 실패할 수도 있다는 것이다.
이 경우엔 반환 값을 보고 재시도를 해야한다.
다중 스레드 환경에서의 변수값 조작 코드를 CAS 명령어를 이용해서 원자적으로 만들 수 있다.
물론, 그렇게 하려면 명령어가 실패할 경우를 대비해 반복 시도 루프를 만들고 루프 안에서 CAS 명령어로 메모리에 저장된 값을 증가된 값으로 바꿔치기 한 후에 명령이 성공했을 때에만 루프가 종료되도록 해야한다.
반응형'프로그래밍 > 기록, 개념, 용어' 카테고리의 다른 글
데이터 레이스(Data Race) (0) 2015.02.05 뮤텍스(Mutex)와 크리티컬 리전/섹션(Critical Region/Section) (0) 2015.02.05 배리어(Barrier) (0) 2015.02.05 리더즈-라이터 락(Readers-Writer Lock) (0) 2015.02.05 세마포어(Semaphore) (0) 2015.02.05