최근 락을 적용하여 동시성 문제를 해결하면서 동시성과 병렬성의 개념을 혼동하고 있어 각 개념을 정리해 보았습니다.
동시성(Concurrency)
동시성은 하나의 코어(싱글 코어)에서 여러 작업을 번갈아 가면서 처리하는 방식입니다.
CPU는 한 번에 하나의 작업만 처리할 수 있기 때문에 여러 작업을 번갈아 가면서 처리하는데, 이를 context switching이라고 합니다.
context switching이 빠르게 이루어져 물리적으로 동시에 실행되는 것이 아니어도 작업이 동시에 실행되는 것처럼 보이게 하는 것입니다. 따라서 여러 작업이 동시에 공유된 자원에 접근하는 경우 동기화 문제가 발생할 수 있습니다.
병렬성(Parallelism)
병렬성은 CPU가 여러 개(멀티 코어) 있어서 CPU에서 각 작업을 동시에 처리하는 방식입니다.
즉, 실제로 여러 작업이 물리적으로 동시에 처리되는 것으로 하나의 코어(싱글 코어)에서는 병렬적으로 프로그램을 실행할 수 없습니다. 하나의 코어에서 처리하던 작업을 각각의 코어에서 처리하므로 성능이 향상됩니다.
💭 실생활 예시
만약 영상도 보고 코딩도 해야 하는 상황이라면, 사용자는 한 번에 두 작업을 동시에 할 수는 없습니다. 따라서 영상을 보다가 정지 후 코딩을 진행하고 다시 영상을 보는 행위를 반복하는 것을 동시성이라 할 수 있겠습니다.
또 음악 영상을 들으며 동시에 코딩을 하는 행위를 병렬성으로 비유할 수 있겠습니다.