Concurrent programming을 시작하는 단계

GPG 스터디 포럼에 이런 글 — 멀티코어에서 동기화관련 고민 — 이 올라왔다.(제목이랑 좀 관련이 적긴하다)

질문자의 반응은 약간 뻘타고, 여기서 댓글들을 잘 읽어보자. (특히 multithreaded/concurrent 프로그래밍을 시작한다면) 내가 생각하기에 멀티스레드 프로그래밍을 처음 접하는 사람이 하는 가장 큰 실수는, 스레드가 2개 이상인 코드를 일단 짜는데에 있다. 싱글스레드도 쉽지 않다. 오류는 거의 거기서 나온다. 그리고 이게 멀티스레딩에서는 다른 오류와 섞이기 시작할 것이다. 대부분의 우리는 평범하다. 한 번에 하나의 문제만 해결하는게 한계다. 그런 의미에서 내가 생각하는 프로그래밍 방식은.

싱글스레드에서 잘 도는 프로그램을 만든다

쉽게 가자. 싱글스레드는 멀티스레드 보다 쉽다. 우리의 인생은 동시성에 대해 생각할 기회를 별로 주지 않기 때문에, 이쪽이 쉽다. 추가로 조언을 하자면 제어 경로보다 결과가 어떻게 넘어다니는 지를 조금 더 생각하자.

싱글스레드를 쪼갠다

파이프라인 비슷한 형식이 되도록 쪼갠다. 예를 들어 소케프로그래밍에서 소켓 데이터를 보내고 받는 부분과, 메시지 자체를 처리하고, 다시 전송할 형태로 만들 부분을 쪼갠다.

명시적인 동시성이 필요한 곳을 찾는다

명시적으로 동시성이 필요한 곳, 즉 개념적으로 직렬연산이 아닌 곳에는 잘 알려진 동시성 프로그래밍 모델을 도입한다. 예를 들어서 생산자-소비자(producer-consumer) 모델이라거나, 메시지 큐라거나 ((이것도 생산자 소비자네. 여담이지만 Windows Programming 커뮤니티 쪽 얘기로는, 많은 멀티스레딩 프로그램의 데드락 문제가 PostMessage API를 통해 메시지가 전달되게 함으로써 해결된다고 한다. 몇 안되는 병렬 모델이 존재하는데, 이것들은 대부분 오랜 시간을 거쳐서 정제되었고, 잘 적용되고 테스트 되었으며, 적용 방법도 잘 알려져있다. 바퀴를 다시 만들 필요가 없듯이, 프로그래밍 모델도 있는 걸로 안될 때/성능이 안 나올 때나 새걸 생각하자))

그리고나서 각 단계를 반복한다. 포럼글에서 하는 얘기도 그런 얘기. 싱글 스레드에서는 잘 도는가?, OS책을 다시 읽고 거기 나온 모델들을 보자. 회사에서 내가 작성하는 멀티스레딩 코드도 아주 광의에서보면 스케일러블한 생산자-소비자 모델일 뿐이다. 물론 성능을 위한 각종 변경이 들어가긴하지만.

결국엔 기본기다. 쉬운것부터 차근차근.