동시성의 개념
- Concurrency
- Multithreading
- Parallel processing
- Asynchronous programming
- Reactive programming
- Multithreading
위의 계층을 잘 파악하자. 동시성은 한 번에 여러 개의 작업을 하는 것을 말한다. Multithreading은 스레드를 여러 개 사용하는 것을 말하는 것이고 그 안에 병렬 프로세싱은 멀티 스레딩을 기반으로 여러 코어에서 스레드를 동시에 돌리게 하는 기술인 것이다. 비동기 프로그래밍도 마찬가지로 동시성을 이루는 여러 방법 중 하나인 것이다. 구체적으로는 Future (or promise)라는 컴퓨터 과학에서 나오는 개념을 가지고 현재 스레드를 블록킹하지 않으면서 작업을 해서 동시성을 이루는 것이다. Reactive programming은 state machine이 있을 때, 프로그램은 일련의 이벤트들에 state를 변경하면서 반응하는 것의 연속으로 볼 수 있다는 것인데, 이것이 concurrency를 강제하는 것은 아니라고 한다. 사실 나도 Reactive programming은 아직 제대로 이해하지 못했다.
비동기 프로그래밍
동시성, 멀티스레딩, 비동기 프로그래밍의 차이점 등을 헷갈려할텐데, 위의 설명으로 명확해졌길 바란다. 다음은 비동기 개념에 대해 직관적인 예시로 이해를 높여보자. 예시는 Microsoft Learn에서 가져왔다. 우선 우리가 아침밥 만드는 과정을 프로그래밍한다고 생각해보자. 간단하게 밥을 짓고, 계란 후라이를 만들고, 미역국 1인분을 끓인다고 해보자. 동기(synchronous)로 한다면 앞에 말한 과정을 하나씩 순서대로 하는거다. 밥 짓는데 30분 걸리면 30분 기다리고 그 다음에 계란 후라이를 하고 미역국을 끓이는 식이다. 하지만 우리 주변에 이렇게 행동하는 사람이 있다면 참 일머리 없다고 생각할 것이다. 당연히 밥을 안쳤으면 밥이 다 되는 동안 계란 후라이도 하고 얘도 익는데 시간이 걸리니 가능하면 바로 미역국을 위한 물도 올려놓을 것이다.
그렇다 이것이 바로 비동기이다. A라는 작업을 할 동안 꼭 기다려야 할 필요가 없는, 다 됐다고 알람이 오기 전까지는 다른 일을 해도 되는 경우에는 다른 일을 하는 것이 비동기이다. 여기서 또 주의깊게 볼만한 점은 비동기를 쓴다고 해서 멀티 스레딩일 필요는 전혀 없다는 것이다. 현실적으로도 저 정도의 아침 준비를 하는데 여러 명이 필요하겠는가? 오히려 동선이 겹치고 그러면 생산성이 떨어질 수도 있다. 그래서 지금 우리가 얘기하고 있는 상황은 싱글 스레드에 비동기를 적용한 사례인 것이다. 여기서 만약 분업을 해서 한 사람은 미역국만 만들고, 한 사람은 밥만 짓는 식으로 한다면 여러 개의 스레드를 사용해서 병렬 프로그래밍을 한 것으로 볼 수 있겠다.
사실 blocking(non-blocking)과 synchronous(asynchronous)의 조합으로 총 4가지 경우에 대한 이해가 있으면 좀 더 좋긴 한데, 이건 다음에 기회가 되면 얘기하자. 운영체제나 시스템 아키텍쳐 관련 주제를 보다보면 단골로 나오는 거 같다.
참고자료
https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/
https://learn.microsoft.com/en-us/dotnet/csharp/asynchronous-programming/async-scenarios
Stephen Cleary - Concurrency in C# Cookbook
'개발' 카테고리의 다른 글
RDB에서 카테고리 구현 (1) | 2024.01.26 |
---|---|
Weak Head Normal Form (WHNF) (0) | 2022.01.01 |
자바스크립트의 신기한 기능들 (0) | 2021.08.22 |
OpenCV에서 height, width (0) | 2019.12.01 |
About Mathematics Behind Large Margin Classification Quiz (0) | 2019.09.30 |
분할 정복을 이용한 n제곱 계산 (0) | 2019.08.07 |