[Operating System] Thread Pool, Fork-Join

권영태·2025년 4월 29일

Operating System

목록 보기
10/20

Thread Pool

동시성 프로그래밍에서 여러 작업을 안전하고 효율적으로 관리하는 핵심 기술 중 하나로, Thread Pool의 크기만큼 Thread를 미리 생성해 Pool에 보관하고 요청 시 Thread Pool에 보관된 Thread를 사용해 빠르게 처리하는 방식이다.

이점

Thread Pool을 사용하지 않고 요청 시 필요한 Thread를 그때그때 생성해서 사용 할 수 있다. 하지만 Thread를 생성할 때 시간이 더 걸리고, 요청이 끝나면 이 스레드를 버리는 문제와 동시에 실행되는 스레드 수에 제한을 두지 않는 문제들이 발생하게 된다. 이를 Thread Pool을 통해 해결할 수 있다.

  • Thread Pool은 Thread를 미리 생성 해놓기 때문에 새 스레드를 생성하는 방식보다 빠르다.
  • 동시에 존재할 수 있는 스레드 수(크기)를 제한할 수 있고 동적으로 조정할 수 있다.

Thread Pool의 크기 기준

  • Thread Pool의 크기를 너무 작게하면 더 많은 요청이 들어왔을 때 추가 스레드를 생성하는 오버헤드가 발생할 수있다.
  • Thread Pool의 크기를 너무 크게한다면 유휴 Thread의 숫자가 많아저 자원이 낭비된다.
  • 이는 동적으로 해결할 수 있지만 마지막 대책 중 하나로 생각하자.
  • 그래서 시스템의 CPU 수, 메모리 크기, 예상되는 동시 클라이언트 수 등을 잘 고려해 휴리스틱하게 결정하는 것이 좋다.

Fork-Join

메인 부모 Thread가 N개의 자식 Thread를 생성(fork())하고, 자식 Thread가 종료될 때 계산한 결과를 합치는(Join()) 모델을 말한다.

Sorted

Fork-Join 모델은 정렬 문제를 처리할 때 가장 안전하면서도 우수한 성능을 보인다.

  • 작업을 작은 조각으로 나누어 여러 Thread에 분배(fork())한 뒤 병렬로 처리하고 결과를 합치는(Join()) 방식을 통해 우수한 성능을 보인다.
  • fork() 과정에서 서로 다른 스레드가 같은 데이터를 동시 접근하지 못하게 해 안전성도 높다.
    • 즉, Race Condition이 일어나지 않는다.

특히 Quick Sort 또는 Merge Sort와 같은 분할-정복 기반 정렬에서 더 뛰어나다.

Fork-Join은 절대 충돌이 없을까???

기본적으로 작업을 잘 분리해 Race Condition을 방지하지만, 정렬 결과를 공통 배열에 합치는 것처럼 공유 리소스를 여러 스레드가 동시 수정하는 등의 특정 상황에서는 Race Condition이 일어날 수 있다.
이런 경우 Synchronized, Atomic 같은 추가 보호 매커니즘을 사용해서 공유 자원 접근을 제어해야 한다.

Thread Pool, Monitor, Fork-Join

3가지 기술들은 동시성 프로그래밍에서 여러 작업을 안전하고 효율적으로 관리하는 핵심 기술이다.

  • Thread Pool은 Thread를 Thread Pool의 크기만큼 미리 만들어서 요청을 빠르게 처리하고 리소스 고갈을 방지한다.
  • Monitor는 스레드 간 동기화를 통해 여러 Thread가 공유 데이터에 안전하게 접근하도록 한다.
  • Fork-Join은 작업 분할과 병렬 실행 기법으로 안전성과 성능을 높여서 작업을 처리한다.

학습하며 정리한 글이기 때문에 혼용된 표현 또는 잘못된 내용이 있을 수 있습니다.
만약, 발견하신 경우 댓글을 통해 알려주신다면 진심으로 감사드립니다.

profile
GitHub : https://github.com/dudxo

0개의 댓글