동시성(Concurrency)은 Task들이 빠르게 전환하면서 실행되어 동시에 실행되는 것처럼 보이는 것입니다. 싱글 코어에서도 여러 작업은 동시적(Concurrent)으로 실행되며 Task간의 Context Switch가 발생하면서 여러 작업들을 동시에 실행하는 것처럼 보이게합니다. 하지만 동시성은 싱글 코어에서만 실행되는 것을 의미하지 않고 실제로는 멀티 코어에서 실행되는 상황이 더 많습니다.
즉, 동시성은 독립적인 작업을 작은 단위의 연산으로 나누어 시간 분할 형태로 연산하고 논리적으로 동시에 실행하는 것처럼 보이게하여 유휴 시간(Idle Time)을 최소화 하는 구조나 개념을 의미합니다.
📘 유휴시간이란? 컴퓨터가 작동 가능한데도 작업을 하지 않는 시간을 의미합니다.
동시성은 싱글 코어에서도 Concurrent하게 동작하는 Task에서 동기화 문제가 발생합니다. 공유된 자원을 서로 접근하려고 할 때 예상되지 않은 결과가 생길 수 있으므로 이때는 동기화 기법을 사용해주어야합니다.
병렬성(Parallelism)은 물리적인 시간에 작업을 동시에 수행하는 것 입니다. 동시성과는 다르게 병렬성은 여러 작업들을 코어, 프로세스, 컴퓨터등으로 동시에 수행할 수 있으며 꼭 멀티 코어 한 개 이상의 스레드가 동시에 수행하는 것에만 한정하는 것은 아닙니다. 병렬성은 메모리 손상, 누수가 발생할 수 있습니다.
동시성과 병렬성을 비교 정리하자면 다음과 같다.
동시성 | 병렬성 |
---|---|
동시에 실행되는 것 같이 보이는 것 | 실제로 동시에 여러 작업이 처리되는 것 |
싱글 코어에서 멀티 쓰레드(Multi thread)를 동작 시키는 방식 | 멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방식 |
한번에 많은 것을 처리 | 한번에 많은 일을 처리 |
논리적인 개념 | 물리적인 개념 |
병렬성은 동시성에 포함되는 개념입니다. 또한 멀티 코어와 멀티 스레드에서 병렬성으로 작업하는 게 항상 성능상 이점이 있는 것은 아닙니다. I/O 요청 후 기다리는 작업이 많은 경우를 처리할 때 때로는 단일코어에서 동시성으로 처리 할 때 효율적일 수 있습니다. 동시성 여러 작업을 동시에 수행하므로 경합 상태(Race Condition), 데드락(Deadlock), 기아(Starvation)과 같은 문제가 발생할 수 있으니 주의하여 개발해야한다.