Page History
...
- 라면을 끓여 먹을수 있는 상태로 만든다.(Task1) -3분
- 햇반을 익혀 먹을수 있는 상태로 만든다.(Task2) -2분햄을 구워
- 먹을수 있는 상태로 만든다반찬을 준비한다. ( Task3) -1분
3 스레드가 각각, Task를 분담하여 한꺼번에 준비할수도 있습니다. 하지만 라면을 끊여야하는 시간 3분
...
Thread 하나를 잘 사용해도 3분만에 식사준비를 마칠수가 있다란것이며, 적은 자원으로 작업총량 목표치인 3분완료 달성에 있다란것에 큰의미가 있으며, 자원을 낭비하지 않음으로 더많은 일을 할수가 있게됩니다.
물론 실제로는, 작업완료시간을 목표로 두고 작동되는것이 아닌 블락킹없이 동시에 여러가지 일을 처리한다는데 의미가 있습니다.
Anchor | ||||
---|---|---|---|---|
|
...
병렬처리의 경우 작업을 명시적으로 여러개의 물리(코어)적 연산 장치에 각각 Join시켜 한꺼번에 처리하는 방식입니다경우를 진정한 의미에서 병렬처리라 할수 있습니다.
가용한(풍부한) 자원을 바탕으로, 여러가지 작업을 한꺼번에 수행할수가 있습니다. 물론 단순하게 스레드를 N개로 생성하여 각 Task를 스레드에 하나씩 작동시키는 방법도 의미적으로 병렬처리라고 할수있습니다. 정의를 내리겠습니다.(OS에의한 context 스위칭 무시)
처음한 식사준비 예시에서 연장을 한다고 하면 , 비효율인 방법으로 3Thread가 임무분담을 하는것도 병렬처리이며
- 가스렌지가 불을 공급한다.
- 전자렌지가 가열을위해 전자파를 공급한다.
위 작업은, 본질적으로 나눌수가 없으며, 더 많은 식사준비를 하기위해서는 n개의 가스렌지및 전자렌지가 필요합니다.
적절한 예일지는 모르지만, 어쨋든 동시성과 병렬처리 개발모델은 어느 한가지 방식만 고집해서 발전해온것이 아니고
서로 상호보완에 의해 우리의 OS는 렉이 없이 여러가지 작업을 잘 수행한다는 것입니다. 하지만 CPU및 IO장치의 발전의
- Task1은 라면만 끊인다.
- Task2는 밥만 짓는다
- Task3는 반찬을 준비한다.
그낭 묵묵히 자기만의 일을 하는것입니다. 여기서 여러명의 식사가 필요하면 단순하게 병렬처리 개수를 늘려서 해결합니다.
단일기기에서 성능을 낼수 있는 단순한 방법이였으나 자원을 많이 사용하는 방식이여서 동시성처리와 병렬처리가 혼합이되어 스케일업의 최적화전략을 세울수 있습니다.
하지만 이역시 CPU/IO처리 발전의 한계에 도달하여 스케일아웃이 가능한 분산처리 개념으로 연장이 됩니다. 한계에 이르자, 이러한 OS자체에게 분산해서 일을 처리하려는 분산처리 개발 모델이 생겨나게 됩니다.
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(); } } |
...