컴퓨터공학의 기초가 되는 cs지식을 되새기면서 이 후 있을 기술면접을 대비 하고자한다.
동시성(Concurrency)은 빠르게 전환하며 여러 작업을 수행하여 동시에 여러 작업이 실행되는 것처럼 보이는 것이다. 한 개의 코어에서도 여러 작업을 Concurrent하게 실행할 수 있고 작업 간에는 context switch가 일어난다.
"Concurrent 하다" : 여러작업을 수행하며 동시에 여러작업이 실행되는 것처럼 보이게 하다
Concurrent하게 실행되는 Task들은 운영체제의 스케줄링 정책에 의해 실행되며 서로 복잡하게 엉켜있다. 이들이 어떻게 엉켜있는지 생각하는 건 어려우니 동시에 실행된다고 생각하는 게 Concurrency 이다.
그렇기 때문에 Task가 동시에 수행될 때 생길 수 있는 문제점, 대표적으로 동기화 문제가 발생할 수 있다.
동기화 문제는 여러 작업이 동시에 공유된 자원에 접근하려 할 때 발생한다. 동시에라는 말 때문에 멀티코어에서만 발생할 것 같지만 한 코어에서 concurrent하게 동작하는 task 사이에서도 동기화 문제가 발생한다.
한 코어에서 실행되는 Task1과 Task2가 동시에 공유자원인 data에 접근하려 한다.
원래대로 라면 data에 1을 더하고 다시 1을 뺐으니 작업이 끝난 후 data에 100이 들어가 있어야 하지만 동기화 문제가 발생하면 data에 99나 101이 들어있을 수 있다.
Task1이 data에 100을 읽어 1을 더하고 있는 사이(1) Task2에서도 data를 읽어(1') 간다. 이 때는 아직 Task1이 data를 101로 업데이트 하기 전이기 때문에 Task2도 100이라는 값을 읽게 된다.
Task1은 data += 1을 실행(2)하고 data를 101로 업데이트(3) 한다. Task2는 data를 100으로 읽었으므로 100에서 1을 뺀(2') 99로 data 값을 업데이트(3') 한다. 동기화 문제가 발생하면 예상되는 결과와 다른 결과가 생길 수 있다.
이렇듯 Concurrent Task 사이에는 동기화 문제가 발생할 수 있기 때문에 이를 막기 위한 동기화 기법을 사용해주어야 한다.
병렬성(Parallelism)은 여러 코어에서 여러 작업을 동시에 수행하는 것이다. 코어가 하나밖에 없다면 병렬적으로 프로그램을 실행할 수 없다.
CPU는 single core의 성능을 올리는 데 한계를 느끼고 multi-core 체제로 넘어갔다. 여러 코어에서 여러 작업을 동시에 수행하면서 성능을 올리려 한 것입니다.
하나의 코어에서 하던 작업을 세 개의 코어에서 나누어 하니 이론적으로는 성능이 3배까지 좋아질 수 있다. 모든 작업을 병렬적으로 수행하기는 어려우니 3배의 성능 향상을 기대하긴 어렵지만 기존 보다는 성능이 향상될 것이다. 하지만 여러 작업을 동시에 수행하니 race condition 혹은 동기화 문제가 발생할 수 있다.
동시성와 병렬성은 혼동되기 쉬운 개념이다. 이름도 Concurrency(동시성)과 Parallelism(병렬성)으로 이름만 들었을 때는 이 둘의 차이를 구분하기 어렵다. Concurrency와 Parallelism의 특징을 정리하면 다음과 같다.
결론
concurrency를 이해하면 동기화를 이해하는 데 도움이 된다 또한 동기화에 대한 설명을 보다보면 Concurrent라는 단어를 자주 만나게 되는데 이는 Concurrent하게 동작하는 프로세스나 쓰레드가 동기화 문제를 일으키기 때문이다.
Concurrent access to shared data may result in data inconsistency.
//공유 데이터에 동시에 액세스하면 데이터 불일치가 발생할 수 있습니다.
Concurrent를 제대로 이해하지 못했을 때 이를 단순히 동시에 라고 해석한다면 문제가 생기게 된다. 그러나 이제는 빠르게 전환하며 실행되며 동시에 실행되는 것처럼 보이는 것이라 이해하고 이러한 종류로 실행되는 것들이 동기화 문제를 발생시킬 수 있다는 점을 파악할 수 있다.
References (참고 자료)