Versions Compared

Key

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

...

네트워크 모델을 제거하고 단일 PC에서의 차이를 살펴보겠습니다.

...


...

concurrency

...


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

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


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

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

3 스레드가 각각, Task를 분담하여 한꺼번에 준비할수도 있습니다. 하지만 라면을 끊여야하는 시간 3분

이 시간이 있기때문에 이 시간을 줄이지 못하는 이상  식사준비는 최소 3분이 걸리며 여기서 더이상 줄일수 없습니다. 

그래서 여기서 효율적인 작업 방법은 1Thread만 사용하여 효과적으로 작업을 나눠 동시에 진행하는 것입니다.


1Thread로 순차처리를 하게되면 6분이 걸리게 됩니다. 

전통적으로 이러한 문제를 해결하려고,  멀티스레드 프로그래밍방식에서는 3개의 Thread가 각각 하나의 임무를맞고 OS의 스케쥴러 우선순위에

의해 작업을 처리하였습니다.   이것역시 작동방식적으로 동시처리가 맞습니다. ( CPU1코어기준 여러 스레드는 Context 스위치가 발생하기 때문에 실제는 번갈아가며 작동됩니다.)


하지만 위 방식은, 반찬을 준비하는 스레드가 일이 끝났다고 가정해봅시다. 스레드 자원을 반환하겠지만 전체적인 총량에대한

시간을 줄이기위해 반찬 준비하던 스레드가 라면을 끓이는데 걸리는시간을 줄이거나 햇반을 익히는데 전혀 도움을 줄수가 없음으로

3분이란 시간을 결국 줄일수가 없으며  다소 비싼 자원인 스레드를 사용하였습니다. 그래서 멀티스레딩 프로그래밍은 스레드 개수를

얼마나 효율적으로 제한을두고 빨리 반환 하느냐에 포커싱이 맞춰져 있습니다.  


이 작업을 순차처리도아니고/멀티 스레드 중심적이지 않는 작업으로 변환해봅시다.

이 작업은 1개의 스레드만 사용하여 물을 끓이고(Task1) - 햇밧에 전자렌지돌리고(Task2)  - 후라이팬가열(Task3) - 라면넣고(Task1) - 햇반이 익었는지 보고(Task2) - 후라이팬을 뒤집고(Task3)

Thread 하나를 잘 1Thread만 사용해도 3분만에 식사준비를 마칠수가 있다란것에 큰의미가 의미가 있으며, 자원을 낭비하지 않음으로 더많은 일을 할수가 있게됩니다.

물론 실제로는, 작업완료시간을 목표로 두고 작동되는것도 아니며 꼭 단일 thread만 사용하는것도 아닙니다.

효율적으로 작동되는것이 아닌 블락킹없이 동시에 여러가지 일을 처리한다는데 진행 한다는데 의미가 있습니다.


Info

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

http://blog.lgcns.com/1084


Parallelism

...


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

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

각 Task를 스레드에 하나씩 작동시키는 방법도 의미적으로 병렬처리라고 정의를 내리겠습니다.(OS에의한 context 스위칭 무시)OS에 의해  Context스위칭이 발생하지 않으면  병렬처리로 볼수는 있습니다.


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

...

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(); 
}
}


http://blog.lgcns.com/1084

Anchor
Synchronous vs Asynchronous
Synchronous vs Asynchronous

...