개요
grokking concurrency 책을 읽고 정리한 내용입니다.
https://product.kyobobook.co.kr/detail/S000214756541
그로킹 동시성 | 키릴 보브로프 - 교보문고
그로킹 동시성 | grokking concurrency! 복잡한 수식과 전문 용어를 몰라도 괜찮다! 읽기만 해도 동시성을 이해할 수 있다!동시성은 프로그램을 독립적으로 실행하도록 분리해 동시에 처리하는 방식이
product.kyobobook.co.kr
데이터 분해
동시성 프로그래밍 모델 중 데이터 분해는 서로 다른 여러 요소에 동일한 연산을 동시에 적용할 때 사용할 수 있습니다.
데이터 분해는 데이터를 chunk라는 여러 개의 단위로 나눈 다음 각 chunk에 대한 연산을 병렬로 실행한다.

이러한 데이터 분해 모델은 하드웨어 수준에서 이루어지는 경우가 많다고 합니다.
예를 들어 여러 코어에 데이터를 나누어 병렬로 작업을 수행하게 할 수 있습니다.
Map pattern
map pattern은 어떤 집합의 여러 요소에 동일한 연산을 적용할 때 사용합니다.
각 작업은 독립적이며 프로그램의 상태를 변화시키지 않습니다.
함수형 프로그래밍에서의 map 함수를 생각해보면 쉽게 이해할 수 있습니다.
다양한 프로그래밍 언어에서 map 함수를 지원하고 있는데 대부분 여러 입력 데이터를 출력 데이터로 변환만 하고 상태를 변경하지 않습니다.
이전에 함수형 프로그래밍을 정리할 때 순수 함수에 대해 언급하며 상태 변경의 의미에 대해 작성한 적이 있는데 아래 포스티을 참고하면 도움이 될 것 같습니다.
https://growth-coder.tistory.com/295
함수형 프로그래밍 개념 (불변성, 순수 함수, 참조 투명성, 1급 함수)
함수형 프로그래밍이란 데이터 처리를 수학적 함수 계산으롤 취급하고 불변성을 바탕으로 사이드 이펙트를 줄이려는 프로그래밍 패러다임이다. 함수형 프로그래밍에 대해 이해하기 위해서 다
growth-coder.tistory.com
javascript 기준으로 map 함수의 사용법을 알아봅시다.
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);
numbers 원본 배열의 값은 변경되지 않고 새로운 배열이 생성되었습니다.
이렇게 함수형 프로그래밍에서의 map 함수처럼 상태를 변경시키지 않으면서 입력 데이터를 출력 데이터로 변환하는 패턴이 map pattern입니다.

Fork/Join pattern
동시성 프로그래밍을 할 때 애플리케이션 동작 자체가 모두 독립적이면 상관 없지만 그렇지 않은 경우가 많습니다.
독립적으로 실행할 수 있는 부분과 순서를 맞춰야 하는 부분이 함께 존재하는 경우가 대부분입니다.
위에서 데이터 분해 모델에서 각 작업에 대한 결과를 모두 모아서 추가적인 작업을 해야 할 때가 그렇습니다.
이 경우 fork/join pattern을 활용할 수 있습니다.
fork 단계는 데이터를 여러 chunk로 나누는 단계로 수평 확장이 가능합니다.
그리고 각 chunk마다 병렬로 작업을 수행하게 되는데 이 모든 병렬 작업이 끝날 때까지 기다렸다가 결과를 모두 모으는 단계를 join 단계라고 합니다.
이 join 단계가 순서를 맞춰야 하는 동기화 지점입니다.

Map/Reduce pattern
map 단계는 모든 입력에 동일한 연산을 입력하여 결과를 얻는 단계로 위에서 알아본 map 패턴과 동일합니다.
reduce 단계는 데이터를 종합하는 단계입니다.
입력 데이터를 나누어 병렬 처리 하고 결과를 모은다는 점에서 fork/join 패턴과 유사합니다.
그런데 map단계와 reduce 단계에서 수행하는 작업은 fork 단계와 join 단계보다 조금 더 독립적입니다.
단일 컴퓨터를 넘어 여러 컴퓨터를 동원할 수도 있고 map 단계와 reduce 단계 중 하나가 없을 수도 있습니다.
빅데이터에서 주로 사용되는 개념인 것 같습니다.

