티스토리 뷰

요즘에 관심있는 부분은 Lock 이 없고, Wait 가 없는 자료형태이다.
멀티 스레드 등의 IPC 처리를 하다보면, 꼭 나오는게 Lock 이다. Lock을 처리하는데 소비되는 퍼포먼스 낭비도 꽤 된다. 이를 줄일 방법이 없을까? Context-Switching 을 더디 하면서 Lock 을 사용할 수 있다면 참 좋을 것이다.

대충 논문을 조사해봐도, 이런류의 논문이 9x 년대에 부터 나온 것도 있는 걸 보면, 이미 선진들이 이런 분야로 연구한지 꽤 오래된 것을 알 수 있다.

대다수의 구현은 CAS(Compare-And-Swap) 방식으로 처리 중에는 Context Switching 이 발생하지 않는 CPU에 종속적인 원자적 연산을 사용한 방식이다.

x86 계열에서는 CMPSXXX 니모닉을…
Windows 에서는 InterlockedXXX 와 같은 API를…
Solaris 스팍계열, AIX 에서는 casXXX
(http://unix.co.kr/bbs/board.php?bo_table=02_29&wr_id=45)

자세한 건 Atomic_Op 라는 HP 연구소에서 나온 라이브러리나, ACE 에 atomic_op을 찾아보면 잘 나와 있다.

그런데, 굳이 이런거 몰라도 Unix 벤더의 네이티브 C++ 라이브러리를 쓰면 다 되어 구현되어 있다. Rogue Wave Software 사의 STL 구현에는 이런 원자적인 연산을 사용하여 Lock-Free 형태가 이미 예전부터(!) 구현되어 있다. 이걸 알고 쓰는지는 개발자가 몇명이나 되는지는 모르겠지만…

GNU 컴파일러에서 쓰고 싶다면, 앞서 설명한 atomic_op 가져다 구미에 맞게 고쳐 쓰거나, RogueWave사의 STL라이브러리는 이미 apache 재단에 open source로 편입되었으므로 이걸 가져다가 수정해서 써도 무방하겠다.

그런데, 비단 이런 것 이외에도 이 원자적 연산에 대해서는 C++0x's std::atomic<> 이런식으로 구현될 수 있으니… 최신 컴파일러를 쓰면 뭐 굳이 고민하지 않아도 될 것이다. ㅎㅎㅎ

암튼, 괜찮고, 좋고, 빠르다.
단, 하드웨어에 종속적이다.
마음에 안 든다. 구 버전에서는 관리하기 힘들다.

그래서 옛날에는 Hazard Pointer 라는 것도 나왔는데, 좀 불안하고…
STM(Software Transaction Memory)라는게 가장 마음에 든다.

우리나라에서도 온라인 서버 제작자들 가운데 꽤 관심이 많아 보인다.
http://serverprogramminggem.springnote.com/pages/940824
http://devnote.net/wiki/index.php/Lock-Free_%EA%B8%B0%EC%B4%88

쉽게 써 놓은 것들…
http://www.boyet.com/Articles/LockFreeLimitedPriorityQ.html




Dobb’s 저널에도… 몇가지 소개하고 있다…

http://www.ddj.com/TechSearch/searchResults.jhtml?queryText=Writing+Lock-Free+Code

누군가 구글 비디오에 강의도 올려 놓았나 보다…

찾다보니, 뒤통수를 때리는 것은 자바에서는 이미 지원하고 있다는 것이다.
CAS 를 쓴 것이겠지만, 자바쪽에는 이미 1.51부터 이런 Lock Free 를 JDK 차원에서 지원(http://morenews.blogspot.com/2005/01/lock-free-programming.html)하고 있으니… 굳이 하이 퍼포먼스를 위해서 C++ 을 고집하며 프로그래밍할 필요가 없을 것이다. 제대로 구현 안 할 바에야 자바쪽이 퍼포먼스가 더 잘난다. ^^


여기 보니 좀 잘 설명했다.
http://www.gpgstudy.com/forum/viewtopic.php?t=13559 

찾아보니 친절하게 정리한 사이트도 있다. 망했나? -.-;
멀티프로그래밍 블로그 - Lock-Free

댓글