병렬프로그램을 공부하면서 계속된 의문점... Parallel & Cloud

병렬 프로그래밍이란 것을 2007년도인가부터 문서로 읽어보고, 시스템에 적용하게 된다면, 상당한 성능향상이 있을 수 있겠다는 생각만 가졌었습니다.

그 후 Reactive Extensions,  .NET 4.0 의 Task Parallel Library 를 공부하면서, 오... 상당히 편하게 되어있네...
Microsoft 에서 왠일이야? 상당한 완성도를 가진 라이브러리 들인데 라고 감탄했습니다. (기대가 낮아서 그랬는지도 모릅니다)

그 후 8086부터 알고 있던 CPU에 대해 "프로그래머가 모르는 멀티코어 이야기" 를 읽으면, 와 멀티코어 되면서 상당한 변화가 있구나 라고 느꼈습니다. 이 책은 CPU를 H/W 관점에서 보는 게 아니라 CPU 운용 즉 프로그램에 대한 내용이 상당히 이해하기 쉽게 설명해주고 있습니다.

병렬 프로그래밍을 공부하면서, 우선 Data 처리에 대한 병렬 프로그래밍에 대해서 제가 관련된 적용 가능한 분야를 찾아봤습니다.

1. 수학 연산
2. 시뮬레이션
3. 대용량 Data 처리 ( No SQL 의 Map-Reduce 등)

이런 내용을 보다보니, Grid Computing처럼 한 머신의 코어만 사용할게 아니라, 멀티 머신의 멀티 코어를 엮어서 사용한다면 좋겠다는 생각이 들었습니다. 요즘 Cloud Computing이 서비스 보다는 웹하드처럼 시장에서 인식되지만,  제 생각에는 작업 분할과 병렬 처리가 Cloud Computing의 중요한 요소가 될 것으로 예상합니다.

다음으로 저희 회사에서 전문으로 하는 BPM (Business Process Management)에 적용할 수 있겠다 싶더군요.

Business Process의 개선 사항 중에 중요한 한가지가 직렬 작업을 병렬 작업으로 변경해서, 투입 리소스는 더 들어간다 하더라도, 프로세스의 사이클 타임을 줄이는 것입니다.

이 부분의 구현이 상당히 복잡합니다. 당연히 멀티스레드 프로그램으로 만들어져 있고, 개발도 힘들었지만, 기능 개선 등도 고급 인력만이 가능합니다.

근데, TPL이나 Reactive Extensions 라이브러리를 채택하여 변경을 해 보니, 상당히 간결하고, 직관적이고, 구조적인 형태로 변화되었습니다.
그동안 Microsoft의 모든 멀티스레드 관련 API의 불편함과 복잡함에 대한 불만이 한꺼번에 날라갔습니다.

근데... 그럼 이렇게 특수한 분야 외에 병렬 프로그래밍을 잘 활용할 분야가 없을까 생각해 봤습니다.

1. 병렬 프로그래밍이라면 Data 처리에만 국한되지 않나하는 의문점
2. 부하가 많은 머신에서 병렬 프로그래밍이 효과가 있을까 하는 의문점

여러가지 자료를 보고, 결론 내린 것은 ".NET 에서의 병렬 프로그래밍"이 단순히 멀티스레드만으로 데이타 처리에 사용하는 것이 아니라, 비동기 프로그래밍 모델도 지원한다는 점이, Task Parallel Library의 숨어있는 실제 보석이라는 결론을 얻었습니다.

이 부분에 대해서는 CLR via C# 2nd, 3nd 뒷 부분을 보시면, 왜 멀티스레드, 비동기 프로그래밍이 성능 향상 및 확장성을 보장해주는지 잘 설명되어져 있구요. TPL은 이런 장점을 아주 쉽게 구현할 수 있도록 해준다는 점입니다.

 Future-Of-CSharp-FT09-Hejlsberg.pptx 이 자료는 C# 설계자 (예전에는 Delphi 설계자) 의 C# 5.0 에 대한 내용입니다만, TPL로도 모두 가능한 부분입니다. 초보자도 아주 쉽게 이해할 수 있도록 해준 자료라고 생각합니다.

실제 예를 들어본다면, 일반적은 Database 정보 조회 (RDBMS는 SQL Server 2005 Dev) 를 

  1. 동기 방식 / 동시 사용자 50 / Command Execution Timeout 걸림 / 전체 수행 시간 : 30 분
  2. 비동기 방식 / 동시 사용자 200 / Timeout 없음 / 전체 수행 시간 : 5분
이었습니다.
이 예는 제가 만든 라이브러리에서 TPL을 적용하고, 기존 방식과 비교해서 테스트 한 것입니다. SQL Server가 후졌다 라고 결론 내릴 수 도 있지만 (ㅎㅎ)  그 보다는 비동기 프로그래밍이 상당한 장점을 가지고 있고, 특히 IO-Bounded 경우에는 드라마틱할 정도라고 말할 수 있습니다.


또 하나 요즘 개발자들은 거의 웹 개발자들이죠?

몇번 글을 쓴 것 같은데, 앞으로 다시 Thick Client 가 다시 유행할 겁니다. 즉 Client Application 에서는 필수적으로 멀티스레드 프로그래밍, 비동기 프로그래밍을 해야 할 경우가 99% 라고 생각합니다. 

WPF, Silverlight 같은 경우는 아예 비동기로 동작하게끔 되어 있습니다. 어쩔 수 없이 Client Application을 만들어야 한다면, .NET WinForm이 되었건, WPF 가 되었건, Delphi 가 되었건 앞으로는 멀티스레딩과 비동기 프로그래밍은 필수입니다.

.NET으로 개발한다면, TPL을 사용하게 되면 상당히 쉽고 명확하게 구현이 가능해질 것입니다. 

왠만해선 제가 Microsoft 사 제품을 칭찬 하지 않는데 (Microsoft 제품으로 밥 벌어 먹으면서도 그러내요^^) TPL과 앞으로 나올 Async 는 기존의 LINQ와 더불어 획기적인 라이브러리라고 칭찬해주고 싶습니다.



덧글

  • BluePrajna 2011/06/15 01:55 # 삭제

    맥에서 개발할때 작년부터 적용되고 있는 GCD와 비슷한거 같네요. 확실히 앞으로 비동기식 병렬프로그래밍이 대세가 될듯 합니다.
  • debop 2011/06/20 10:53 #

    네 저도 동감입니다. 맥 정보를 찾아보니 같은 개념입니다. 멀티코어를 더 효과적으로 사용하기 위해서 병렬 프로그래밍을 하고, 시스템 전체의 확장성 및 UI 반응성을 위해서라도 비동기 프로그래밍을 해야겠죠^^

    저도 맥 써보고 싶습니다...
※ 로그인 사용자만 덧글을 남길 수 있습니다.