Page History
...
쉬운 이해를 위해, 네트워크 모델을 제거하고 단일 PC에서의 차이를 살펴보겠습니다.
concurrency
...
동시성의 동시성의 경우, 본질적으로 작업이 ,동일시간(나노세컨)에 동시에 실행되지는 않습니다. 작업이 작은 단위로 조각이 난상태로
context 스위칭이 일어나면서 일시정지, 실행을 반복하게 됩니다. 하나의 코어에서 다중 쓰레드 형태로
일반적으로 Task관리자에의해 상태를 복구를 반복 하면서 동시에 처리되는것처럼 보일려고 합니다.작업단위가 쪼개져서 반복되면서 상태를 복구하면서 작동하게되는 케이스입니다.
하나의 Task에대한 성능을 높이기보다, 제한된 자원으로 전체적인 총량에 대한 처리에대해 처리의 효율을 높이는데 의미가 있습니다.
놀고있는 스레드가 누구인가? 고려하지 않아도 됩니다. Thread에 비해 Task는 충분히 많이 만들수 있으며 최적화되어 작동됩니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
Task task1; Task task2; Task task3; //작업 3개가 동시에 시작합니다. task1.Start(); task2.Start(); task3.Start(); |
Info |
---|
물론 이 코드는, 실행 최적화에의해 다중코어로다중코어 병렬처리가 될수될수도 있습니다. Task의 개수가 코어개수를 초과했을시 병렬처리가아닌/동시성 설명이 가능합니다. Task VS Thread : Task는 Thread를 효율적으로 사용하는 좀더 추상적 개체로 OS에따라 스케쥴 방식이 틀리고 또한 프레임워크따라 Task별비동기처리를 스레드수가 위한 스레드 관리방식이 틀리기때문에조절가능하기때문에 틀려질수있습니다. 이 부분은 깊게 들어가지 않고, Actor가 어떻게 스레드수를 고려하여 튜닝가능한지? actor-dispatcher 편에서 에서 더 자세하게 설명예정입니다. |
...
가용한(풍부한) 자원을 바탕으로, 여러가지 작업을 한꺼번에 수행할수가 있습니다. 물론 단순하게 스레드를 N개로 생성하여
각 Task를 하나씩 작동시키는 방법도 의미적으로 병렬처리라고 합니다.
자원적으로 생성할수 있는 스레드수는 제한적입니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
//병렬처리를 위한 멀티 코어 프로그래밍 예 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(); } } |
주어진 시간에 어떠한 작업을 스레드 스케쥴링에의해 블락킹없이 동시에 처리하느냐(동시성)?
...
어느방식을 사용하던, 실제로는 꼭 한가지 방식 한정적으로 작동 되지 않습니다.
Info | ||
---|---|---|
| ||
조금더 복잡한 분산처리모델을 적용 시키면 ( 동시성과 병렬처리의 조합) 비용이 큰 연산단위를 더 작은단위로 잘게(Slice)나눠 빠른 분산처리를 통해 작업총량에 걸리는 시간을 어떻게 줄일까? Akka에서는 StrameSinkAndFlows+Cluster 조합으로 이러한 문제를 풀려고 하고있습니다. 1시간마다 배치를 돌려 밀린일을 한꺼번에한다던지? 이러한 기능은 AKKA와 맞지 않는 Job의 형태입니다. |
...