아래 내용은 작년 9월달에 작성했던 글인데 앞으로 시작하는 테마에 그리 큰 변경이 없어 그래로 옮깁니다. .net 4가 정식이 나온 현 시점에서 어떤 분은 C에서 C++로 옮겨가는 세계보다 큰 세상이 열리는 시작이라고 말하는 세상을 함께 만들어가기를 바라면서 강좌를 시작합니다.

------------------------------------------------------------------------------------------------------------------------

C# 3.0에 포함된 변화는 함수형 프로그램에 특징을 녹여낸 것이 많습니다. 이런 언어의 변화는 병렬 처리(parallel computing)을 위한 변화라고 이야기 합니다. 최근 소개드린 MS의 병렬 처리자료에 보면 MS는 Parallel Computing Platform Team을 통해 지속적인 변화를 꾀하고 있습니다.따라서 이런 변화는 언어와 런타임에 지속적으로 영향을 줄거라 예상됩니다. MS 뿐만 아니라 C++에서도(언어 혁명의 선구자 Bjarne Stroustrup, OpenMP) 비슷한 이유로 고민하고 있음을 살펴볼 수 있습니다.

그럼 현재 시점에서 왜 슈퍼 컴퓨터에서나 이야기 하던 병렬 처리가 .net 환경에까지 영향을 주는지 앞으로 프로그램 개발에 어떤 변화를 주어하 하는지 앞으로 정리해 보도록 하겠습니다.

왜 병렬 처리에 대해 고민해야 하는가?

가장 단순한 답은 단일 머신에 CPU 코어가 N개로 늘어나고 있기 때문입니다. 개인용 머신도 2개가 기본이고 서버 머신은 4,8,16,24개로 늘어나고 있는데 반해 단일 코어에 맞춘 처리방식은 몇개의 CPU만 사용하는 하드웨어의 낭비를 불러오고 있습니다. 갈수록 발전해가는 하드웨어 기술에 반해 소프트웨어 기술은 뒤쳐지는 현상인 것이죠.

image

파란색이 Parallel Programming, 노란색이  Sequential Programming

직렬 프로그래밍(Sequential Programming)과 병렬 프로그래밍(Parallel Programming, 또는 Concurrent programming)의 구현상 차이는 무엇인가?

직렬 프로그래밍은 함수들을 차례로 실행하는 구조입니다. 각 함수들은 매개변수, 반환 값, 멤버 변수 같은 공유 데이터로 구성되어 있습니다. OOP와 가깝죠? 반면에, 병렬 프로그래밍은 task들이 준비 상태에 있을 때마다 실행하는 구조입니다. task는 서로 미리 정의된 channel을 통해 message를 주고 받으며 통신합니다. 따라서, task들은 서로 영향을 주지 않는 독립적인 구조를 가져야 하고 한 task를 여러 번 실행해도 늘 똑같아야 합니다. 웬지 SOA의 냄세가 나죠? 덧붙여 SOA에서는 상태는 message에 넣고 서비스는 상태를 가지지 않으니 설계에 고려해 볼 수도 있겠죠. 보통 framework들은 task를 알아서 실행하도록 내버려 두지 않고 관리자를 통해 관리합니다.

멀티 스레드 프로그래밍과 다른가?

한 CPU는 한 번에 한 스레드만 처리할 수 있습니다. 멀티스레드 프로그래밍은 시간차가 있는 일들을 CPU의 처리시간을 쪼개 동시에 처리하려는 것이 목적인 반면에 병렬 처리(parallel computing)는 한 CPU로 벅찬 일을 여러 코어에서 나눠 처리하려는 것이 목적이라고 말할수 있습니다. 시작의 목적 다르지만 동시성 처리에 대한 고민으로 immutable 형식 필요, Pure function사용 등 같은 주제를 가지고 있고 현재는 .net Threadpool 처럼 스레드 프로그래밍으로 내부적으로 멀티 코어를 지원하는 경우도 있어 프로그래밍은 방식은 비슷하다고 봅니다.

그럼 .NET에서 ThreadPool과 Parallel extension은 뭐가 다른가?

ThreadPool은 한 번 사용한 thread를 재사용하는데 목적이 있습니다. CPU마다(ThreadPool은 CPU에 1:1) 100개의 스레드가 있을 때 100건의 task가 들어오면 1 CPU만 열심히 일할 수 있습니다(실제로는 아니지만 극단적인 표현입니다 ^^). 하지만 Parallel extension 같은 병렬 처리 framework는 각 CPU마다 골고루 분산해 일을 시킨다는 점이 가장 큰 차이입니다. 이것 말고도 차이점은 추후 주제 중에..

도입 배경을 공부하면서 가장 큰 부분만 정리해 보았습니다.

차후 테마는 Thread, Threadpool, immutable 형식 구현 방법, C#에서 함수형 코딩, .Net parallel extension을 정리해 보도록 하겠습니다.

제가 일 끝마치고 짬짬히 하는 지라 내용이 부실하면 바로 지적해 주시면 감사하겠습니다.

-부운영자-
blog : http://tecalog.com