멀티코어와 동기화

아토믹 명령 CAS(compare-and-swap)의 동작으로 올바른 것은?

  1. A메모리의 값이 기대한 값과 같을 때만 새 값을 쓰고, 성공했는지 알 수 있다
  2. B두 메모리의 값을 비교하여 큰 쪽을 양쪽에 쓴다
  3. C메모리의 값과 레지스터의 값을 조건 없이 교환한다
정답과 해설 보기

정답: A. 메모리의 값이 기대한 값과 같을 때만 새 값을 쓰고, 성공했는지 알 수 있다

CAS는 「이 주소의 값이 아직 기대값 그대로라면 새 값으로 바꾼다」를 불가분으로 수행합니다. 읽고 나서 쓰기까지의 사이에 다른 스레드가 값을 바꾸었다면 실패하므로, 바뀌지 않았음을 확인하면서 갱신할 수 있습니다. 실패하면 다시 읽어서 계산하고 CAS를 재시도하는 루프로 만들면, 락 없이 공유 값을 안전하게 갱신할 수 있습니다. x86의 cmpxchg 명령 등이 여기에 해당합니다.

  • A. 맞습니다. 비교하여 같으면 교체합니다.
  • B. 큰 쪽을 쓰는 명령이 아닙니다.
  • C. 조건 없는 교환은 스왑(swap) 명령입니다.
이 분야 연습하기 분야로 돌아가기

멀티코어와 동기화의 다른 문제

  1. 위 코드는 CAS(&p, 기대값, 새 값)를 사용하여 공유 변수 counter를 2배로 만들고 있다. CAS가 실패하여 루프를 다시 도는 경우는 언제인가?
  2. RISC-V의 LR/SC(load-reserved/store-conditional)와 같은 명령 쌍에서, SC(조건부 스토어)가 실패하는 경우는 언제인가?
  3. CAS를 사용한 락프리 자료구조에서 문제가 되는 ABA 문제에 대한 설명으로 올바른 것은?
  4. RISC-V의 amoadd.w 명령이나 x86의 lock xadd 명령과 같은 fetch-and-add 명령의 동작으로 올바른 것은?
  5. 스핀락(spinlock)에 대한 설명으로 올바른 것은?

이 분야의 비교