멀티스레드의 동시성(Concurrency)과 병렬성(Parallelism)
멀티스레드는 동시성 방식이나 병렬성 방식으로 수행된다.
동시성(Concurrency)
싱글 코어에서 멀티스레드를 동작시키기 위한 방식으로, 멀티 태스킹을 위해 여러 개의 스레드가 '번갈아가면서' 실행되는 성질을 말한다. 그래서 이는 정말 물리적으로 동시에 동작하는 것은 아니다.
💡 멀티 코어에서 멀티 스레드를 이용하여 이 동시성을 만족할 경우에는 실제 물리적 시간으로 동시에 실행된다.
참고로 멀티 스레드로 이 동시성 이라는 특성을 만족시킬 수 있는 것이지 동시성과 멀티 스레드는 사실 항상 함께할 순 없는 개념이다. 그 반례로 싱글 스레드에서 코루틴(Coroutine)을 이용하여 동시성을 만족할 수 있다.
💡 코루틴(Coroutine)
싱글 스레드에서도 루틴(routine) 이라는 단위(맥락상 함수와 동일)로 루틴간 협력이 가능하며, 동시성 프로그래밍을 지원하고 비동기 처리를 쉽게 도와주는 개념을 말한다. 자세한 설명은 다른분이 설명해주신 이 글을 참고 바란다.
병렬성(Parallelism)
멀티 코어에서 멀티스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 '동시에' 실행되는 성질을 말한다.
💡 동시성(Concurrency)의 '동시'와 병렬성의 설명에 있는 '동시' 때문에 헷갈릴 수 있으니 주의하기 바란다.
각 용어의 정확한 의미를 분석한 좋은 글이 있으니 참고 바란다.
보통 동시성에 비해서 병렬성은 각 코어들이 동시에 실행되므로 CPU의 유휴 시간(idle time)이 줄어들어 성능이 좋다. 그러나 CPU 수보다 처리해야 할 프로세스나 스레드 수가 많다면 CPU를 사용하기 전까지 대기가 발생한다.
💡 그래서 유휴 시간을 줄이고 성능이 좋아지는 스레드 적정 개수를 아는 것이 중요한데, 이는 별도로 포스팅 한 후 여기 링크를 달아두겠다.
싱글 코어에서는 위에서 설명했듯 여러 작업을 동시에 실행되는 것처럼 보이기 위해 번갈아 가면서 작업을 수행하는데,
이때 다른 작업으로 바꿔서 실행할 때 내부적으로 콘텍스트 스위칭(Context Switching)이라는 게 일어난다.
💡 콘텍스트 스위칭(Context Switching)에 대해서는 별도로 포스팅해뒀으니 참고 바란다.
출처
동시성과 병렬성의 용어에 대한 정확한 이해와 분석 - '시간'을 기반으로
vagabond95.me/posts/concurrency_vs_parallelism/
멀티스레드의 동시성과 병렬성
'JAVA > 스레드' 카테고리의 다른 글
스레드(Thread) - 동기화(Synchronization) (0) | 2021.04.15 |
---|---|
스레드(Thread) - 스레드 관련 메서드 (0) | 2021.04.15 |
스레드(Thread) - 개념, 사용이유, 프로세스와의 비교, 상태, 우선순위, 종류 (2) | 2021.01.24 |