컴퓨터가 여러 작업이 동시에 들어오는 경우에 처리하는 방식을 CPU core의 갯수에 따라서 동시성, 병렬성 이라는 개념으로 나눌 수 있다.
동시성이란 하나의 CPU Core를 통해서 동시에 들어오는 작업을 수행하는 개념을 의미한다.
여러 task를 수행하기 위해서 여러 쓰레드를 번갈아 가면서 context switching을 한다. 이를 통해서 실제로는 동시에 작업이 처리되는 것은 아니지만, 논리적으로 동시에 실행되는 것처럼 보이게 만든다.
이를 통해서 IO작업시에 CPU가 아무것도 안하게 만들어서 비효율적이 되는 상태를 막는다. 그러나 동시에 처리되는 것처럼 보이는것 이기에,
동시성 개념에서는 순서를 정해주는 작업이 중요하다. 동시에 들어오는 작업에서 사용자가 의도한 순서대로 작업이 처리되도록 동시성을 제어하는것이 중요하다는 의미이다.
컨텍스트 스위칭이 자주 일어나느 경우, 오버헤드가 생길 수 있다.
또한 여러 스레드를 이용할 때 DeadLock Race Condition Starvation등의 문제 역시 고민해보고 해결할 가능성이 생기기에 주의해야한다.
병렬성이란 두개 이상의 코어가 각각의 독립된 스레드의 작업을 동시에 처리함으로써, 실제로 여러 작업이 동시에 실행된다.
동시성이 논리적으로 동시에 실행되게 보이는 것이라면, 병렬성을 물리적인 실제로 동시에 실행되는 개념이다.
각각의 코어에서 독립된 스레드를 사용하므로, 고성능을 필요로 하는 딥러닝 및 머신 러닝등의 고성능 컴퓨팅에서 이상적이다.
그러나 데이터나 리소스를 사용시 무조건 동기화를 해야하므로, 서로 다른 코어사이의 동기화에 의한 오버헤드가 발생 할 수 있다.