스레드를 사용하다 보면 은근 헷갈리게 사용하는 용어가 동시성과 병렬성이라는 개념인데 둘의 목적이 살짝 다르다.
동시성은 여러 작업들이 동시에 실행되는 것처럼 보이도록 하는 개념이다. 한 사람이 요리를 하면서 동시에 라디오도 듣고, 전화 통화도 한다. 사실 여러 작업을 동시에 하는 것 처럼 보이지만 매우 빠르게 작업을 전환하면서 진행하는 것이다. 동시성의 목적은 시스템의 자원을 효율적으로 사용하기 위한 것으로 일반적으로 Thread를 만들어서 동작 시키는 것은 동시성을 위한 행위이다.
반면 병렬성은 실제로 여러 작업들이 동시에 진행되는 것이다. 어떤 사람은 요리를 하고 어떤 사람은 라디오를 듣고 또 어떤 사람은 전화 통화를 한다. 병렬성의 목적은 여러 작업이 실제로 동시에 처리해서 작업 시간을 줄이는데 있다. 병렬성을 구현하기 위해는 Thread와 더불어 여러개의 CPU 코어가 필요하다.
병렬성의 종류
병렬성에는 크게 데이터 병렬성과 작업 병렬성이 있다.
데이터 병렬성이란 전체 데이터를 쪼개서 서브 데이터로 만들고 각각의 서브데이터를 여러개의 스레드에서 병렬로 처리하게 해서 작업을 빨리 끝내는 것을 말한다. parallelStream()을 이용해서 스트림을 구성하는 경우가 데이터 병렬성에 해당한다.
작업 병렬성이란 서로 다른 작업의 덩어리를 여러개로 쪼개서 병렬로 수행하는 방식이다. 이때 나눠진 각 작업은 다른 작업과는 독립적으로 수행되며 여러 프로세서나 코어가 동시에 처리한다. 이것의 대표적인 예로는 웹 서버를 들 수 있는데 각 클라이언트의 요청은 독립적인 작업으로 간주되서 병렬로 처리된다.
parallelStream을 이용한 데이터 병렬성
포크조인을 통한 병렬성 동작
이런 병렬성은 분할 정복을 이용하는 포크조인(Fork/Join) 프레임워크 기반으로 동작한다.