IT Life

[Technology Inside] Parallel Programming in Scala

2013. 7. 29. 10:22


'Technology Inside'는 IT업계에 종사하시는 분들에게 최근의 IT트렌드와 각 분야별 IT기술의 특징과 전망을 소개하는 칼럼입니다. 이 컨텐츠를 통해서 IT분야에 대한 식견을 넓히시는 기회가 되시기 바라며, 보다 심도있는 내용을 탐구하고자 하시는 분은 첨부된 PDF 파일을 참고하시기 바랍니다.

 

병렬 프로그래밍은 물리적으로 분리된 여러 시스템을 이용하여 좀 더 이른 시일 안에 업무를 처리하는 방식을 말합니다.

당연히 여러 시스템을 이용하여 처리한다면 속도가 빨라지긴 하겠지만, 시스템 간의 공유되는 자원 간의 점유 문제라던가 동시에 처리되는 작업 간의 순서 문제 등 병렬환경에서 발생 가능한 문제점이 많아서 접근이 매우 어려운 영역이기도 합니다.

최근 인기가 급상승 중인 Scala(스칼라) 언어는 복잡한 병렬 프로그래밍 영역을 쉽게 풀어나갈 수 있는 좋은 해결책 중 하나로 인식되고 있는데요. 이번 글에서는 병렬 프로그래밍과 Scala에 대해 살펴보도록 하겠습니다.

1965년 발표되어 근래까지 반도체 성능향상에 대해 정확히 예견하고 있는 무어의 법칙이란 공식이 있습니다. 약 2년당 반도체의 성능이 2배씩 늘어난다는 법칙인데요. 하지만 현재는 무어의 법칙도 한계에 도달하였다는 의견이 많습니다. 실제로 2010년 이후 물리적으로 직접 회로에 배치할 수 있는 기술이 한계에 도달함으로써 반도체 성능향상에 어느 정도 정체를 보이기 시작하고 있습니다.


<그림1> 반도체의 속도향상을 정확하게 예측하고 있는 무어의 법칙

물론, 좀 더 혁신적인 공법이 개발되어 반도체의 성능이 획기적인 발전을 일으킬 가능성이 전혀 없는 것은 아닙니다. 하지만 좀 더 빠른 결과를 얻기 위해 더 좋은 시스템으로 옮기기만 해도 되던 과거와 달리 앞으로는 소프트웨어적으로도 혁신적인 노력이 더욱더 필요할 것이라는 예상이 가능할 것 같습니다.

그렇다면 어떠한 방식이 소프트웨어의 성능을 향상시킬 수 있을까요? 많은 전문가가 동시에 여러 시스템을 이용하여 처리속력을 높일 수 있는 병렬 프로그래밍을 성능 향상에 좋은 해결책으로 추천하고 있습니다.

그럼 여러 시스템을 이용하여 병렬 처리를 한다면 얼마나 성능이 향상될까요? 병렬 프로그래밍에서는 전체 프로그램에서 어느 수준까지 병렬화할 때 성능 향상이 가능할 것인지 예측할 수 있는 암달의 법칙이라는 공식이 있습니다. 암달의 법칙에 의하면, 사용하는 시스템의 수보다는 프로그램 중 병렬로 처리 가능한 부분의 비율이 성능향상에 더 많은 영향이 나타난다고 합니다. 즉, 전체 프로그램에서 여러 대로 나누어 작업을 처리할 수 있는 부분이 많으면 많을수록 성능향상의 폭이 급격히 증가한다는 거지요.


<그림2> 병렬수준에 따른 성능향상 수치를 보여주는 암달의 법칙

따라서 전체 프로그램을 근본적으로 개선하여 병렬로 처리한 영역의 비중이 높아야 성능향상 효과가 높다는 것을 알 수 있습니다.

하지만 병렬 프로그래밍은 분리된 시스템 간 상태나 자원의 공유에 대한 처리라던가, 업무 처리에 대한 배치문제 등 여러 가지 경쟁상태가 발생하기 쉬운 환경이며, 해결 또한 간단하지 않습니다.

만약, 좀 더 접근하기 쉬운 병렬 프로그래밍 기법이 있다면, 병렬로 처리할 수 있는 프로그래밍 영역을 늘려서 좀 더 나은 성능 향상을 얻을 수 있지 않을까요?

