25.01.14 TIL 병렬성

신성훈·2025년 1월 14일

TIL

목록 보기
118/162

1. 병렬성(Parallelism)이란?

병렬성(Parallelism)은 여러 작업을 동시에 실행하여 성능을 향상시키는 개념입니다.
멀티코어 프로세서나 분산 시스템을 활용해 작업을 분리하고 병렬적으로 처리함으로써 작업 시간을 단축할 수 있습니다.

병렬성과 동시성의 차이

  • 병렬성: 여러 작업을 진짜 동시에 실행
  • 동시성: 여러 작업을 번갈아가며 실행 꼭 동시에 실행되는 것은 아님

2. 병렬성의 작동 원리

  1. 멀티코어 프로세서

    • 하나의 CPU에 여러 코어가 있는 경우 각각의 코어에서 별도의 작업을 처리
  2. 스레드 분할

    • 하나의 프로그램을 여러 스레드로 나누어 각 스레드가 병렬적으로 실행
  3. 분산 처리

    • 여러 서버 또는 클러스터에 작업을 나누어 병렬로 처리

3. 병렬성 구현 방법 (Java 예시)

예제 1: Fork/Join Framework

Fork/Join Framework는 작업을 작은 단위로 나누고 여러 스레드에서 병렬적으로 처리합니다.

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;

class SumTask extends RecursiveTask<Long> {
    private final int[] numbers;
    private final int start, end;
    private static final int THRESHOLD = 10;

    public SumTask(int[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if (end - start <= THRESHOLD) {
            long sum = 0;
            for (int i = start; i < end; i++) {
                sum += numbers[i];
            }
            return sum;
        }

        int mid = (start + end) / 2;
        SumTask leftTask = new SumTask(numbers, start, mid);
        SumTask rightTask = new SumTask(numbers, mid, end);

        leftTask.fork();
        long rightResult = rightTask.compute();
        long leftResult = leftTask.join();

        return leftResult + rightResult;
    }
}

public class Main {
    public static void main(String[] args) {
        int[] numbers = new int[100];
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = i + 1;
        }

        ForkJoinPool pool = new ForkJoinPool();
        SumTask task = new SumTask(numbers, 0, numbers.length);

        long result = pool.invoke(task);
        System.out.println("Sum: " + result);
    }
}

출력 결과

Sum: 5050

4. 병렬성의 장점과 단점

장점

  1. 성능 향상: 작업을 나누어 동시에 처리하여 실행 시간을 단축
  2. 확장성: 멀티코어 및 분산 시스템에서 리소스를 효율적으로 활용
  3. 대규모 데이터 처리: 병렬 처리를 통해 대규모 데이터를 신속히 처리 가능

단점

  1. 복잡성 증가: 병렬 처리 구현 시 동기화, 경합 문제를 해결해야 함
  2. 오버헤드: 작업 분할과 통합에 따른 추가적인 비용 발생
  3. 디버깅 어려움: 병렬 코드의 디버깅과 테스트가 어렵고 예상치 못한 동작 발생 가능

5. 병렬성과 관련된 기술

  1. 멀티스레딩(Multithreading)

    • 여러 스레드를 병렬적으로 실행하여 작업 처리
    • Java의 Thread, ExecutorService 활용
  2. 분산 처리 프레임워크

    • Apache Hadoop, Apache Spark와 같은 도구를 통해 대규모 데이터를 분산 처리
  3. GPU 병렬 처리

    • CUDA, OpenCL 등을 활용해 GPU의 여러 코어에서 병렬 처리

6. 마무리

병렬 처리는 대규모 데이터를 효율적으로 처리하고 성능을 극대화할 수 있는 중요한 기술입니다.
Java에서 제공하는 병렬 처리 도구(Fork/Join Framework 등)를 사용하며 병렬 프로그래밍의 강력함과 함께 복잡성을 느낄 수 있었습니다.
병렬성 구현 시 성능과 정확성 간의 트레이드오프를 이해하고 적절한 동기화 및 설계를 통해 안정적인 병렬 처리를 구현해야 한다는 점을 배웠습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글