Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

멀티스레드와 스레드 풀 / 스레드와 프로세스의 차이

by Craft Fiend 2024. 5. 17.

프로세스(Process)

cpu에 의해 메모리에 올려져 실행중인 프로그램을 말하며, 자신만의 메모리 공간을 포함한 독립적인 실행 환경을 가지고 있다

프로그램 중 일부는 여러 프로세스간 상호작용을 하는 것일수도 있다

자바 JVM(Java Virtual Machine)은 주로 하나의 프로세스로 실행되며, 동시에 여러 작업을 수행하기 위해서 멀티 스레드를 지원하고 있다

스레드(thread)

프로세스 내에서 독립적으로 실행되는 흐름

프로세스 안에서 실질적으로 작업을 실행하는 단위

JVM(Java Virtual Machine)에 의해 관리됨

프로세스에는 적어도 한 개 이상의 스레드가 있다

Main 스레드 하나로 시작하여 스레드를 추가로 생성하면 멀티 스레드 환경이 된다

멀티스레딩 (Multithreading)

하나의 프로세스 내에서 여러 스레드를 동시에 실행하는 기술

장점

병렬 처리: 여러 작업을 동시에 수행하여 성능을 향상시킬 수 있음

자원 공유: 스레드는 동일한 메모리 공간을 공유하므로 자원 공유가 용이함

응답성 향상: 긴 작업을 백그라운드에서 처리하여 응답성을 높일 수 있다

단점

동기화 문제: 자원 공유 시 동기화 문제가 발생할 수 있다

디버깅 어려움: 멀티스레드 환경에서는 디버깅이 더 복잡해질 수 있다

스레드 풀 (Thread Pool)

스레드 풀은 미리 생성된 스레드들을 관리하고, 작업 요청이 들어오면 이 스레드들을 재사용하는 구조

스레드 풀이 있으면 스레드 생성과 소멸의 오버헤드를 줄이고, 성능을 최적화할 수 있다

장점

효율성: 스레드 생성과 소멸의 오버헤드를 줄여 효율성을 높인다

자원 관리: 일정 수의 스레드만 유지하여 시스템 자원을 효과적으로 관리한다

성능 향상: 스레드를 재사용하여 빠른 응답성을 제공한다

단점

설정 필요: 적절한 스레드 풀 크기를 설정해야 한다

복잡성: 스레드 풀이 잘못 구성되면 오히려 성능이 저하될 수 있다

스레드 (Thread)와 프로세스 (Process)의 차이

스레드와 프로세스는 모두 프로그램의 실행 단위를 나타내지만, 여러 차이점이 있다

정의

프로세스: 독립적으로 실행되는 프로그램의 인스턴스. 자체 메모리 공간을 갖고 운영 체제에 의해 관리된다

스레드: 프로세스 내에서 실행되는 작업 단위. 프로세스의 메모리와 자원을 공유한다

메모리 사용:

프로세스: 각각의 프로세스는 독립된 메모리 공간을 가진다

스레드: 동일한 프로세스 내의 스레드들은 메모리와 자원을 공유한다

상호작용:

프로세스: 프로세스 간의 상호작용은 IPC(Inter-Process Communication) 기법을 통해 이루어진다 (예: 파이프, 소켓, 공유 메모리)

스레드: 스레드 간의 상호작용은 프로세스 내에서 쉽게 이루어지며, 자원을 공유한다

생성 및 종료:

프로세스: 프로세스 생성과 종료는 상대적으로 오버헤드가 크다 (예: fork() 시스템 호출)

스레드: 스레드 생성과 종료는 비교적 가볍고 빠르다

자원 관리:

프로세스: 각 프로세스는 독립적인 자원을 관리한다

스레드: 스레드는 프로세스의 자원을 공유하므로, 동기화 문제가 발생할 수 있다

스레드 풀 사용 예제

javaCopy code
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 스레드 풀 생성
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 작업 정의
        Runnable task = () -> {
            System.out.println("Thread: " + Thread.currentThread().getName());
        };

        // 스레드 풀에 작업 제출
        for (int i = 0; i < 10; i++) {
            executor.execute(task);
        }

        // 스레드 풀 종료
        executor.shutdown();
    }
}

스레드와 프로세스의 차이 예제

javaCopy code
// 프로세스 예제 (자바 프로세스를 다른 자바 프로세스로 실행)
import java.io.IOException;

public class ProcessExample {
    public static void main(String[] args) throws IOException {
        // 새로운 프로세스 실행
        Process process = new ProcessBuilder("java", "-version").start();
    }
}

// 스레드 예제 (자바 스레드를 사용하여 작업 수행)
public class ThreadExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("Thread: " + Thread.currentThread().getName());
        });

        thread.start();
    }
}