개발관련 개념정리

병행 컴퓨팅 모델(Concurrent computing model)에 대한 연구

devMarco 2018. 9. 24. 23:37

병행 컴퓨팅 모델(Concurrent computing model)에 대한 연구



1. 연구 배경

서버 네트워크 프레임워크를 검색하던 중 akka 라는 라이브러리를 알게 됐다.

akka는 actor 모델로 설계된, scala/java 로 개발할 수 있는 라이브러리다.

이 라이브러리의 목적은 프로그램의 동시성, 분산을 보장하여 서버의 성능을 높이는 것이다.

예를 들어, 소켓 서버에서 akka를 사용하게 되면 더 많은 유저들의 메세지를 동시에 처리할 수 있고,
분산 서비스를 어렵지 않게 구현할 수 있다.


akka 성능의 핵심은 액터 모델에 있으며, 공식 문서에서도 이 모델을 잘 설명하고 있다.

액터 모델을 위키에서 살펴보니, 병행 컴퓨팅의 한 방법이란 것을 알게 됐다.

이에 따라 병행 컴퓨팅 모델들에 대한 공부가 필요하다고 판단하여, 본 연구를 진행하였다.

2. 병행 컴퓨팅 모델 유형


위키를 참고하니 아래와 같은 유형을 검색할 수 있었다.
  • 액터 모델(Actor model)
  • 페트리 넷(Petri nets)
  • Process calculi -  순차프로세스 통신-Communicating sequential processes (CSP), Ambient calculus, Calculus of communicating systems (CCS),  π-calculus
  • Input/Output automation
  • Preemtive machine scheduling

페트리 넷 : 디지털 시스템의 모델링 방법 중 하나.
플로우 차트와 비슷하게 시스템의 동작을 기호와 화살표로 표현했다.
Process calculi, IO automation, Preemtive ~~ 도 모델링 방법들이다.

임백준 개발자님이 번역한 '7가지 동시성 모델'이라는 책에서는 동시성 모델로

스레드와 락, 
함수형 프로그래밍, 
클로저, 
액터, 
순차 프로세스 통신(CSP), 
데이터 병렬성, 
람다 아키텍처 7가지로 설명하고 있다.
(상당히 탐나는 책이다...)

근래에 많이 언급이 되고 있는 동시성 모델은 '락'이 아닌 '메세지'를 기반으로 자원을 사용하는
액터 모델과 CSP 모델이다.

각 모델을 사용하는 프로그래밍 언어들을 살펴보면 다음과 같다.

액터 모델 : Erlang, Scala, Rust
CSP : Go lang
스레드 :  Java, C#, C++

3. 왜 메시지 기반 동시성 모델이 핫할까?

CPU의 코어가 점점 많아지고, 서버의 scale-up 보다는 scale-out 이 더 중요해지면서

어떻게 하면 수십, 수백 개 이상의 코어가 효율적으로 동작할지,
시스템 자원을 어떻게 배분할 것인지에 대한 고민이 생겼다.

가장 원초적인 방법은 멀티 스레드 프로그래밍이었다.

프로그램의 동작을 여러 스레드로 나누어 코어에 할당함으로써 동작할 수 있게 하는 것이다.

그러나 스레드들이 공유하는 자원에 대한 접근에서 경쟁 조건(race condition)이 생기자
이들을 제어해줄 방법이 필요했다. lock, atomic, semophore 등등등 접근하는 자원을 잠가놓고 줄 세우는 방법들이 많이 생겼다.
그러나 이 방법들은 시스템의 동시성을 높이는데 제한이 있었다. (데드락, 라이브락, starvation 등)
또한 멀티쓰레드 프로그래밍은 개발과 디버깅이 쉽지않다.
(로그를 찍어 디버깅을 하려니까 프로그램 동작이 달라지기도 한다더라.. 마치 슈뢰딩거의 고양이처럼?? )

스레드의 동시 동작을 보완한 모델로 1974년에 액터 모델이 제시됐다. 
스레드 대신 도입된 액터들은 자원을 공유하지 않는다. 대신, 액터들은 서로 '메시지'를 보내어 동작하게 된다. 

어떻게하면 공유 자원을 잘 보호할 수 있을까 고민하지 않고
액터끼리 메시지를 주고받으며 비동기로 동작한다. 

여기서 CSP와 액터의 차이점이 발생하는데, 
CSP는 동기 방식으로써, 수신자가 메시지 수신할 준비가 되어야 발신자가 메시지를 보낼 수 있다.
액터는 수신자 준비를 살피지 않고 발신자가 메시지를 보낸다.

CSP는 '채널' 이라는 선언된 통로를 통해서 메세지를 전달한다. (프로세스 -> 채널 -> 프로세스)
액터는 액터에게 바로 메시지를 전달한다.(액터->액터)

CSP와 액터는 어떤 성능 차이가 생기지?

CSP는 하나의 시스템에서 동시성을 활용하기에 적합하다. 허나 여러 노드로 확장되면 동시성을 보장하기 힘들다.(동기 동작으로 묶임)
액터는 한 시스템 뿐 아니라, 여러 노드로 확장하는 시스템에서도 동시성을 보장할 수 있다.(강력한 비동기 동작)

액터를 활용한 프레임웍은 싱글 노드에서의 성능을 충분히 테스트해봐야 될 것 같다.

아직 이해하지 못한 내용이 많아서 계속 보완해야할 것 같다.


자세한 내용은 위키 참조

참고자료