동시성: 하나의 코어에서 여러 스레드가 번갈아가며 실행
병렬성: 멀티 코어에서 여러 스레드를 동시에 실행
동시성
동시성은 여러 작업이 겹치는 기간에 실행될 수 있음을 의미한다. 동시에 실행하는 것이 아니라 CPU가 작업마다 시간을 분할해 적절하게 context switching을 해서 "동시에 실행되는 것처럼 보이게 한다". 이렇기 때문에 동시성은 구현하는 것도 디버그하는 것도 어렵다.
"동시성의 핵심 목표는 유휴 시간을 최소화하는 것"이다. 유휴 시간은 컴퓨터가 작동 가능한데도 작업을 하지 않는 시간으로 아무것도 안하고 놀고 있는 시간이라고 생각하면 된다. 현재 프로세스 또는 스레드가 I/O 작업, DB 트랜잭션 등등 외부 프로그램 실행을 기다리는 동안에 다른 프로세스 또는 스레드가 CPU 할당을 받는다. 그림으로 표현하면 아래와 같다.
병렬성
병렬성은 "동일한 시간에 독립적인 작업을 실행할 수 있음"을 의미한다. 동시성과는 달리 여러 작업을 다른 코어, 다른 프로세스, 별도의 컴퓨터 등에서 동시에 실행할 수 있다. 그래서 병렬 처리가 성능 향상에 필수적이라고도 한다.
한가지 예로 분산 컴퓨팅 시스템이 있다. 분산 컴퓨팅 시스템은 단일 시스템으로 실행하는 여러 컴퓨터 시스템들로 구성되어 있다. 각 컴퓨터에 존재하는 시스템들은 네트워크로 연결될 수 있다. (그림 참고) 해당 예제 외로도 하나의 컴퓨터에서 여러 코어를 사용하여 병렬 처리를 활용할 수도 있다.