어제 얼마전 발표된 Microsoft Parallel Extensions to .NET Framework 3.5 2007 CTP 설치하여 살펴보았습니다. MS Research와 공동 개발하고 있다는 이 Parallel FX 라이브러리는 .NET에서 비교적 쉽게 병렬처리를 가능하게 해주고 있습니다. 자세한 내용은 아래 MSDN 기사에서 링크에서 찾아볼 수 있습니다.
그런데, 이 Parallel FX Library가 어떻게 구현되었을까하는 궁금증을 가지고 있던 차에, .NET 바이너리를 디컴파일하여 소스를 보여주는 .NET Reflector 덕분에 내부를 들여다 볼 수 있었습니다.
간단히 말해 기본 구조는 MIT 대학에서 개발되었던 Cilk 에서 많은 부분을 빌어 왔다는 것을 알 수 있었습니다. Cilk는 1990년대 중반부터 개발되어 온 것이며 Work Stealing이라는 작업 스케줄링 개념을 만들어 내었습니다. .NET PFX도 Work Stealing을 그대로 적용시키고 있습니다.
PFX에서 핵심적으로 사용되는 자료구조 중에 "ConcurrentStack", "ConcurrentDeque (TakeQueue)", "ConcurrentListBag" 가 사용되고 있는데 이들은 대부분의 경우 Lock-free로 동작하도록 되어있습니다. .NET Reflector를 이용하면 소스를 살펴 볼 수 있습니다. 이들도 MS가 새로운 알고리즘을 개발한 것은 아니고, 모두 기존에 발표되었던 논문에 바탕하여 .NET에 적용한 것입니다.
하지만, NET의 Garbage Collector의 도움으로 이러한 Lock-Free 자료구조 제작이 C/C++에 비해 손쉽게 되었습니다. 다시 말해 Lock-Free의 난제들 중의 ABA문제와 메모리 액세스 문제(다른 스레드가 해제한 메모리를 참조하려고할 때 메모리 액세스 오류의 가능성이 있음)가 Garbage Collector로 인해 자동으로 제거되었다는 것입니다.
Java를 이용한 JCilk가 이미 발표된 지금, 늦은 감이 있으나 MS는 PFX 라이브러리로 .NET에서 병렬프로그래밍을 손쉽게 제공하려고 노력하고 있음을 알 수 있습니다. 하지만, 이것이 성공할지는 조금 더 지켜봐야 할 것 같습니다.
- Parallel Performance: Optimize Managed Code for Multi-Core Machines
- Parallel LINQ: Running Queries on Multi-Core Processors
그런데, 이 Parallel FX Library가 어떻게 구현되었을까하는 궁금증을 가지고 있던 차에, .NET 바이너리를 디컴파일하여 소스를 보여주는 .NET Reflector 덕분에 내부를 들여다 볼 수 있었습니다.
간단히 말해 기본 구조는 MIT 대학에서 개발되었던 Cilk 에서 많은 부분을 빌어 왔다는 것을 알 수 있었습니다. Cilk는 1990년대 중반부터 개발되어 온 것이며 Work Stealing이라는 작업 스케줄링 개념을 만들어 내었습니다. .NET PFX도 Work Stealing을 그대로 적용시키고 있습니다.
PFX에서 핵심적으로 사용되는 자료구조 중에 "ConcurrentStack", "ConcurrentDeque (TakeQueue)", "ConcurrentListBag" 가 사용되고 있는데 이들은 대부분의 경우 Lock-free로 동작하도록 되어있습니다. .NET Reflector를 이용하면 소스를 살펴 볼 수 있습니다. 이들도 MS가 새로운 알고리즘을 개발한 것은 아니고, 모두 기존에 발표되었던 논문에 바탕하여 .NET에 적용한 것입니다.
하지만, NET의 Garbage Collector의 도움으로 이러한 Lock-Free 자료구조 제작이 C/C++에 비해 손쉽게 되었습니다. 다시 말해 Lock-Free의 난제들 중의 ABA문제와 메모리 액세스 문제(다른 스레드가 해제한 메모리를 참조하려고할 때 메모리 액세스 오류의 가능성이 있음)가 Garbage Collector로 인해 자동으로 제거되었다는 것입니다.
좀 극단적으로 말하면 PFX는 Cilk의 .NET 버전이라고 할 수 있습니다. 그만큼 Cilk에서 많은 부분을 빌어왔지만, 그다지 혁신적인 내용이 추가되지는 않았다는 것 입니다.
Java를 이용한 JCilk가 이미 발표된 지금, 늦은 감이 있으나 MS는 PFX 라이브러리로 .NET에서 병렬프로그래밍을 손쉽게 제공하려고 노력하고 있음을 알 수 있습니다. 하지만, 이것이 성공할지는 조금 더 지켜봐야 할 것 같습니다.