Art of multiprocessor programming 읽어보신분 계시나요?

gurugio의 이미지

지금 3장을 읽고 있습니다만 quiescent 라는 단어의 정확한 의미를 모르겠습니다.
그 뿐 아니라 이 책에서 말하는 correctness가 무엇의 correctness인지도 모르겠고,
여러가지로 용어의 의미를 잘 모르겠습니다.

새로운 개념을 설명하는게 아니라, 저자가 주장하는 이론을 증명하는게 목적인 책이 아닌가 하는 생각이 듭니다.
이 책을 논문 모음이라고 소개하는 글도 본 기억이 있는데,
2-3장은 어떤 논문에서 일부분을 가져와서 실어놓은 것 같습니다.
설명도 명료하게 한 두 문장만 쓰면 될 사항을 에둘러서 말하는 느낌을 많이 받습니다.

아무래도 제 영어실력이 안되니 번역서를 봐야할까요?
아니면 다른 참고할만한 자료가 있을지요?
저자의 홈페이지에서 ppt로된 강의자료를 보고는 있습니다만 점점 자신이 없어지네요.

prio의 이미지

번역서에는 어떻게 번역했는지 모르겠으나
저는 quiescence를 "휴지(休止)"로 해석하고 읽었습니다.
한자어라서 번역어로는 적당하진 않겠네요.

어떤 object에 아무 요청이 없거나, 혹은 모든 요청을 처리한 후라서
아무 일도 하지 않고 있는 것을 quiescent하다고 하고,
quiescent한 interval ("휴지기"?) 을 경계로
그 앞의 요청과 그 뒤의 요청 간에 확실한 order를 보장하는 consistency를
quiescent consistency 라고 부르고 있습니다.

만약 다음처럼 메소드 요청이 들어온 경우,

A, B, "quiescent", C, D

A, B 간의 순서 혹은 C, D 간의 순서는 알 수 없지만
C는 A, B의 결과가 반영된 object에 대해 실행이 되고,
D 역시 A, B의 결과가 반영된 object에 대해 실행이 되는 것을
보장하는 consistency라고 이해하시면 될 것 같습니다.

the art of multiprocessor programming은 기본기를 다루는 책이라서
일부러 매번 용어 정의를 해가며 나름 수학적인 접근을 하고 있습니다.
개념을 한 번에 제시하기 보다
한 가지에서 출발해서 점점 확장시켜 가는 방식을 취하기도 하구요.
consistency 설명이 딱 그 방식이죠.

다만 저자들이 지어낸 용어가 많은 것이 단점인데,
(워낙 이론하는 사람들이 그런 걸 좋아하죠;; )
그래도 읽다보면 별 무리 없이 수긍이 가는 터라 그냥 참고 보는 중이네요.

gurugio의 이미지

말씀하신 예에서 C와 D가 중첩되서 실행되어도, C의 실행이 D에 영향이 없는 것인가요?
휴지기간의 앞 뒤로는 메소드들이 서로간에 영향이 없이 실행되는게 consistency인지 궁금합니다.

자꾸 떠먹여 달라는것 같아서 죄송합니다만 sequential consistency에 대해서도 설명을 부탁드립니다.

A.enq(x) -> B.enq(y) 이렇게 x가 먼저 큐에 들어가고, y가 다음에 들어갔는데도, y가 먼저 큐에서 꺼내지는게
sequential consistency라는 말이 있던데, 큐가 제대로 동작하지 않는것 같은데 왜 consistency가 있는건지 모르겠습니다.

----
섬기며 사랑하면 더 행복해집니다.
나불나불 블로그 - http://gurugio.blogspot.com/
몸에 좋은 칼슘이 듬뿍담긴 OS 프로젝트 - 칼슘OS http://code.google.com/p/caoskernel/

prio의 이미지

병렬처리에서 consistency는 일반적으로 "일관성"으로 번역합니다.
메모리/객체 등이 일관성을 가지고 정해진 방식으로 동작한다(해야한다)는 것을 정의하는 것입니다.
그래서 consistency model이라고 부르기도 하고,
consistency를 프로그래머와 메모리/객체 사이의 일종의 "계약"이라고 설명하기도 합니다.

메모리/객체가 일관성을 가지고 동작을 하는 바탕 위에서,
synchronization을 통해 프로그래머가 원하는 동작을 구현하게 됩니다.
같은 동작을 구현하더라도 consistency 모델에 따라
synchronization을 언제 어떻게 하는가가 달라지게 되구요.

서론이 길었는데,
quiescent consistency에서는 C와 D의 순서를 정의하고 있지 않습니다.
C와 D의 중첩이 어떤 순서로 되든 상관하지 않겠다는 것이고,
거꾸로 만약 C와 D의 순서가 원하는 동작을 구현하는데 중요한 영향을 끼친다면
프로그래머가 중간에 quiescent interval을 의도적으로 집어 넣어
원하는 순서를 정해줘야 하구요.

sequential consistency의 경우는, 다음의 두 가지 성질을 만족해야 하는데,
1) 각 스레드 별로 명령들의 실행 순서는 프로그램 순서(program order)대로 수행된다는 것과,
2) 전체 명령의 실행 순서는 여러 스레드의 명령들이 섞여 있되, 1)을 만족하는 임의의 순서대로 실행된다는 것입니다.

만약 스레드 A, B 두 개가 있어서, 각 스레드의 명령은 프로그램 상에

A1 -> A2 -> A3
B1 -> B2 -> B3

로 나타나 있으면, 1)과 2)를 만족하는 순서는 다음과 같이 여러 개가 있을 수 있고
모두 sequential consistency를 만족합니다.

i) A1 -> A2 -> B1 -> B2 -> B3 -> A3
ii) B1 -> A1 -> B2 -> A2 -> B3 -> A3
iii) A1 -> A2 -> A3 -> B1 -> B2 -> B3

만약 프로그래머의 의도 상, A2가 B3보다 항상 먼저 실행되어야 한다면,
중간에 synchronization을 두어 B3를 실행하기 전에 A2가 완료되기를 기다려야 합니다.
그러면 프로그램을

A1 -> A2 -> (notify) -> A3
B1 -> B2 -> (wait) -> B3

이런 식으로 작성해주어야 하겠지요.
위 처럼 작성하면 된다고 생각할 수 있는 근거는,
sequential consistency가 각 스레드 안에서의 명령은 program order를 만족한다는 것을 보장하기 때문에
(notify)는 A2보다 뒤에, (wait)는 B3 보다 앞에서 실행될 것이기 때문입니다.

"큐가 제대로 동작하기 않는 것"은 프로그래머의 의도와 다르다는 뜻이고,
이는 queue object가 sequential consistency를 만족하는 가와는 별개의 문제입니다.

gurugio의 이미지

아.. 그래서 현대 프로세서들이 sequential consistency를 지원하지 않는다는게 그말이었나봅니다.

자꾸 번거롭게 해드리는것 같아서 죄송하지만
Art of multiprocessor programming 책과 같이 읽을만한 자료가 있으면 소개를 부탁드립니다.
언제까지 질문만 할수도 없으니 좀더 기초적인 자료가 있으면 같이 봤으면 좋겠습니다.

큰 도움이 되었습니다. 감사합니다.

----
섬기며 사랑하면 더 행복해집니다.
나불나불 블로그 - http://gurugio.blogspot.com/
몸에 좋은 칼슘이 듬뿍담긴 OS 프로젝트 - 칼슘OS http://code.google.com/p/caoskernel/