멀티코어와 동기화

조건 변수(condition variable)로 「큐가 비어 있지 않게 될 때까지 기다린다」고 할 때, 대기에서 깨어난 뒤 조건을 if문이 아니라 while문으로 다시 확인하는 이유로 올바른 것은?

  1. Awhile문이 if문보다 실행이 빠르기 때문
  2. Bif문에서는 조건 변수를 사용할 수 없는 규칙이기 때문
  3. C깨워졌더라도 다른 스레드가 먼저 가져가 버렸거나, 이유 없이 깨어났을 수 있어 조건이 만족되지 않았을 가능성이 있기 때문
정답과 해설 보기

정답: C. 깨워졌더라도 다른 스레드가 먼저 가져가 버렸거나, 이유 없이 깨어났을 수 있어 조건이 만족되지 않았을 가능성이 있기 때문

조건 변수의 대기는 락을 놓고 잠든 뒤, 신호를 받아 깨어나면 락을 다시 잡고 돌아옵니다. 그러나 깨어나기까지의 사이에 다른 스레드가 먼저 락을 잡고 큐의 요소를 가져가 버리는 일이 있습니다. 또한 구현상의 사정으로 신호가 없어도 깨어나는 것(spurious wakeup, 가짜 기상)이 허용되어 있습니다. 그래서 깨어난 뒤 조건을 확인하고, 만족되지 않았으면 다시 기다리는 while문으로 작성합니다.

  • A. 속도의 문제가 아닙니다.
  • B. 그런 규칙은 없습니다.
  • C. 맞습니다. 깨어난 뒤에 조건을 다시 확인해야 합니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 두 코어가 각자의 캐시에 변수 x의 복사본을 가지고 있다. 코어 0이 x에 쓴 뒤 코어 1이 x를 읽을 때, 캐시 일관성(cache coherency) 메커니즘이 없다면 일어날 수 있는 문제는 무엇인가?
  2. 캐시 일관성 프로토콜인 MESI의 네 가지 상태 조합으로 올바른 것은?
  3. MESI 프로토콜에서 캐시 라인이 Modified(M) 상태일 때의 의미로 올바른 것은?
  4. MESI 프로토콜에서 Exclusive(E) 상태의 라인에 해당 코어가 쓸 때의 동작으로 올바른 것은?
  5. 무효화형 일관성 프로토콜에서, 어떤 코어가 Shared(S) 상태의 라인에 쓸 때 이루어지는 동작은 무엇인가?

이 분야의 비교