서점에 가면 다양한 언어별로 동시성을 다루는 책들을 많이 볼 수 있습니다. 프로그래밍을 하다 보면 이러한 동시성 처리가 필요한 경우가 있습니다. 그런데 동시성이라는 말을 종종 병렬성과 혼동되어 사용하는 경우가 있습니다. 그래서 이번에 한번 정리를 해볼까 합니다.
먼저 동시성과 병렬성의 차이를 표로 살펴보았습니다. 그러나 표로만 봐서는 조금 잘 안 와닿는 면이 있어서 몇가지 그림을 통해 좀 더 살펴 보겠습니다. 처음으로 보이는 이 그림은 직관적으로 잘 설명이 되어 있습니다. 동시적으로 실행되는 것과 병렬로 실행되는 것과 함께 추가적으로 2개의 작업이 순차적으로 실행되는 모습도 나와있습니다. 두번째 그림은 싱글 코어와 멀티 코어에서 동작하는 모습을 비교하는 그림입니다. 싱글 코어에서는 2개의 작업을 동시에 실행되는 것 처럼 보이기 위해 번갈아 가면서 작업을 수행합니다. 이때 다른 작업으로 바꾸어 실행할 때 내부적으로 Context switch가 일어납니다. 이 부분은 링크에 들어가보시면 더 자세한 내용을 살펴보실 수 있습니다. 마지막 그림은 실생활과 관련된 그림을 살펴보겠습니다. 이 그림을 보면 하나의 커피머신이 있는데 커피를 받기 위한 사람들의 줄이 2줄로 되어 있습니다. 그래서 서로 번갈아가면서 커피를 타게 되는 것이죠. 이러한 것을 동시성 처리라고 정의하고 있습니다. 반면에 병렬 처리의 경우는 2개의 커피 머신이 있고 각 커피 머신마다 하나의 줄을 가지고 있어서 각각의 줄마다 커피를 받을 수 있는 것을 병렬 처리라고 할 수 있습니다. 그림을 예로 들면서 보니 잘 이해가 됩니다. 이렇게 3가지 그림을 통해 동시성과 병렬성에 대해서 알아보았습니다. References
멀티스레드의 동시성(Concurrency)과 병렬성(Parallelism)멀티스레드는 동시성 방식이나 병렬성 방식으로 수행된다. 동시성(Concurrency)싱글 코어에서 멀티스레드를 동작시키기 위한 방식으로, 멀티 태스킹을 위해 여러 개의 스레드가 '번갈아가면서' 실행되는 성질을 말한다. 그래서 이는 정말 물리적으로 동시에 동작하는 것은 아니다. 💡 멀티 코어에서 멀티 스레드를 이용하여 이 동시성을 만족할 경우에는 실제 물리적 시간으로 동시에 실행된다. 참고로 멀티 스레드로 이 동시성 이라는 특성을 만족시킬 수 있는 것이지 동시성과 멀티 스레드는 사실 항상 함께할 순 없는 개념이다. 그 반례로 싱글 스레드에서 코루틴(Coroutine)을 이용하여 동시성을 만족할 수 있다. 💡코루틴(Coroutine) 싱글 스레드에서도 루틴(routine) 이라는 단위(맥락상 함수와 동일)로 루틴간 협력이 가능하며, 동시성 프로그래밍을 지원하고 비동기 처리를 쉽게 도와주는 개념을 말한다. 자세한 설명은 다른분이 설명해주신 이 글을 참고 바란다. 병렬성(Parallelism)멀티 코어에서 멀티스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 '동시에' 실행되는 성질을 말한다. 💡 동시성(Concurrency)의 '동시'와 병렬성의 설명에 있는 '동시' 때문에 헷갈릴 수 있으니 주의하기 바란다. 각 용어의 정확한 의미를 분석한 좋은 글이 있으니 참고 바란다. 보통 동시성에 비해서 병렬성은 각 코어들이 동시에 실행되므로 CPU의 유휴 시간(idle time)이 줄어들어 성능이 좋다. 그러나 CPU 수보다 처리해야 할 프로세스나 스레드 수가 많다면 CPU를 사용하기 전까지 대기가 발생한다.
https://seamless.tistory.com/42 싱글 코어에서는 위에서 설명했듯 여러 작업을 동시에 실행되는 것처럼 보이기 위해 번갈아 가면서 작업을 수행하는데, 이때 다른 작업으로 바꿔서 실행할 때 내부적으로 콘텍스트 스위칭(Context Switching)이라는 게 일어난다. 💡 콘텍스트 스위칭(Context Switching)에 대해서는 별도로 포스팅해뒀으니 참고 바란다. 출처동시성과 병렬성의 용어에 대한 정확한 이해와 분석 - '시간'을 기반으로 vagabond95.me/posts/concurrency_vs_parallelism/ 멀티스레드의 동시성과 병렬성 https://seamless.tistory.com/42 처음에 접하면 항상 헷갈리기 쉬운 동시성(Concurrency) 과 병렬성(Parallelism) 에 대해 정리해보고자 한다. 시간으로 풀어보기동시성과 병렬성은 각 작업이 진행되는 시간의 관점에서 살펴봐야 올바르게 이해할 수 있다고 생각되었다. 우선 위키에서 정의하는 각 개념을 살펴보자.
풀이해보면 다음과 같다.
이러한 내용 때문에 처음에 둘을 구분하는 어려움이 생긴다. 각 개념을 한글로 풀이하면 같은 의미가 되기 때문이다. (사전에서도 동의어로 취급하고 있다.) 즉, Computer Science 내에서 concurrently / simultaneously 라는 개념을 어떻게 다르게 다루는지 확인해볼 필요가 있겠다. 그림으로 살펴보며 맥락을 이해해보자. 위 그림에서 화살표는 각 task 가 수행되는 동안의 타임라인을 나타낸 것이며 (쓰레드가 아니다!) 각 영역은 task 가 수행되는 시간을 의미한다. 위 그림은 각 task 가 concurrently 하게 진행된다고 얘기할 수 있다. 하지만 simultaneously 하게 진행된다고 확신할 수 없다. 아직까지는 무슨 맥락인지 이해가 어렵다. 좀 더 low level 에서 살펴보자.
위 케이스는 low level 에서 Task A, B 가 수행될 수 있는 일부 경우의 수를 나열한 것이다. 각 케이스에 대한 상태는 다음과 같다.
CS 내에서 각 단어에 대한 의미는 다음과 같다.
단어에 대한 의미를 알았으니 각 케이스를 다시 살펴보자.
위 케이스들을 통해 알 수 있는 것은 동시성은 병렬성이기 위한 필요조건이지만 충분조건은 아니다. 즉,
정리먼길을 돌아왔다. 동시성과 병렬성을 정리해보자. 동시성동시성은 2개 이상의 task 가 있을 때 서로 다른 task 의 실행 시점에 상관없이 task 실행이 가능하다는 의미를 가진다. 병렬성병렬성은 2개 이상의 task 가 있을 때 각 task 가 물리적인 시간으로 동시에 실행이 가능하다는 의미를 가진다. 추가적으로 리서치 했을 당시 개인적으로 혼동을 주었던 설명들을 모아 위 개념으로 풀어봤다. 동시성이란
병렬성이란
예제 케이스마지막으로 개념을 완전히 이해하는데 도울 수 있도록 몇가지 예제 케이스를 정의한다. 각 task 가 수행되는 시간을 1이라고 가정한다.
|