멀티코어와 동기화

RISC-V의 amoadd.w 명령이나 x86의 lock xadd 명령과 같은 fetch-and-add 명령의 동작으로 올바른 것은?

  1. A메모리의 값을 읽기만 하고, 덧셈은 레지스터 안에서 수행한다
  2. B두 메모리 주소의 값을 더하여 세 번째 주소에 쓴다
  3. C메모리의 값에 지정한 수를 불가분으로 더하고, 더하기 전의 값을 반환한다
정답과 해설 보기

정답: C. 메모리의 값에 지정한 수를 불가분으로 더하고, 더하기 전의 값을 반환한다

fetch-and-add는 읽기·덧셈·쓰기를 하나의 불가분한 동작으로 수행하므로, counter++의 데이터 레이스를 명령 하나로 해결할 수 있습니다. 더하기 전의 값이 반환되므로, 번호표를 차례로 나눠 주는 처리(각 스레드에 겹치지 않는 번호를 할당하는 등)에도 사용할 수 있습니다. CAS 루프와 달리 실패와 재시도가 없으므로, 많은 스레드가 동시에 갱신하는 경우에 유리합니다.

  • A. 덧셈도 메모리 쓰기도 불가분으로 수행합니다.
  • B. 메모리끼리의 연산이 아닙니다.
  • C. 맞습니다. 공유 카운터에 적합합니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 스핀락(spinlock)에 대한 설명으로 올바른 것은?
  2. 스핀락이 적합하지 않은 상황으로 가장 적절한 것은?
  3. 스핀락에서 락 변수를 곧바로 아토믹 명령으로 갱신하려 하지 않고, 평소에는 일반 읽기로 풀리기를 기다리다가 풀린 것으로 보일 때만 아토믹 명령을 사용하는 방식(test-and-test-and-set)의 이유로 올바른 것은?
  4. 뮤텍스(잠들어서 기다리는 락)와 스핀락을 비교한 설명으로 올바른 것은?
  5. 데드락(deadlock)의 예로 올바른 것은?

이 분야의 비교