먼저 Scala 언어에 대해 설명하겠습니다.


<그림3> Scala 언어

Scala 언어는 Martin Odersky가 2003년도에 개발한 언어입니다. 대표적인 개발언어인 Java(자바)와 같은 플랫폼인 Java 가상머신 위에서 구동되기 때문에 개발된 시기에 비해 상당히 안정적인 품질을 자랑합니다.
Scala언어는 여러 가지 측면에서 장점을 보이고 있지만, 병렬 프로그래밍에서 두 가지 장점을 가지고 있습니다.

1) 함수형 언어
우리가 익숙하게 사용하고 있는 개발 언어의 대다수는 명령형 언어를 지원합니다. 명령형 언어는 절차에 따라 단계적으로 기술하기 때문에 내부에 ‘상태’ (이전 명령처리의 결과값으로 후속 명령처리에 필요함)가 존재하게 됩니다. 따라서 이를 병렬 프로그래밍에 적용할 경우, 각각의 상태를 서로 사용하고자 하는 작업 간의 ‘경쟁상태’를 유발할 수 있어 적용이 어려웠습니다.
하지만 Scala가 사용하는 함수형 언어는 기본적으로 상태의 존재를 지양하며, 함수 자체의 응용을 강조하기 때문에 병렬 프로그래밍을 진행하면서 상태 전이나 경쟁 상태를 유발하지 않는다고 볼 수 있습니다.

2) 병렬 프로그래밍의 검증된 모델인 Actor 채택
Scala에서 병렬 프로그래밍 처리를 위해 사용하고 있는 Actor(액터)는 대용량 처리에서 훌륭한 성능을 보여주었던 Erlang(얼랭) 언어에서 적용되었던 방식입니다. Erlang은 1973년에 Carl Hewiit에 의해 고안되어 현재까지도 꾸준히 사용되는 언어이지요.
Scala는 Eralng의 Actor 모델을 차용하여 성능과 안정성이라는 두 마리 토끼를 보장하고 있습니다.
Scala의 Actor는 기본적으로 시스템 간 메시지를 주고받는 메시지-패싱-모델을 사용하고 있습니다.
서로 다른 시스템에 있는 Actor에게 특정 작업에 대한 지시를 메시지로 만들어서 보내면, 수신받은 Actor는 자신의 메시지박스에서 메시지를 열어서 처리합니다.
송신하는 Actor는 메시지를 보내고 바로 다른 작업을 처리하기 때문에 병목이 발생하지 않으며, 수신받은 Actor는 메시지를 일괄 처리도 가능하므로 대량의 작업처리에 유리하다는 장점을 가지고 있습니다.


<그림4> Scala의 병렬 처리 메커니즘인 메시지-패싱-모델(Message-Passing-Model)

Scala는 위에서 설명해 드렸던 장점을 통해 병렬 프로그래밍에 쉽게 접근할 수 있도록 합니다. 그렇다면 Scala는 과연 앞으로 얼마나 많이 사용하게 될까요?

세계적인 SNS 기업인 Twitter는 Scala를 메인 시스템의 메시지큐*에 적용하여, 기존의 시스템보다 많은 사용자의 메시지를 동시에 처리할 수 있게 되었다고 합니다. 그뿐만 아니라 영국 Guardian지와 같은 기업이라던가 LinkedIn, FourSquare와 같은 스타트-업 에서도 점점 적용이 확대되고 있습니다.

* 메시지큐(Message Queue): 요청한 처리정보를 메시지 형태로 차례대로 저장하는 곳

또한, 병렬 프로그래밍 인력시장에서도 유사 기술 중 성장세가 확연히 두드러지고 있습니다.


<그림5> 미국 취업사이트(indeed.com)의 구직 트렌드

비교적 저렴한 서버를 응용한 병렬 컴퓨팅에 대한 시장의 요구는 나날이 늘어날 것으로 예상되며, Scala는 이를 해결하기 위한 좋은 해결책으로서 앞으로 시장에서도 두각을 나타낼 것으로 전망됩니다.

 

 

l 글 이종철 부책임연구원(chollee@lgcns.com) l LG CNS 프레임워크그룹

09 Parallel Programming_이종철.pdf

Posted by IT로 만드는 새로운 미래를 열어갑니다 LG CNS

댓글을 달아 주세요

위로