posted by 방랑군 2012. 1. 19. 02:30

요즘 대부분의 컴퓨터가 멀티코어다 보니 가끔 노는 코어들을 보게 된다. 그래서 궁금증에 멀티코어 프로그래밍 기법이 있어 퍼와봤다.

일단 기본적인 코드는 데브피아에서 가져왔는데 실제 어떻게 돌아가는지 내부 설명이 없어서 좀 조사해 봤다.

일단 코드...


======================================================================================================================

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Diagnostics;


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{

const int NumOfThread = 5;

Thread[] threads = new Thread[NumOfThread];

for (int i = 0; i < NumOfThread; i++)
{
threads[i] = new Thread(ThreadProc);
threads[i].Start(i);
}


Process currentProcess = Process.GetCurrentProcess();

foreach (ProcessThread processThread in currentProcess.Threads)
{
processThread.ProcessorAffinity = currentProcess.ProcessorAffinity;
}


for (int i = 0; i < NumOfThread; i++)
{
threads[i].Join();
}

}


public static void ThreadProc(object threadId)
{
//스레드 작업

}

}

}

======================================================================================================================


코드 자체는 굉장히 심플하다. 실제 프로그램 만들때도 이렇게 심플하다면 좋겠지만 무언가 다른 문제점이 발생할지 모르니 왜 저 코드가 멀티코어 프로그래밍이 되는것인지 스스로 어느정도 파악해 보았다. 간단히 말하자면


Process currentProcess = Process.GetCurrentProcess();

currentProcess는 현재 프로세서의 정보를 가져오게 되고


foreach (ProcessThread processThread in currentProcess.Threads)
{
processThread.ProcessorAffinity = currentProcess.ProcessorAffinity;
}


현재 프로세서의 스레드를 하나씩 가져와서 ProcessorAffinity 속성을 현재 프로세서의 속성으로 바꿔 주는 코드 이다.

여기까지는 다른데 다 나와있는 설명이자 코드 설명이고 간단하게 내가 파악해본 내부 구조는 일반적으로 쿼드코어 PC의 환경이라고 한다면 일반적으로 제작한 프로그램은 아래와 같은 구조를 가지게 된다.




해당 프로세서는 쿼드쿼어중 하나의 코어에서 실행되게된다. 이 속성이 바로 ProcessorAffinity 속성으로 해당 코어중 하나가 처리할수 있도록 되어 있다. 프로세서에서 생성한 스레드는 해당 프로세서에서 실행이 되기 때문에 다수의 코어가 작동을 하지 않는다.

그래서 하위의 스레드의 속성을 상위 프로세서와 동일하게 바꿈으로써 실제 코어가 스레드의 작업을 처리할 수 있도록 설정하는 것이다.

구지 그림으로 표현한다면....




이런식으로 설정을 변경하는 것이다. 내 개인적인 조사기때문에 실제 다를수 있다;;; 위코드야 워낙 심플하니 문제가 없겠지만 실제 복잡한멀티코어 프로그래밍에서 중요한것은 문법이 아닌 시스템 전체의 구조와 각부분간의 영향력이 아닌가 싶다. 만약 오류사항이나 수정사항이 있으면 알려주세요~

'강좌 > C#' 카테고리의 다른 글

SELECT 함수  (0) 2012.01.19
멀티플렉싱(multiplexing)과 select()함수  (0) 2012.01.19
[C#] Template Method 패턴  (0) 2012.01.19
[C#] Singleton 패턴이 적용된 File 로거  (0) 2012.01.19
[C#] 리플렉션 Reflection  (1) 2012.01.19