multithread
의 instruction 처리에 대해서 concurrency 인지 parallel 인지에 대해 명확한 이해가 없었다. multithread
이면 단순히 parallel(병렬적)하게 instruction을 처리한다고 생각했다.
문득 생각해보니 processor가 하나면 결국 instruction을 처리하는 주체가 하나인데 어떻게 thread가 여러개가 있다고 parallel하게 명령어를 처리할 수 있는지에 의문이 생겼고 그 의문을 해결하고자 한다.
multithreading
을 알아보기에 앞서 concurrency와 parallel에 대해서 정확하게 짚고 넘어가야 한다.
Oxford Dictionary에 따르면 concurrency
란, 같은 시간에 두개 이상의 일을 하는 것이라고 한다. 하지만 parallel
과 concurrency
를 구분하기에는 조금 모호하다. concurrency
에 대해 이해하기 위해 다음 그림을 참조하자.
CPU는 한번에 하나의 task밖에 처리하지 못한다. 즉, concurrency
라는 것은 여러 개의 thread를 빠른 속도로 번갈아가며 CPU를 할당하는 것을 뜻한다. 그래서 완전히 parallel
하게 처리하는 것은 아니지만, 거의 parallel
하게 처리하는 것처럼 보인다.
parallelism
은 다수의 processor 가 여러 개의 processes 들을 동시에 처리하는 것을 말한다. parallel programming을 위해서는 병렬 처리에 특화된 프로그래밍을 사용해야 한다.
Parallel Processing
task를 나눠서 최소한의 시간에 처리할 수 있도록 2개 혹은 그 이상의 CPU들이 하나의 task를 분리시켜서 처리한다. 다수의 tasks들은 parallel processing sys 에서 concurrently하게 처리된다.
흔히 multithreading은 single processor에서도 parallel하게 처리한다는 환상을 느끼기도 한다. 하지만, single processor에서의 thread들은 스케줄링 알고리즘에 의해서 switching 하며 작업을 처리한다. 혹은, time out 이나 interrupt 같은 외부적인 요인도 같이 작용한다.
즉, parallel
하게 명령어를 처리하는게 아니라, 시분할을 통해 concurrency
하게 명령어를 처리하는 것이다.
multiple processor에서의 multithread는 완전히 병렬적(parallel)으로 작동한다. single processor에서의 multithreading은 한번에 하나의 thread만 동작하지만, multiple processor에서는 독립적인 여러 개의 processor들이 동시에 동작하며 task들을 해결한다.
출처