Java 서버 관점에서의 프로세스와 스레드

코-드 텐카이·2024년 12월 18일

Spring Boot

목록 보기
1/10

1. 자바 서버와 프로세스, 스레드의 기본 이해

1.1 프로세스란?

자바 서버 애플리케이션은 JVM(Java Virtual Machine)에서 실행됩니다. 운영체제는 이 JVM을 하나의 독립된 프로세스로 인식하며, 프로세스는 실행 중인 프로그램의 독립적인 단위입니다.

특징:
    프로세스는 독립적인 메모리(Code, Heap, Stack)를 사용.
    다른 프로세스와 격리되어 동작하며, 하나의 프로세스가 중단되더라도 다른 프로세스에는 영향을 미치지 않음.
자바 서버의 예:
    Spring Boot 애플리케이션은 JVM에서 실행되며, 각 서버 인스턴스는 독립된 프로세스로 동작.

1.2 스레드란?

스레드는 프로세스 내부에서 실행되는 작업 단위로, 자바 서버의 요청 처리는 스레드 단위로 이루어집니다.
같은 프로세스 내에서는 여러 스레드가 메모리를 공유하며 병렬로 작업을 수행합니다.

특징:
    스레드는 가벼운 실행 단위로, 생성 및 전환 비용이 적음.
    메모리를 공유하기 때문에 협력 작업이 효율적이지만, 동기화 문제가 발생할 수 있음.
자바 서버의 예:
    Spring Boot 서버에서 각 HTTP 요청은 개별 스레드가 처리.

2. 자바 서버는 기본적으로 멀티스레딩 환경

자바 서버를 띄우는 순간부터 기본적으로 멀티스레딩 환경에서 동작합니다.
이는 서버가 클라이언트 요청을 병렬로 처리해야 하기 때문입니다.

2.1 멀티스레딩의 기본 구조

메인 스레드: 서버 실행을 담당하며, 클라이언트 요청을 대기 상태로 유지.
워커 스레드: 각 클라이언트 요청을 처리하며, 스레드 풀에서 관리.

2.2 스레드 풀(Thread Pool) 활용

자바 서버는 요청 처리 시 새로운 스레드를 생성하지 않고, 스레드 풀에서 관리하는 스레드를 재사용합니다.
Spring Boot는 기본적으로 내장된 Tomcat을 통해 스레드 풀을 구성합니다.

장점:
    스레드의 무분별한 생성을 방지해 성능과 안정성 확보.
    고정된 개수의 스레드를 사용하여 자원 낭비를 줄임.
설정 예시:

server.tomcat.max-threads=200
server.tomcat.min-spare-threads=10

    최대 200개의 요청을 동시에 처리 가능.
    

3. 멀티스레드 환경에서 주의할 점

멀티스레딩 환경에서는 요청을 병렬 처리하는 동시에, 여러 문제가 발생할 수 있습니다. 자바 서버 프로그래밍에서는 아래 문제를 주의해야 합니다.

3.1 Race Condition (경쟁 상태)

여러 스레드가 동시에 공유 자원에 접근하여 데이터 일관성이 깨질 수 있습니다.

예: 두 클라이언트가 동시에 은행 계좌에서 출금 요청을 처리하면, 잔고가 음수가 될 수 있음.
해결: synchronized 키워드를 사용해 공유 자원에 대한 동기화 처리.

3.2 Deadlock (교착 상태)

스레드가 서로의 자원을 기다리며 멈추는 상태.

해결:
    자원 접근 순서를 통일.
    tryLock을 사용해 일정 시간 안에 자원을 획득하지 못하면 작업을 중단.

3.3 OutOfMemoryError

스레드가 과도하게 생성되거나, 작업 후 자원이 반환되지 않을 경우 발생.

해결:
    스레드 풀 크기를 적절히 설정.
    비효율적인 작업 방식을 피하고 스트리밍 처리 도입.

마무리

자바 서버 프로그래밍에서 프로세스와 스레드는 서버의 성능과 안정성을 좌우하는 핵심 요소입니다. 프로세스는 서버의 독립성과 안정성을 보장하고,스레드는 요청을 효율적으로 처리하며 자원을 최대한 활용합니다.

멀티스레드 환경에서는 Race Condition, Deadlock, OutOfMemoryError 같은 문제가 발생할 수 있으므로, 이를 예방하는 설계가 필수입니다.

0개의 댓글