ForkJoinPool 알아보기 (part1)

searchortype·2023년 5월 21일
1
post-thumbnail

ForkJoinPool은 Java의 java.util.concurrent 패키지에 포함된 클래스로, 포크-조인 프레임워크(fork-join framework)를 지원하는 스레드 풀(thread pool) 구현체입니다. 포크-조인 프레임워크는 병렬 프로그래밍을 위한 디자인 패턴이며, 대규모 작업을 작은 작업들로 분할하고 이를 동시에 실행하여 병렬 처리를 가능하게 합니다.

fork-join pool은 자바 데이터 병렬처리에 대해서 높은 성능과 세분화된 실행(fine-grain task execution: 병렬처리가 가능하게 하는 세분화된 실행)을 가능하게 합니다. 병렬 컴퓨팅 엔진은 많은 higher-level framework에서 사용됩니다.

비동기 작업을 처리하는 paraellelStream과 completable Futures은 fork-join pool을 내부적으로 활용하여 작업을 처리합니다. kotlin과 scala도 fork-join pool을 활용한 대표적인 프레임워크로 알려져 있습니다.

Java Fork-Join Pool Computation Model

  • task를 쪼개서 subtask로 만들고
  • sub task들을 병렬로 처리합니다.
  • [multiple core] 이 subtask들은 다른 core에서 작업을 수행합니다. (이것은 os커널과 vm등 여러 실행환경에 따라 다릅니다/)
  • [single core] 만약 core가 하나라면, 모두 다른 thread를 타임 슬라이스와 같은 방식으로 동시에 실행합니다.
  • join() : 모든 작업이 끝나고 모든 thread의 작업이 끝나기를 기다립니다.
  • 모든 join들의 작업이 끝나면 result를 조합하고 합칩니다.

만약 task가 결과를 return하지 않으면 subtask작업이 끝날때까지 기다립니다.

fork-join pool은 분할정복 알고리즘으로 문제해결을 통해 병렬 프로그래밍을 지원합니다.

solve(problem)
if problem이 충분히 작으면
	문제를 바로 해결 (순차 알고리즘)
else 
	문제를 각각의 part로 나눈다
    (fork)  각 part를 해결하기 위해 새로운 subtask를 fork
    (join)  모든 subresult를 갖고 결과를 구성한다.

분할정복의 예로 collection stream을 들수 있습니다.


ref
https://www.youtube.com/watch?v=sJ97pduSygk&list=PLzUU0F4LPfLEBzdbyNVd6lMJNcx6aKdDz
https://en.wikipedia.org/wiki/Fork%E2%80%93join_model

0개의 댓글