프로그래밍 언어

(번역중) lock-free 프로그래밍 소개

리차드 전 2016. 4. 12. 17:16


lock-free프로그래밍 소개  (원문)


lock-free프로그래밍은 도전이다. 그 작업 자체의 복잡성때문이 아니라 처음부터 주제를 파악하기

힘들기때문이다. 


나는 브루스 도슨의 훌륭하고 이해하기 쉬운 백서를 통해 lock-free프로그래밍을 접했던것을 행운

으로 생각한다.그리고 다른 이들처럼 xbox 360에서 lock-free코드를 개발하고 디버깅하는데 

브루스의 조언에 도움을 받았다. 


그후로, 추상적인 이론부터 실용적인 예제와 하드웨어 세부사항의 방정까지 다루는 많은 문서가 

작성되었다. 끝부분에 이에 대한 리스트를 적어놓았다. 때로는 어떤 내용은 다른 내용과 서로 

방향성이 다르기도 했다. 예를 들어 어떤 문서는 sequential consistency를 가정하고 C/C++

코드에 의해 전형적으로 발생하는 memory ordering이슈에 대해서는 언급을 회피하기도 했다. 

새로운 C++ 11 atomic library standard는 대다수의 사람들이 lock-free알고리즘을 표현하는 

방식에 도전하며, 내용을 비틀어서 작업에 던져버렸다. 


이 포스팅에서는 lock-free프로그래밍을 다시 소개하려고 한다. 그것이 무엇인지 정의로 시작을 

하고, 그후에는 중요한 여러개의 개념에 대한 정보를 간추려서 소개할 것이다. 이런 개념들을 

하나 하나 플로우 차트를 이용해서 설명하고, 조금 깊게 다룰 것이다. 적어도 lock-free 

프로그래밍을 공부하고자하는 사람은 mutex나 세마포어, 이벤트를 이용해서 멀티쓰레드 

어플리케이션을 올바르게 작동하는 방법은 알고 있어야한다. 


정의


사람들은 lock-free프로그래밍을 lock이라고 언급되는 mutex가 없는 프로그래밍이라고 설명

하곤한다.  맞긴하다. 하지만 일부분만 맞다. 학구적 관점에서 일반적으로 받아들여지는 정의는

좀더 광범위하다.  기본적으로 lock-free는 그 코드가 실제로 어떻게 쓰여졌는지에 대해 왈가왈

부하지 않고 설명하는데 쓰여지는 단어이다. 


기본적으로 아래 조건에 해당하는 부분을 작성하고 있는 프로그램에서 가지고 있다면, 그 부분이 

바로 lock-free를 고려해야할 적당한 부분이다. 반대로 해당하지 않는다면 lock-free적용 대상이 

아니다. 






여기서 lock free에서 lock은 mutex를 의미하지 않는다. 데드락이든 라이드락이든-심지어 

당신의 가장 악랄한 적이 심어놓은 가설의 쓰레드가 만든 - 전체 어플리케이션을 멈추버리게 만

들 가능성이 있는 그것이다. 마지막 부분이 웃기겠찌만 그것이 중요하다. 공유된 mutex들은 큰

의미 없이 제외하는데, 쓰레드가 mutex를 획득하자마자, 당신의 가장 악랄한 적은 그 쓰레드를

절대로 스케쥴링하지 않기 떄문이다. 물론 실제 OS는 그렇게 작동하지 않는다. - 용어를 정의하고 

있는 것이다. 


mutex가 없는 예제를 보자. lock-free는 아니다. X의 초기값은 0이다. 독자들의 연습겸, 두개의 

쓰레드가 어떤 쓰레드도 루프를 벗어나지 않는 상태에서 어떻게 스케쥴링될까 고려해보자. 


while( X == 0 )

{

X = 1 - X;

}


아무도 거대한 어플리케이션이 통재로 lock-free가될꺼라고 예상하지 않는다. 특히 우리는 전체 코드

중에서 lock-free가 필요하게 되는 특정한 세트를 알아내게 될 것이다. 예를 들어 lock-free큐에서, 

push, pop, isEmpty등이 lock-free operation의 적용대상이 될 것이다. 


- 중간 문단 생략 - 


lock-free프로그래밍의 한가지 중요한 결과는 만약 한개의 쓰레드를 정지시킨다면