JAVA 요소 병렬 처리

김개발세발바닥·2024년 2월 27일

JAVA

목록 보기
1/12

요소 병렬 처리.

요소 병렬 처리란 멀티코어 CPU 환경에서 전체 요소를 분할해서 각각의 코어가 병렬적으로 처리하는 것.
요소 병렬 처리의 목적은 작업 처리 시간을 줄이는 것이다.

동시성과 병렬성

멀티 스레드는 동시성 또는 병렬성으로 실행된다.
동시성은 멀티 작업을 위해 멀티 스레드가 하나의 코어에서 번갈아 가며 실행한다.
병렬성은 멀티 작업을 위해 멀티 코어를 각각 이용해서 병렬로 실행한다.

동시성은 한 시점에 하나의 작업만 실행한다.
번갈아 작업을 실행하는 것이 빠르다보니 동시에 처리되는 것처럼 보일 뿐.
병렬성은 한 시점에 여러 개의 작업을 병렬로 실행하기 때문에 동시성보다는 좋은 성능을 낸다.

데이터 병렬성

데이터 병렬성은 전체 데이터를 분할해서 서브 데이터셋으로 만들고 이 서브 데이터셋을 병렬 처리해서 작업을 빨리 끝내는 것을 말한다. 자바 병렬 스트림은 데이터 병렬성을 구현한 것.

작업 병렬성

작업 병렬성은 서로 다른 작업을 병렬 처리하는 것을 말한다. 작업 병렬성의 대표적인 예시로는 서버 프로그램이다.
서버는 각각의 클라이언트에서 요청한 내용을 개별 스레드에서 병렬로 처리한다.

포크조인 프레임워크.

자바 병렬 스트림은 요소를 병렬 처리하기 위해 포크조인 프레임워크를 사용한다.
포크조인 프레임워크는 포크 단계에서 전체 요소들을 서브 요소셋으로 분할하고, 각각의 서브 요소셋을 멀티 코어에서 병렬로 처리한다.
조인 단계에서는 서브 결과를 결합해서 최종 결과를 만들어낸다.

병렬 처리 스트림은 포크 단계에서 요소를 순서대로 분할하지 않는다.
포크조인 프레임워크는 병렬 처리를 위해 스레드풀을 사용한다.
각각의 코어에서 서브 요소셋을 처리하는 것은 작업 스레드가 해야 하므로 스레드 관리가 필요하다.
포크조인 프레임워크는 ExecutorService의 구현 객체인 ForkJoinPool을 사용해서 작업 스레드를 관리한다.

병렬 처리 성능.

스트림 병렬 처리가 스트림 순차 처리보다 항상 실행 성능이 좋다고 판단하면 안된다.
병렬 처리에 영향을 미치는데는 3가지 요인이 존재한다.

요소의 수와 요소당 처리 시간

컬렉션에 전체 요소의 수가 적고 요소당 처리 시간이 짧으면 일반 스트림이 병렬 스트림보다 빠를 수 있다.
병렬 처리는 포크 및 조인 단계가 있고, 스레드 풀을 생성하는 추가적인 비용이 발생하기 때문이다.

스트림 소스의 종류

ArrayList와 배열은 인덱스로 요소를 관리하기 때문에 포크 단계에서 요소를 쉽게 분리할 수 있어 병렬 처리 시간이 절약되지만 HashSet, TreeSet은 요소 분리가 쉽지 않고 LinkedList 역시 링크를 따라가야 하므로 요소 분리가 쉽지 않다. 따라서 이 소스들은 상대적으로 병렬 처리가 늦다.

코어의 수

CPU 코어의 수가 많으면 많을수록 병렬 스트림의 성능은 좋아진다. 하지만 코어의 수가 적을 경우에는 일반 스트림이 더 빠를 수 있다.
병렬 스트림은 스레드 수가 증가하여 동시성이 많이 일어나므로 오히려 느려진다. 그리고 몇개의 쓰레드로 처리할지가 보장되지 않아서 일반적인 웹 프로그램에는 병렬 스트림을 사용하는걸 권장하지 않는다.

0개의 댓글