Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

동시성(Concurrency)  VS 병렬처리(Parallelism)

동일시간(성능적차이를 제거하고)에 여러가지 작업을 동시에 처리한다란 점은 동일하지만

작동방식에는 약간의 차이가 있습니다.

동시성과 병렬성은 관련 개념이지만 약간의 차이점이 있습니다.

동시성이란 두 개 이상의 작업이 동시에 실행되지 않을 수도 있지만 작업이 진행 중임을 의미합니다.

예를 들어 작업의 일부가 순차적으로 실행되고 다른 작업의 일부와 혼합되는 시간 조각으로 실현할 수 있습니다.

반면에 병렬 처리는 실행이 진정으로 동시에 일어날 수있을 때 발생합니다네트워크 모델을 제거하고 단일 PC에서의 차이를 살펴보겠습니다.



concurrency

...


 동시성의 경우,  본질적으로 작업이 ,동일시간에 한꺼번에 실행되지는 않습니다.  

작은 작업단위가, 블락당하지 않고 계속 흘러감으로 마치 여러가지 작업이 한꺼번에 수행되는것 처럼 보이는것으로

식사를 하기위해 아래와 같은 작은 작업이 필요하다고 해봅시다.

  • 라면을 끓여 먹을수 있는 상태로 만든다.(Task1) -3분
  • 햇반을 익혀 먹을수 있는 상태로 만든다.(Task2) -2분
  • 반찬을 준비한다. ( Task3) -1분

1Thread로 순차처리를 하게되면 6분이 걸리게 됩니다. 이 문제를 해결하기위해 

전통적인 동시성의 처리 ,멀티스레드 프로그래밍방식에서는 3개의 Thread가 각각 하나의 임무를맞고 OS의 스케쥴러 우선순위에

의해 작업을 번갈아가며 처리하는것입니다. ( CPU1코어기준 여러 스레드는 Context 스위치가 발생하기 때문에 실제는 번갈아가며 하나의 일밖에못합니다.)

이 방식은,  스레드 개수를얼마나 효율적으로 제한을두고 빨리 반환 하느냐에 포커싱이 맞춰져 있으며 3개의 Thread가 꼭 필요하다란 것입니다. 

이 작업을 순차처리도아니고/멀티 스레드 중심적이지아닌, 과연 1인분의 식사를 준비하는데 3명이 필요한것인가에 대한 관점으로 변환해봅시다.

물을 끓이고(Task1) - 햇밧에 전자렌지돌리고(Task2)  - 후라이팬가열(Task3) - 라면넣고(Task1) - 햇반이 익었는지 보고(Task2) - 후라이팬을 뒤집고(Task3)

적은자원으로 3분만에 사실은 1인분의 식사준비를 마칠수가 있다란것입니다.

프로그래밍 관점에서 우리가 진행하려는 작업(함수)을 한꺼번에 진행하는데 의미가있으며, 하드웨어 효율적인 사용측면에서는

그러한 작업이 무조건 Thread를 안늘려도 할수 있다란것입니다.

   

일반적으로 스레드 사용을 명시적으로 하지 않습니다.


Code Block
languagec#
themeEmacs
titleTask를 이용한 동시처리
linenumberstrue
using System;
using System.Threading;
using System.Threading.Tasks;

class CustomData
{
   public long CreationTime;
   public int Name; 
   public int ThreadNum;
}

public class Example
{
   public static void Main()
   {
      // Create the task object by using an Action(Of Object) to pass in custom data
      // to the Task constructor. This is useful when you need to capture outer variables
      // from within a loop. 
      Task[] taskArray = new Task[10];
      for (int i = 0; i < taskArray.Length; i++) {
         taskArray[i] = Task.Factory.StartNew( (Object obj ) => {
                                                  CustomData data = obj as CustomData;
                                                  if (data == null) 
                                                     return;
                                     
                                                  data.ThreadNum = Thread.CurrentThread.ManagedThreadId;
                                                  Console.WriteLine("Task #{0} created at {1} on thread #{2}.",
                                                                   data.Name, data.CreationTime, data.ThreadNum);
                                               },
                                               new CustomData() {Name = i, CreationTime = DateTime.Now.Ticks} );
      }
      Task.WaitAll(taskArray);     
   }
}
// The example displays output like the following:
//       Task #0 created at 635116412924597583 on thread #3.
//       Task #1 created at 635116412924607584 on thread #4.
//       Task #3 created at 635116412924607584 on thread #4.
//       Task #4 created at 635116412924607584 on thread #4.
//       Task #2 created at 635116412924607584 on thread #3.
//       Task #6 created at 635116412924607584 on thread #3.
//       Task #5 created at 635116412924607584 on thread #4.
//       Task #8 created at 635116412924607584 on thread #4.
//       Task #7 created at 635116412924607584 on thread #3.
//       Task #9 created at 635116412924607584 on thread #4.
Info

앞으로 Akka.net에서 진행하게 처리방식은 멀티스레드 프로그래밍을 통한 동시성처리가 아님을

현재 섹션에서는 기억만 해두시면 됩니다.

동시성 프로그래밍에 대한 더 전문적인 설명은 아래 블로그를 참고하세요

  • http://blog.lgcns.com/1084
  • 과거는 잊어라


    Parallelism

    ...


    병렬처리의 경우 작업을 명시적으로 여러개의 물리(코어)적 연산 장치에 각각 Join시켜  한꺼번에 처리하는 경우를 진정한 의미에서 병렬처리라 할수 있습니다.

    가용한(풍부한) 자원을 바탕으로, 여러가지 작업을 한꺼번에 수행할수가 있습니다.

    각 Task를 스레드에 하나씩 작동시키는 방법도 OS에 의해  Context스위칭이 발생하지 않으면  병렬처리로 볼수는 있습니다.

    처음한 식사준비 예시에서 연장을 한다고 하면  

    • Task1은 라면만 끊인다. -3분
    • Task2는 밥만 짓는다 -2분
    • Task3는 반찬을 준비한다. -1분

    그낭 묵묵히 독립적으로 자기만의 일을 하는것입니다.  여기서 여러명의 식사가 필요하면 단순하게 병렬처리 스레드 개수를 늘려서 해결합니다.

    자신의 목표치가 먼저 달성되면  유휴상태가 되거나 자신의 스레드 자원을 반납할수는있지만, 진행중인 남의일을 대신하여 전체 시간을 줄일순 없습니다일반적으로 각 작업단위를 스레드하나에 할당하고 다수의 스레드를 동작시키는것도 병렬처리라고 볼수 있습니다.


    Code Block
    languagec#
    themeEmacs
    linenumberstrue
    //병렬처리를 위한 멀티 코어 프로그래밍 예 
    
    Thread[] threads = new Thread[NumOfThread];
    
    Process currentProcess = Process.GetCurrentProcess();
    foreach (ProcessThread processThread in currentProcess.Threads) 
    { 
    processThread.ProcessorAffinity = currentProcess.ProcessorAffinity;
    }
    
    //물리적단위인 Core(process) 에 Task를 명시적으로 걸고 동시에 시작해버립니다.
    for (int i = 0; i < NumOfThread; i++) 
    { 
    threads[i].Join(); 
    }
    }
    
    

    ...