동시성이란 CPU가 여러 개의 작업을 작은 단위의 연산으로 나누고 context switching하며 실행하는 것을 보고 동시에 여러 작업을 수행하는 것처럼 보이는 것을 말한다. 이렇게 실행되는 task들은 운영체제의 스케줄링 정책에 의해 실행된다.
즉, 싱글 코어에서 단일 프로세스 내에 멀티 쓰레드를 동작 시키는 방식을 의미하는 논리적인 개념이다.
병렬성은 여러 개의 코어(멀티 코어)에서 여러 개의 작업(멀티 쓰레드)을 실제로 동시에 수행하는 것(병렬로 처리하는 것)을 말한다.
즉, 멀티 코어에서 멀티 쓰레드를 동작시키는 방식으로 각 코어가 물리적인 시간에 동시에 실행되는 물리적인 개념이다.
두 개 이상의 concurrent한 쓰레드들이 공유된 자원에 접근하려고 할 때 동기화 매커니즘 없이 접근하려고 하는 상황을 말한다.
따라서 어떤 작업이 마지막으로 공유 자원에 접근했는지에 따라 자원의 상태가 바뀌게 되어 자원의 일관성을 보장할 수 없어진다.
이 문제를 해결하기 위해서 쓰레드(프로세스)들은 동기화(Synchronized) 되어야 한다.