멀티코어와 동기화
RISC-V의 amoadd.w 명령이나 x86의 lock xadd 명령과 같은 fetch-and-add 명령의 동작으로 올바른 것은?
- A메모리의 값을 읽기만 하고, 덧셈은 레지스터 안에서 수행한다
- B두 메모리 주소의 값을 더하여 세 번째 주소에 쓴다
- C메모리의 값에 지정한 수를 불가분으로 더하고, 더하기 전의 값을 반환한다
정답과 해설 보기
정답: C. 메모리의 값에 지정한 수를 불가분으로 더하고, 더하기 전의 값을 반환한다
fetch-and-add는 읽기·덧셈·쓰기를 하나의 불가분한 동작으로 수행하므로, counter++의 데이터 레이스를 명령 하나로 해결할 수 있습니다. 더하기 전의 값이 반환되므로, 번호표를 차례로 나눠 주는 처리(각 스레드에 겹치지 않는 번호를 할당하는 등)에도 사용할 수 있습니다. CAS 루프와 달리 실패와 재시도가 없으므로, 많은 스레드가 동시에 갱신하는 경우에 유리합니다.
- A. 덧셈도 메모리 쓰기도 불가분으로 수행합니다.
- B. 메모리끼리의 연산이 아닙니다.
- C. 맞습니다. 공유 카운터에 적합합니다.