컴퓨터가 발달되면서 다양한 기법들이 생기고 있습니다. 그 중에서 가장 중요하면서 당연한 기법이 병렬처리입니다. 대부분의 사람들은 한 순간에 한가지 일을 하는걸 힘들어 하지만, 컴퓨터는 한번에 여러가지일을 쉽게 처리할 수 있도록 설계되어 있는데요. 여러개의 cpu에 동시에 작업을 하도록 하여 처리 속도를 올리는 것입니다. 그렇다면 C#에서는 어떻게 병렬처리를 할 수 있는지 알아보겠습니다.
.Net 4.0에서 Parallel 이라는 것이 지원되었습니다. Parallel은 병렬 프로그래밍을 쉽게 할 수 있도록 만든 클래스입니다. Parallel은 System.Threading.Task에 가면 찾을 수 있습니다. Parallel에서 가장 많이 사용하는 것은 For와 ForEach입니다.
우선 Parallel.For부터 살펴보면, 어떤 인덱스를 갖고 0번부터 100번까지 { } 안에 작업을 병렬로 처리하겠다는 뜻입니다. 기존의 for문은 index가 증가하거나 감소하면서 순서대로 하나씩 작업을 실행하지만, 위의 경우는 작업을 여러개로 나눠 동시에 실행하기 때문에 순서대로 실행되지 않습니다. 대신 더 빠른 속도로 작업을 끝낼 수 있습니다.
ForEach를 사용하여서도 병렬처리를 할 수 있는데요. 이때는 List와 같이 여러개의 데이터가 들어가 있는 공간이 필요합니다. 예를 들어서 반 아이들의 키를 저장하고 있는 List가 있다고 할때, 이 키를 이용해서 바지 사이즈를 자동으로 측정하는 프로그램을 만든다고 가정해보죠. 이때 반 아이를 0번부터 100번까지 for문을 돌리면서 한명씩 측정할 수 있겠죠. 하지만 이보다 더 빠르게 하기 위해서는 ForEach를 이용해서 동시에 여러명을 측정하는 것이 가능해지는 것이죠. 이때 측정하는 함수는 각각 다른 메모리에서 서로의 데이터를 공유하면 안되는데요. 이 이야기는 뒤에 Invoke에 대한 설명을 보시면 이해가 될 것입니다.
마지막으로 많이 사용하는 병렬처리 방법 중에 Invoke가 있습니다. Invoke는 특정 동작을 병렬로 실행할 수 있는데요.
사용법은 이렇게 사용합니다. 동시에 함수 1~5를 실행한다는 함수입니다. 사용법은 정말 쉽습니다. 병렬처리를 하는데 있어서 가장 중요한 것은 메모리를 관리하는 것인데요. 만약에 각 함수가 실행되면서 같은 값에 접근하면 어떻게 될까요? 예를 들면 택시요금을 측정하는 기계를 만들었다고 할께요. 이 택시 요금 측정기는 인터넷에 연결되어 있어서 각 택시마다 요금이 어떻게 측정되는지 관리하고 기록할 수 있어요. 그런데 서버에 한 메모리에 가격이라는 변수가 있는데, 모든 택시에서 한 변수에만 접근해서 가격을 올리거나 내리거나 초기화한다면 어떻게 될까요? 아마 어떤 사람은 택시 요금이 10만원이 나오고 어떤 사람은 기본료만 내는 상황이 생길 수 있겠죠. 아마 자기 마음대로 요금이 바뀔 것 입니다. 각 택시들은 각자 독립적인 메모리를 갖고 있어야 안전하게 요금을 관리 할 수 있습니다.
이렇듯이 병렬처리를 할때는 입력과 출력을 정확하게 구분짓고 함수 내부에서 사용되는 메모리가 서로 공유되지 않도록 하는 것이 중요합니다. 물론 의도적으로 공유할 수 있지만 좋은 방법은 아니라고 생각됩니다.
'C# Programming' 카테고리의 다른 글
C# - interface 인터페이스 사용법과 원리 (0) | 2019.07.10 |
---|---|
C# - ConcurrentBag 사용법, 안전하게 데이터 관리하기 (0) | 2019.07.09 |
[C# Dictionary] 딕셔너리 활용법 (0) | 2019.06.29 |
[C# 예외처리] exception, try catch finally (0) | 2019.04.28 |
[C# enum 열거형] #02. enum 활용하기, 비트플래그 (0) | 2019.04.28 |