더북(TheBook)

병행 프로그래밍(concurrent programming)은 코드를 병렬로 동작하게 하여 멀티 코어의 이점을 충분히 활용할 수 있게 해준다. 하지만 대부분의 메인스트림 언어(C, C++, 자바 등)로는 병행 프로그램을 작성하고 테스트하기가 매우 어렵다. 스레드 간에 메모리를 공유하여 동기화하는 코드는 구현하기가 어렵고, 코드를 안전하게 잘 작성했다 하더라도 스레드 자체의 부하 때문에 기대한 만큼의 성능이 나오지 않는다.

대안으로는 단일 스레드 기반으로 프로그램을 만들고 이를 프로세스 여러 개로 동작시키는 멀티 프로세싱 방식도 있다. 실제로 이 방식도 많이 사용한다(주로 Node.js 애플리케이션에서 많이 사용한다). 하지만 프로세스 간의 정보 공유나 동기화 작업을 해야 할 때 또 다른 어려움이 발생한다. 프로세스 간의 통신은 멀티 스레드 환경에서 공유 메모리를 사용하는 것보다 훨씬 더 어렵다.

그런 이유로 최근에 함수형 언어가 주목받고 있다. 함수형 언어에서는 한 번 정해진 값은 바뀌지 않는다. 그래서 병행 처리를 좀 더 안전하게 할 수 있다. 하지만 객체 지향 프로그래밍에 익숙해진 사고를 함수형 언어에 맞게 바꾸는 것 또한 부담된다.

Go 언어를 설계할 때 특별히 중점을 둔 부분이 바로 병행 처리다. Go는 병행 처리 코드를 안전하고 작성하기 쉽게 설계했다. Go의 병행 처리 방식은 통신 순차 프로세스(Communcating Sequential Processes, CSP) 방식에 근간을 둔 것으로, 메모리를 공유하는 것이 아니라 메시지를 전달하는 방식으로 동기화한다.

그림 1-4 언어별 병행 프로그래밍의 난이도

Note 통신 순차 프로세스

1978년 영국의 컴퓨터 과학자인 토니 호아(C. A. R. hoare)가 CACM 논문에서 처음으로 통신 순차 프로세스(Communicating Sequential Processes, CSP)를 소개했다. CSP는 동시성을 지원하는 시스템에서 상호 작용 패턴을 표현하는 언어이다. CSP에서는 동시성을 커뮤니케이션의 입출력으로 본다. 그리고 메모리 공유 방식이 아니라 동기화 방식으로 통신한다. 이후 CSP는 동시성을 지원하는 개발 언어에 지대한 영향을 끼쳤고 지금까지도 많은 연구가 진행되고 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.