동시성과 병렬성 (Concurrency vs Parallelism)
동시성(Concurrency) 과 병렬성(Parallelism)을 위키에서는 다음과 같이 정의한다.
Concurrent computing is a form of computing in which several computations are executed concurrently.
Parallel computing is a type of computation where many calculations or the execution of processes are carried out simultaneously.
- Concurrent computing 은 여러 계산이 동시에 실행되는 컴퓨팅의 한 형태이다.
- Parallel computing 은 많은 계산 또는 프로세스 실행이 동시에 수행되는 계산 유형이다.
동시성(Concurrency) | 병렬성(Parallelism) |
---|---|
여러 작업이 동시에 실행되고 있는 것처럼 구현되는 것 | 여러 작업이 실제로 동시에 실행되고 있는 것 |
싱글 코어 환경에서 단일 프로세스 내에 멀티 스레드를 동작하여 구현 | 멀티 코어 환경에서 멀티 프로세스(단일 스레드) 혹은 멀티 스레드를 활용하여 처리. |
싱글코어, 멀티코어 에서 가능 | 멀티코어에서만 가능 |
빠른 시간에 하나씩 많은 것을 처리 | 한번에 많은 것을 처리 |
논리적인 부분 (논리적인 개념) | 물리적인 부분 (물리적인 개념) |
예시) 커피 추출구가 하나인 커피머신이 아메리카노, 라떼, 마끼야또를 재료를 바꿔가면서 동시에 만들어지도록 구현. | 예시) 커피 추출구가 여러개인 커피머신이 동시에 각각의 재료를 통해 아메리카노, 라떼, 마끼야또를 만듬. |
동시성(Concurrency)이란?
동시성(Concurrency)은 빠르게 전환하며 여러 작업을 수행하여 동시에 여러 작업이 실행되는 것처럼 보이는 것이다.
한 개의 코어
에서도 여러 작업을 Concurrent하게 실행할 수 있고 작업 간에는 context switch가 일어난다.
- "Concurrent 하다" : 여러작업을 수행하며 동시에 여러작업이 실행되는 것처럼 보이게 하다
- Context Switch (문맥 교환)
- 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업
Concurrent하게 실행되는 작업(Task)들은 운영체제의 스케줄링 정책에 의해 실행되며 서로 복잡하게 엉켜있다. 이들이 어떻게 엉켜있는지 생각하는 건 어려우니 동시에 실행된다고 생각하는 게 Concurrency 이다.
- 그렇기 때문에 Task가 동시에 수행될 때 생길 수 있는 문제점 대표적으로
동기화 문제
가 발생할 수 있다.
동기화 문제는 Concurrent한 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을 실행하고 data를 101로 업데이트 한다.
- Task2는 data를 100으로 읽었으므로 100에서 1을 뺀 99로 data 값을 업데이트 한다.
- 그러나, 두 작업이 끝나고 나서 Task2에서의 data의 기댓값은 99이지만, 실제 값은 100 일 수 있다.
- 이런 문제를 동기화 문제라고 한다.
동기화 문제가 발생하면 예상되는 결과와 다른 결과가 생길 수 있다.
이렇듯 Concurrent Task 사이에는 동기화 문제가 발생할 수 있기 때문에 이를 막기 위한
동기화 기법
을 사용해주어야 한다.
병렬성(Parallelism)이란?
병렬성(Parallelism)은 여러 코어에서 여러 작업을 동시에 수행하는 것이다. 코어가 하나밖에 없다면 병렬적으로 프로그램을 실행할 수 없다.
- CPU는 single core의 성능을 올리는 데 한계를 느끼고 multi-core 체제로 넘어갔다.
- 여러 코어에서 여러 작업을 동시에 수행하면서 성능을 올리려 한 것이다.
하나의 코어에서 하던 작업을 세 개의 코어에서 나누어 하니 이론적으로는 성능이 3배까지 좋아질 수 있다. 모든 작업을 병렬적으로 수행하기는 어려우니 3배의 성능 향상을 기대하긴 어렵지만 기존 보다는 성능이 향상될 것이다. 하지만 여러 작업을 동시에 수행하니 race condition 혹은 동기화 문제
가 발생할 수 있다.
결론
concurrency를 이해하면 동기화를 이해하는 데 도움이 된다 또한 동기화에 대한 설명을 보다보면 Concurrent라는 단어를 자주 만나게 되는데 이는 Concurrent하게 동작하는 프로세스나 쓰레드가 동기화 문제를 일으키기 때문이다.
Concurrent access to shared data may result in data inconsistency.
//공유 데이터에 동시에 액세스하면 데이터 불일치가 발생할 수 있습니다.
Concurrent를 제대로 이해하지 못했을 때 이를 단순히 동시에 라고 해석한다면 문제가 생기게 된다. 그러나 이제는 빠르게 전환하며 실행되며 동시에 실행되는 것처럼 보이는 것이라 이해하고 이러한 종류로 실행되는 것들이 동기화 문제를 발생시킬 수 있다는 점을 파악할 수 있다.
실제로 병렬이라는 것은 어떤 것이 동시에 실행되는 것처럼 만드는게 아니라 실제로 동시에 실행되고 있어야만 한다.
- 따라서 그렇게 보이도록 만드는 것과 실제 그렇게 보이는 것은 같은 개념이라고 볼 수 있다.
병렬성은 동시성의 하위집합이다. 따라서 병렬성은 동시성을 구현했다고 볼 수 있다. 하지만 동시성은 병렬성과 같지 않다.
- 즉 병렬성, 동시성 둘 다는 Concurrent 하다고 볼 수 있지만, 동시성은 병렬성이 아니다.
| Concurrency and Parallelism Combinations
- 병렬이 아니면서 동시적일 수 있는가?
어플리케이션은 동시적일 수는 있지만 병렬일 수는 없다. 겉보기엔 둘 이상의 작업을 진행하지만 이거는 task를 전환하는 것을 의미한다. - 동시적이지 않으면서 병렬일 수 있는가?
어플리케이션은 병렬일 수는 있지만 동시적이진 않다. 한 번의 하나의 작업에서만 작동하는 경우를 의미한다. 이 작업은 병렬로 처리될 수 있는 하위 작업으로 나뉜다. - 동시성, 병렬성도 아닌 경우
한 번에 하나의 작업만 작동하고 작업이 병렬 실행을 위해 하위 작업으로 분해되지 않는 다는 것을 의미한다. 이런 경우는 소규모 단일 작업의 경우.
참조
'CS' 카테고리의 다른 글
동기-비동기, 블로킹-논블로킹 (0) | 2023.04.23 |
---|---|
Cookie vs Session vs JWT (With JWT 사용시 주의할 점) (0) | 2022.12.24 |