DCL과 C#

Tags:

1. Exploring the Singleton Design Pattern
2. volatile and MemoryBarrier()…

trax씨 홈에서 이 주소를 알게됐는데..
이걸 보고 충격좀 받았습니다.

저야 지금은 outdated한 내용으로 기고를 했었지만 (이제와서 하는 말인데
프세 기고 진짜 짭짤합니다. ^^ 뭐 지금은 잡지사가 망했다죠? -_-;;;
어쨌든 저로서도 2주 넘게 시간 투자했던지라 공짜로 돈 받은건 아닙니다만,
앞으로는 마소 기고한 사람들과 친했다가 건수 생기면 기고해야겠다고 생각중..)
하면서 생각한건, 역시나 뭔가를 제대로 파려면 C나 C++아니면 안된다는
것입니다. 더 심각하게는 어셈블리까지.

뭐 시스템이나 네트웍 프로그래밍에서 그렇다는 것입니다만, 싱글톤 패턴의
DCL 문제의 경우에는 여러 영역에서 골고루 사용되고 있는 것이므로 딱히
이것이 운영체제의 문제이다라고 한정지을 수는 없겠죠.

여하튼 저 글의 흥미로운 시사점은

1. 닷넷은 volatile 도 잘된다.
2. 심지어 System.Threading.Thread.MemoryBarrier(); 와 같은 메소드마저 있다.

라는 것입니다.

Memory barrier이라는 것은 CPU와 메인메모리간의 데이터 전송시의 데이터 읽기/쓰기 명령의 reordering을 막는 장벽을 의미합니다.

예를들어

RRWWRRWW

와 같은 R(읽기), W(쓰기) 명령은 속도를 높이기 위해 MMU에 의해

RRRRWWWW

와 같이 재배치가 가능합니다.

그러나 메모리 장벽은 이러한 재배치에서의 한계를 지정하는 것으로

RWRBRRW

와 같이 B(장벽)가 있을 경우
RRWBRRW 와 같이 장벽 내에서만 재배치를 수행하는 개념입니다.

대체 이것과 싱글톤 디자인패턴의 관계가 무엇인가를 기술하는 것은 너무나
긴 이야기이므로 The “Double-Checked Locking is Broken” Declaration 를 보시기 바랍니다.
여담인데 더블 체크 락킹 깨졌다 선언문이 올라가있는곳은 umd란 학교의 pugh 라는
사람의 홈이고, pugh 는 그 이름도 유명한 skip list 의 창시자입니다. (존경!)

당연한 얘기이지만, 자바에서는 그런 메모리 장벽을 넣는 API같은건 없습니다. 가상 머신이잖아요. 메모리 장벽이 필요한 이유는 2개 이상의 프로세서가 존재할때의 메모리 재배치 문제로 인해 DCL이 깨어지기 때문인데, 이러한 메모리 재배치가 모든 종류의 아키텍처에서 일어나지는 않기 때문입니다. (단적인 예로 x86은 재배치 같은거 안합니다.)

여하튼 자바의 메모리 모델은 많은 변화를 거쳐, JDK 1.5에서는 크게 바뀔 것이라고
알고 있습니다. 지금으로서는 바빠서 다 일일히 확인은 못하지만.. 뭐 정식 나오면
보죠. Doug Lea덕에 괜찮은 java.util.threading 패키지도 생겨났으니
살림살이 더 나아지겠죠.. -_-;;;

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *