포스트

[멀티스레드] 비동기와 병렬

아침 식사 만들기

비동기와 병렬 작업은 우리가 생활에서 항상 실행하고 있습니다.

대표적인 예시로 아침 식사 만들기가 있습니다.

비동기 작업

집에서 아침밥을 먹을 때, 메뉴로 밥과 식은 국 그리고 냉장고에 보관된 반찬들이 있습니다.

아침밥을 준비하기 위한 일은 다음과 같고 번호는 작업 순서를 의미하지 않는다고 않습니다.

  1. 식탁에 수저를 놓습니다.
  2. 어젯밤 미리 꺼내뒀던 생선을 굽습니다.
  3. 차갑게 식은 국을 데웁니다.
  4. 냉장고에 있던 두부를 꺼내 데웁니다.
  5. 밥솥에서 밥을 떠 밥그릇에 담고 식탁에 놓습니다.
  6. 물 한잔을 따라 식탁 위에 놓습니다.

위와 같은 작업들을 동시에 처리하지 않고 하나의 작업 완료되면 그 다음 작업을 진행한다고 했을 때,

따뜻하게 데운 음식들이 차갑게 식은 식탁에 앉게 될 것입니다.

실제로는 아침밥을 차릴 때, 위와 같이 작업을 하나씩 진행하지 않습니다.

가스레인지의 왼쪽 화구에서 국을 데우고 오른쪽 화구에서는 두부를 데우고 위쪽 화구에서는 생선을 동시에 굽습니다.

그리고 반찬들이 데워지는 잠깐 사이, 식탁에 수저를 놓고, 밥그릇에 밥을 담고 수저를 놓습니다.

이러한 작업이 비동기 작업 이라고 할 수 있습니다.


병렬 작업

아침밥 준비를 통한 비동기 작업 설명에서 밥을 준비하는 사람은 1명 이였습니다.

스레드 1개가 작업하는 것과 같습니다.

그렇다면 멀티 스레드 를 사용하는 병렬 작업은 어떻게 아침밥을 준비해야 할까요?

준비하는 사람이 여러 명 이면 됩니다.

아침밥을 준비하는 6가지 작업을 위해 6명의 요리사가 준비하고 있다고 한다면

요리사 1명당 1개의 작업을 담당해 밥을 완성할 수 있고

혹은 가스 담당 요리사, 식탁 세팅 담당 요리사 등 역할별로 나누어 밥을 완성할 수 있습니다.


정리하면, 아침밥을 차릴 때 요리사(스레드)가 여러 명이면 병렬 작업 이고

아침밥 메뉴를 하나씩 차례대로가 아닌 동시에 여러 요리 를 하는 것이 비동기 작업입니다.

기대 효과

비동기 작업과 병렬 작업은 작업이 많거나 비동기로 처리 가능한 작업이 존재할 때는

동기적, 순차적 작업을 진행할 때 보다 효율적으로 작업을 완료할 수 있습니다.

그러나 문제는 항상 효율적이지 않습니다.

작업 전체가 순서를 반드시 지켜야 하는 작업의 경우, 동기/순차 진행과 비동기/병렬 진행의 효율 차이는 없을 수 있습니다.

따라서 비동기/병렬 작업을 진행하기 전 해당 작업에 비동기/병렬 진행이 필요한지 확인해야 합니다.

참고

C#의 비동기 프로그래밍

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.