Versions Compared

Key

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

...

성능업(ScaleUP)  VS 확장(ScaleOUT)

ScaleUP

...

 노드1의 장비 성능을 높이기위해 사용되는 여러가지 행위임

...

Anchor
concurrency
concurrency
concurrency

...


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

작업전환이 이루어지면서 마치 같이 진행되는것처럼 보입니다.

...

물론 이 코드는, 옵션이나 실행 최적화에의해 다중스레드 병렬처리가 될수도 있습니다.
하지만 TASK개수만큼 OS의 자원인 스레드를 소비하지 않습니다.

Task VS Thread : Task는 Thread를 효율적으로 사용하는 추상적 개체로 
OS에따라 스케쥴 방식이 틀리고 또한 프레임워크따라 비동기처리를 위한
스레드및 메시지처리방식이 틀리기때문에
이 부분은 깊게 들어가지 않고, Actor가 어떻게 스레드수를 고려하여 튜닝가능한지? 

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


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

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


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

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

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


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

Thread 하나를 잘 사용해도 3분만에 식사준비를 마칠수가 있다란것이며,  적은 자원으로 작업총량 목표치인 3분완료 달성에 의미가 있습니다

...

.


Anchor
parallelism
parallelism
Parallelism

...

각 Task를 하나씩 작동시키는 방법도 의미적으로 병렬처리라고 할수있습니다. 하지만 1Core입장에서는 한번에 하나의일만

하기때문에 1Core입장에서는 병렬처리가 아닌 컨텍스트 스위칭발생에 의한 동시처리라고 정의할수도 있습니다.  

 전통적으로 node.js이전, 비동기프로그래밍 지원이안되던  웹서버에서  스레드개수를 통해 동시요청을 처리하려고 했으며

이경우 서버입장에서 사용자를 병렬 처리하는 서버라고 볼수 있으며, node.js는 반대인 다중요청을 동시에 진행하는 서버 라고 볼수있습니다.

...

 


처음한 식사준비 예시에서 연장을 한다고 하면  , 비효율인 방법으로 3Thread가 임무분담을 하는것도 병렬처리이며

  • 가스렌지가 불을 공급한다.
  • 전자렌지가 가열을위해 전자파를 공급한다.


위 작업은, 본질적으로 나눌수가 없으며, 더 많은 식사준비를 하기위해서는 n개의 가스렌지및 전자렌지가 필요합니다.


적절한 예일지는 모르지만, 어쨋든 동시성과 병렬처리 개발모델은 어느 한가지 방식만 고집해서 발전해온것이 아니고

서로 상호보완에 의해 우리의 OS는 렉이 없이 여러가지 작업을 잘 수행한다는 것입니다. 하지만 CPU및 IO장치의 발전의

한계에 이르자,  이러한 OS자체에게 분산해서 일을 처리하려는 분산처리 개발 모델이  생겨나게 됩니다.


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



Anchor
Synchronous vs Asynchronous
Synchronous vs Asynchronous

...